diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index f1c181e..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-# Binaries for programs and plugins
-*.exe
-*.exe~
-*.dll
-*.so
-*.dylib
-
-# Test binary, build with `go test -c`
-*.test
-
-# Output of the go coverage tool, specifically when used with LiteIDE
-*.out
diff --git a/at-admin/Gopkg.lock b/at-admin/Gopkg.lock
new file mode 100644
index 0000000..b7e089a
--- /dev/null
+++ b/at-admin/Gopkg.lock
@@ -0,0 +1,184 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+ branch = "master"
+ digest = "1:b00422139b83c9de8d21ca2367e206b678bb9d59cc7f766f579a90e7438d64fb"
+ name = "github.com/afocus/captcha"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "1e99620393eade127dccb9dca8f5301d421fb63b"
+
+[[projects]]
+ digest = "1:320e7ead93de9fd2b0e59b50fd92a4d50c1f8ab455d96bc2eb083267453a9709"
+ name = "github.com/asaskevich/govalidator"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "ccb8e960c48f04d6935e72476ae4a51028f9e22f"
+ version = "v9"
+
+[[projects]]
+ digest = "1:2a4c84b05ae208ba738b7a90a0637738161193b7efd2f256b6422ff8c4e4148d"
+ name = "github.com/astaxie/beego"
+ packages = [
+ ".",
+ "config",
+ "context",
+ "context/param",
+ "grace",
+ "logs",
+ "session",
+ "toolbox",
+ "utils",
+ ]
+ pruneopts = "UT"
+ revision = "32ee728078c84c28f2642c70745afc8f6830044d"
+ version = "v1.12.0"
+
+[[projects]]
+ digest = "1:6f9339c912bbdda81302633ad7e99a28dfa5a639c864061f1929510a9a64aa74"
+ name = "github.com/dustin/go-humanize"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e"
+ version = "v1.0.0"
+
+[[projects]]
+ digest = "1:5f7b0c5ddd7f129e3a95b534b624b96aefd0487305af5828620a63a9dc94286f"
+ name = "github.com/go-ozzo/ozzo-validation"
+ packages = [
+ ".",
+ "is",
+ ]
+ pruneopts = "UT"
+ revision = "199b55b36bc1af151e6eea487cc92ffa5b460b81"
+ version = "v3.6.0"
+
+[[projects]]
+ digest = "1:ec6f9bf5e274c833c911923c9193867f3f18788c461f76f05f62bb1510e0ae65"
+ name = "github.com/go-sql-driver/mysql"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "72cd26f257d44c1114970e19afddcd812016007e"
+ version = "v1.4.1"
+
+[[projects]]
+ branch = "master"
+ digest = "1:7a6377256f670508711c56c25556d639e673c0fa0f519c5a758fdcbfc8af9ac8"
+ name = "github.com/golang/freetype"
+ packages = [
+ ".",
+ "raster",
+ "truetype",
+ ]
+ pruneopts = "UT"
+ revision = "e2365dfdc4a05e4b8299a783240d4a7d5a65d4e4"
+
+[[projects]]
+ branch = "master"
+ digest = "1:f14d1b50e0075fb00177f12a96dd7addf93d1e2883c25befd17285b779549795"
+ name = "github.com/gopherjs/gopherjs"
+ packages = ["js"]
+ pruneopts = "UT"
+ revision = "3e4dfb77656c424b6d1196a4d5fed0fcf63677cc"
+
+[[projects]]
+ digest = "1:4b63210654b1f2b664f74ec434a1bb1cb442b3d75742cc064a10808d1cca6361"
+ name = "github.com/jtolds/gls"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "b4936e06046bbecbb94cae9c18127ebe510a2cb9"
+ version = "v4.20"
+
+[[projects]]
+ branch = "master"
+ digest = "1:44fbfce27cb96b7d20217634af466093485a3e8132820acbe95949cb64e7fc60"
+ name = "github.com/shiena/ansicolor"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "a422bbe96644373c5753384a59d678f7d261ff10"
+
+[[projects]]
+ digest = "1:237af0cf68bac89e21af72e6cd6b64f388854895e75f82ad08c6c011e1a8286c"
+ name = "github.com/smartystreets/assertions"
+ packages = [
+ ".",
+ "internal/go-diff/diffmatchpatch",
+ "internal/go-render/render",
+ "internal/oglematchers",
+ ]
+ pruneopts = "UT"
+ revision = "f487f9de1cd36ebab28235b9373028812fb47cbd"
+ version = "1.10.1"
+
+[[projects]]
+ digest = "1:a3e081e593ee8e3b0a9af6a5dcac964c67a40c4f2034b5345b2ad78d05920728"
+ name = "github.com/smartystreets/goconvey"
+ packages = [
+ "convey",
+ "convey/gotest",
+ "convey/reporting",
+ ]
+ pruneopts = "UT"
+ revision = "9e8dc3f972df6c8fcc0375ef492c24d0bb204857"
+ version = "1.6.3"
+
+[[projects]]
+ branch = "master"
+ digest = "1:a61d25b070e45ebe7675ec0275599a93e2155c1f1adeaa6ef7e91c4b73e097be"
+ name = "github.com/snail007/go-activerecord"
+ packages = ["mysql"]
+ pruneopts = "UT"
+ revision = "ca85a7ad6611a7003e5bffc01091b5b8c85ed6c9"
+
+[[projects]]
+ digest = "1:a2057c5b6feb8feb081ce9987f0e4d0713c6b3a6d3824900e35750f349223a25"
+ name = "golang.org/x/crypto"
+ packages = [
+ "acme",
+ "acme/autocert",
+ ]
+ pruneopts = "UT"
+ revision = "c126467f60eb25f8f27e5a981f32a87e3965053f"
+
+[[projects]]
+ branch = "master"
+ digest = "1:6d674a768fd27ad126eb8357ebbc14cb5b000badd62d4b7cbe403abb231e099e"
+ name = "golang.org/x/image"
+ packages = [
+ "font",
+ "math/fixed",
+ ]
+ pruneopts = "UT"
+ revision = "cff245a6509b8c4de022d0d5b9037c503c5989d6"
+
+[[projects]]
+ digest = "1:c25289f43ac4a68d88b02245742347c94f1e108c534dda442188015ff80669b3"
+ name = "google.golang.org/appengine"
+ packages = ["cloudsql"]
+ pruneopts = "UT"
+ revision = "b2f4a3cf3c67576a2ee09e1fe62656a5086ce880"
+ version = "v1.6.1"
+
+[[projects]]
+ digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202"
+ name = "gopkg.in/yaml.v2"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183"
+ version = "v2.2.1"
+
+[solve-meta]
+ analyzer-name = "dep"
+ analyzer-version = 1
+ input-imports = [
+ "github.com/afocus/captcha",
+ "github.com/astaxie/beego",
+ "github.com/dustin/go-humanize",
+ "github.com/go-ozzo/ozzo-validation",
+ "github.com/go-ozzo/ozzo-validation/is",
+ "github.com/smartystreets/goconvey/convey",
+ "github.com/snail007/go-activerecord/mysql",
+ ]
+ solver-name = "gps-cdcl"
+ solver-version = 1
diff --git a/at-admin/Gopkg.toml b/at-admin/Gopkg.toml
new file mode 100644
index 0000000..07ae903
--- /dev/null
+++ b/at-admin/Gopkg.toml
@@ -0,0 +1,54 @@
+# Gopkg.toml example
+#
+# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
+# for detailed Gopkg.toml documentation.
+#
+# required = ["github.com/user/thing/cmd/thing"]
+# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
+#
+# [[constraint]]
+# name = "github.com/user/project"
+# version = "1.0.0"
+#
+# [[constraint]]
+# name = "github.com/user/project2"
+# branch = "dev"
+# source = "github.com/myfork/project2"
+#
+# [[override]]
+# name = "github.com/x/y"
+# version = "2.4.0"
+#
+# [prune]
+# non-go = false
+# go-tests = true
+# unused-packages = true
+
+
+[[constraint]]
+ branch = "master"
+ name = "github.com/afocus/captcha"
+
+[[constraint]]
+ name = "github.com/astaxie/beego"
+ version = "1.12.0"
+
+[[constraint]]
+ name = "github.com/dustin/go-humanize"
+ version = "1.0.0"
+
+[[constraint]]
+ name = "github.com/go-ozzo/ozzo-validation"
+ version = "3.6.0"
+
+[[constraint]]
+ name = "github.com/smartystreets/goconvey"
+ version = "1.6.3"
+
+[[constraint]]
+ branch = "master"
+ name = "github.com/snail007/go-activerecord"
+
+[prune]
+ go-tests = true
+ unused-packages = true
diff --git a/at-admin/LICENSE b/at-admin/LICENSE
new file mode 100755
index 0000000..352c004
--- /dev/null
+++ b/at-admin/LICENSE
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., [http://fsf.org/]
+ 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.
+
+ 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 Lesser 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.
+
+ GNU GENERAL PUBLIC LICENSE
+ 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.
+
+ {description}
+ Copyright (C) 2017 狂奔的蜗牛.
+
+ 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-1301 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 Lesser General
+Public License instead of this License.
\ No newline at end of file
diff --git a/at-admin/README.md b/at-admin/README.md
new file mode 100755
index 0000000..1e578b2
--- /dev/null
+++ b/at-admin/README.md
@@ -0,0 +1,2 @@
+#Unified Maintenance System
+Unified maintenance system
diff --git a/at-admin/app/controllers/base.go b/at-admin/app/controllers/base.go
new file mode 100644
index 0000000..700587f
--- /dev/null
+++ b/at-admin/app/controllers/base.go
@@ -0,0 +1,202 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/utils"
+ "encoding/json"
+ "strings"
+
+ "github.com/astaxie/beego"
+)
+
+type BaseController struct {
+ beego.Controller
+}
+
+//验证登录
+func (this *BaseController) isLogin() bool {
+ passport := beego.AppConfig.String("author.passport")
+ //fmt.Println(passport)
+ cookie := this.Ctx.GetCookie(passport)
+ //cookie 失效
+ if cookie == "" {
+ //fmt.Println("cookie 失效")
+ return false
+ }
+ user := this.GetSession("author")
+ //fmt.Println(user)
+ //session 失效
+ if user == nil {
+ //fmt.Println("session 失效")
+ return false
+ }
+ encrypt := new(utils.Encrypt)
+ cookieValue, _ := encrypt.Base64Decode(cookie)
+ //fmt.Println("get cookie " + cookie)
+ identifyList := strings.Split(cookieValue, "@")
+ //fmt.Println(cookieValue, identifyList)
+ if cookieValue == "" || len(identifyList) != 2 {
+ //fmt.Println("cookieValue 无效")
+ return false
+ }
+ name := identifyList[0]
+ identify := identifyList[1]
+ userValue := user.(map[string]string)
+
+ //对比cookie 和 session name
+ if name != userValue["username"] {
+ //fmt.Println("对比cookie 和 session name 无效")
+ //fmt.Println(userValue)
+ return false
+ }
+ //对比客户端UAG and IP
+ if identify != utils.NewEncrypt().Md5Encode(this.Ctx.Request.UserAgent()+this.getClientIp()+userValue["password"]) {
+ //fmt.Println("对比客户端UAG and IP 无效")
+ return false
+ }
+ //success
+ return true
+}
+func (this *BaseController) viewLayoutTitle(title, viewName, layout string) {
+ this.ViewLayoutTitle("", title, viewName, layout)
+}
+func (this *BaseController) viewLayout(viewName, layout string) {
+ this.ViewLayout("", viewName, layout)
+}
+func (this *BaseController) view(viewName string) {
+ this.View("", viewName)
+}
+func (this *BaseController) viewTitle(title, viewName string) {
+ this.ViewTitle("", title, viewName)
+}
+func (this *BaseController) ViewLayoutTitle(module, title, viewName, layout string) {
+ if module != "" {
+ this.Layout = "layout/modules/" + module + "/" + layout + ".html"
+ this.TplName = "modules/" + module + "/" + viewName + ".html"
+ } else {
+ this.Layout = "layout/" + layout + ".html"
+ this.TplName = viewName + ".html"
+ }
+ this.Data["title"] = title
+ this.Render()
+}
+func (this *BaseController) ViewLayout(module, viewName, layout string) {
+ if module != "" {
+ this.Layout = "layout/modules/" + module + "/" + layout + ".html"
+ this.TplName = "modules/" + module + "/" + viewName + ".html"
+ } else {
+ this.Layout = "layout/" + layout + ".html"
+ this.TplName = viewName + ".html"
+ }
+ this.Data["title"] = ""
+ this.Render()
+}
+func (this *BaseController) View(module, viewName string) {
+ if module != "" {
+ this.Layout = "layout/modules/" + module + "/default.html"
+ this.TplName = "modules/" + module + "/" + viewName + ".html"
+ } else {
+ this.Layout = "layout/default.html"
+ this.TplName = viewName + ".html"
+ }
+ this.Data["title"] = ""
+ this.Render()
+}
+func (this *BaseController) ViewTitle(module, title, viewName string) {
+ if module != "" {
+ this.Layout = "layout/modules/" + module + "/default.html"
+ this.TplName = "modules/" + module + "/" + viewName + ".html"
+ } else {
+ this.Layout = "layout/default.html"
+ this.TplName = viewName + ".html"
+ }
+ this.Data["title"] = title
+ this.Render()
+}
+func (this *BaseController) ViewError(errorMessage string, data ...interface{}) {
+ this.viewError(errorMessage, data...)
+}
+func (this *BaseController) viewError(errorMessage string, data ...interface{}) {
+ this.Layout = "layout/default.html"
+ errorType := "500"
+ if len(data) > 0 {
+ errorType = data[0].(string)
+ }
+ this.TplName = "error/" + errorType + ".html"
+ this.Data["title"] = "system error"
+ this.Data["errorMessage"] = errorMessage
+ this.Render()
+}
+func (this *BaseController) JsonSuccess(message interface{}, data ...interface{}) {
+ this.jsonSuccess(message, data...)
+}
+
+func (this *BaseController) jsonSuccess(message interface{}, data ...interface{}) {
+ url := ""
+ sleep := 500
+ var _data interface{}
+ if len(data) > 0 {
+ _data = data[0]
+ }
+ if len(data) > 1 {
+ url = data[1].(string)
+ }
+ if len(data) > 2 {
+ sleep = data[2].(int)
+ }
+
+ this.Data["json"] = JSONResponse{
+ Code: 1,
+ Message: message,
+ Data: _data,
+ Redirect: map[string]interface{}{
+ "url": url,
+ "sleep": sleep,
+ },
+ }
+ //this.ServeJSON()
+ j, err := json.MarshalIndent(this.Data["json"], "", "\t")
+ if err != nil {
+ this.Abort(err.Error())
+ } else {
+ this.Abort(string(j))
+ }
+
+}
+func (this *BaseController) JsonError(message interface{}, data ...interface{}) {
+ this.jsonError(message, data...)
+}
+func (this *BaseController) jsonError(message interface{}, data ...interface{}) {
+ url := ""
+ sleep := 500
+ var _data interface{}
+ if len(data) > 0 {
+ _data = data[0]
+ }
+ if len(data) > 1 {
+ url = data[1].(string)
+ }
+ if len(data) > 2 {
+ sleep = data[2].(int)
+ }
+ this.Data["json"] = JSONResponse{
+ Code: 0,
+ Message: message,
+ Data: _data,
+ Redirect: map[string]interface{}{
+ "url": url,
+ "sleep": sleep,
+ },
+ }
+ j, err := json.MarshalIndent(this.Data["json"], "", " \t")
+ if err != nil {
+ this.Abort(err.Error())
+ } else {
+ this.Abort(string(j))
+ }
+}
+
+//获取用户IP地址
+func (this *BaseController) getClientIp() string {
+ s := strings.Split(this.Ctx.Request.RemoteAddr, ":")
+ return s[0]
+}
diff --git a/at-admin/app/controllers/base_admin.go b/at-admin/app/controllers/base_admin.go
new file mode 100644
index 0000000..b733b64
--- /dev/null
+++ b/at-admin/app/controllers/base_admin.go
@@ -0,0 +1,66 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/models"
+ "strings"
+ "time"
+)
+
+type JSONResponse struct {
+ Code int `json:"code"`
+ Message interface{} `json:"message"`
+ Data interface{} `json:"data"`
+ Redirect map[string]interface{} `json:"redirect"`
+}
+type BaseAdminController struct {
+ BaseController
+ loginUser map[string]string
+}
+
+func (this *BaseAdminController) Prepare() {
+ if !this.isLogin() {
+ this.Redirect("/login/index.html", 302)
+ this.StopRun()
+ }
+ user := this.GetSession("author").(map[string]string)
+ this.Data["loginUser"] = user
+ this.loginUser = user
+ this.checkAccess()
+ this.Data["TimeNowYear"] = time.Now().Format("2006")
+ this.Layout = "layout/default.html"
+}
+func (this *BaseAdminController) checkAccess() {
+ controllerName, actionName := this.GetControllerAndAction()
+ controllerName = strings.ToLower(controllerName[0 : len(controllerName)-10])
+ actionName = strings.ToLower(actionName)
+ if (controllerName == "main" && actionName == "index") || controllerName == "main" && actionName == "default" {
+ return
+ }
+ //检查权限
+ if "1" != this.loginUser["user_id"] {
+ privilege := models.Privilege{}
+ _, _, controllers, err := privilege.GetTypedPrivileges(this.loginUser["user_id"], "-1")
+ if err != nil {
+ this.jsonError(err.Error(), "")
+ }
+ found := false
+ for _, c := range controllers {
+ action := strings.ToLower(c["action"])
+ if strings.Contains(action, ".") {
+ action = action[:strings.LastIndex(action, ".")]
+ }
+ if controllerName == strings.ToLower(c["controller"]) && actionName == action {
+ found = true
+ break
+ }
+ }
+ if !found {
+ if this.IsAjax() {
+ this.jsonError("您无权限进行此操作")
+ } else {
+ this.viewError("您无权限进行此操作")
+ }
+
+ }
+ }
+}
diff --git a/at-admin/app/controllers/data.go b/at-admin/app/controllers/data.go
new file mode 100644
index 0000000..4a04a72
--- /dev/null
+++ b/at-admin/app/controllers/data.go
@@ -0,0 +1,2 @@
+package controllers
+var fontData="1151111s1r11212re6u0eNzp4Fr11Fjv111fb5m5eag10ver11uy811112C8a5Mw-QVFav14wzJ115HOeSusrWsYUoD11CUT111e05HaaDv4iilN111wh11125MtaGNGwkId6J111mv1112vsQeud8fGbsa112nD1116X7uPgf4vUt4G112Nb1112vYzmRrvl_2e0111QSr111iyhR2RkrWFegT119p91110IAmclZ116v1011iAQ111122Rk8WEsu5bgJ11YCr11Tsdj7ePn51l0UJ112Aa112nV7cWgdwUP-4R1112f11114hTj7sc8e1d5r111hr1111Qj7SDn406Ghl1119X111eo7HKgA56nX5l113dh1115w2PgfcJ31l6mJ111kv1111vkE6PhkEcrFN11GFO1110vZ2KlZw-NJ3K11iAl111132JlEsJReupZv11z4v111ll1151111683R-ZKOZfJNNMr1g31111111Iih6yJ11114pcwrG_aFMvekJ3u51111011911r1111111r113u8MUJ116KkMwtDQ6K111r11111111111111111125O11r1125O3ur1y18Q12r131211r12c1114u1p611i11v141BN2Q11611v6EvaF11120rdj2wi111yv1pN3mvT91JN81vi41v9321111Tm1111w11111111112uaG1v15119tO32EkMUJ113u53sq1110N1111126575v1113111vr1191111111NN1110Q1112CJ2X1Aa1m1j-1316z12Q2Y11QJaN15O47J5l1LX1lvoL1895tr1K1Mv1i19Z1ig4sr2K1bX1zJrg16r5Xv1M1CT1Rvwx1pr5Xv3q2y91i1wx18X5Xv2K2y91evwx18g5Xv2J1Er1PJ0Q16544r1w22a1gJiu14T5ir1D2Zi1kvfj19i63J3_2u91dvf71ol5_J3i2uO1IrsJ15N70r3g26N1qJsq16X5XJ4d27v1hrlr1817g12B2Ei1m1rU17r81J2u2rl1mrdi19a6l12D2na1EJaF1059ar3o2lT1e1as12D6z1251Ji1O1eE1o541J3J2pg1Hva5_MD5lJ3s22v1iJq_10Q5812Y2oi1hJex16l55r2o24N1yvqb1053tv3F1FI_Bveq1pi3ir3L2zl1nrrJ18J5ur2u25l1mJrY14J4A13o1-a1prt61555pr2P1-r1tvsC15J5Lr1M23I__1ey18T3Bv171SN2groL11g5G12Q2mT1vJfj19i5Dv2j2tN1z1hv18O7gJ2D2na1EJrg1595712322v1rvrg1595712322v1rvrl17Q5gv2f2791sJex16l5gv2f1zX1g19-12Q3tKMG1zB_cvrJ18J5ur2w24a1aJrS16i5ur2w24a1aJrY17D5pr2P23Q1krrY17D5Hv1F1Dg1e1wN18D7dr1W2er1mrih1ol6zr281XJ1ovhm16O7fr2j2H11wreF1ua5lJ4m22a1gJxG13X7gJ2w2I91QJtg14144r1w1JD19Jad19a5pr1d2291LrfV13D8e12Y2rg10rdh1615uJ2W1Cv1p1nL1558qJ2424a1urrH14r2CJ2X1Mv1i1wl1494jK-h2ta1nJhk1795RJ1w20N15JsR1o93h1112mT1vJfj19i7gJ2D3gD1vvlP15D4x11O2H11rJiE15l40v2T1f51wr6H14Q4A11J2ll1t1uF__J66r1m2RD17vwx_Mi44r2U1JD1jvs615O6tJ272ig1yv8-19N3h12e1DO1arRL10i6Av342tN1z1fj19i5_J3i2tN1z1eb15O5fJ2o26N1qJeb15O7gJ2D2Ei1m1hz18r6Cr3k2na1EJfW10O3tv3F28i1JveF1pT5lJ5d28i1SreF1wJ5lJ5828i2kveF1u95lJ5U28i281eT_ZN2Db-Y2gJ1cvtW13O6z12525X1nviN1al6HK_a2291Lras12D5pv2Q25l1l1tg1416ur7q2wa2braS1hX6ur3x2wa1TvaS1p95pK_N1Mv1rJus17N8Vv3P2f11wJr_14T5fJ2o2gJ1crtW13Q5Dv2j22J1jrwq16T5Dv2Y2u91hJrY17D8Iv222WO1gvus17N62t_m1bX1zJfj19i5711F2mT1vJrg14i6Hv3Z2U91hJf7_Mr5_J492791sJw_19J5gv2f27v1hr9H1pX5j12W1Bl1IveT17a4pr3L2E11nJrJ18J7g12B2411b1hz18r5ur2u2rl1mrtg19O62J2S1Mv1xJdi19a4Cr1Y2f11m1t61556l12D2eD1rrfW10O5pr2P2na1EJrY17D6z12525X1nvdi15r5wv2V2yX1Pvhz18r67J2k25i1iJrS15D4BJ3l24a1wrt61555B12G2rw_Zryh18v5uJ443gi1h1Q415O5tv3F2tv1yr6H14Q3Yv1C2Y11wvtY12r5lJ8e2mT1vJrg14i5Dv2j22J1jrwq16T5812Y2tN1z1ex16l5_J3i2791sJw_19J5gv2f2f11wJr_14T6l12t24N1yvsJ15N5tJ1V2xa1E1qb10570b_m20__M1eb15O3tKM326N1qJ9-_VX5fJ2o1zB_vreb15O3tv1J2s91fviV_Nv5XJ4d2691TJeq18D5j12W1z51Ivhv18O5i12N2E11nJrJ18J7gJ2D24a1wrhz18r5ur2u2rl1mrtg14O6z1361-a1prsJ13T4Hr222na1EJrY16T6Cr3k23Q1krfW10O5pr2P2na1EJrY17D9ar3o2fQ1w1as12D5pK_N1HO26Jik1sl47J6f2252yvfj19i571233o91ovhz16i5ur1S1bX1zJce19O6nr2i3651xJsC15J9ar3o2fQ1w1as12D5pK_N2yo_hvhh16r5hr1M2wa1TvaS1p96ur3x2wa1TveF18Q6Av342W11zvbm1ii74r1O2Ji1fJku13D8Jv221zB_QJfj19i63J3_2tN1z1di15r70r3g26N1qJwz1ug6c11r2H11l1hv18O6JJ2d2Ei1m1m517Q5pv2Q2bT1nJsJ18r66r1m2lT1e1sQ15g5fJ2o2ea18re414i4BJ3l2411b1rY15T5Or2K1-r1tvrl17Q5i12N2y91tr9-1oi5av2B1-r1tvtQ14X5812Y24a1wrrS12N5812Y23Q1qvqC1315IJ212ca1y19-_Xg5pr2p24a1wrrY15T76r1X2tN1z1ku13T5Bv3A2u91dvdi19a5fJ2o26N1qJsq16X9111h2M51i1k713T65r3c2ea18rfd18O6Av342ug1EJao1oN5Bv3A2xa1dvw_19J7X11n2iN1rvfB1956-J322e51TrfY12Q8512J2xa1E1hz18r8e12Y23T1h1wq16T6l12D2ea18rak16O6Gv252z11nJwJ17Q8r12z2Vv1gJga13g9Ev3k2ug1EJaN16v03J2e2rl17vrg14i5ur2i21v1vJt419g5Kv1c2791sJsA1594c12U2ev1gJag17i4N1322qD18vfv13J5nv2o2oO1eraP1ur5eJ2Z22J1jrt61555pK_N2RO1srqC14D5NJ3H25a1qJgP17O7d12I2tv15rhw1914BJ3122O1k1lX16r53J1x2791sJeB_BD4JJ3722O1wJtW13Q3tv3F1zB_cviV_-X88v1n2z51drqb_BD4N13223I__1wF19Q5Bv3A1Ni1cvlr15i0rv2B2n12k1aQ1g96016H2qr2n1aQ1dg5Cr1X2DO1rJ9-1pN0a11Y2jK_VrdI1RX6UJ0-2jK_VrdI1RX6U__Y21110rdi19a4Cr1Y2f11m1t61553tv3F2tv1h1rk18Q5q13d2451zJaC15r5tJ2P2ml161rf13D66J2Q2el1h1ey18D62v1i2v91dvaC18l6kr2g2uQ1mJyN18O57J232p1161eq14Q5L11_2yJ1oJs31715ir2y2xQ1wvj215X6pJ1h2nl1bJrk18N5lJ232VX1eve711J5tJ2P2hi18JrH19N57J232og1hvyA14a4Pv1S29a1evku1217Y12y2gi18Jey18D5av1C2tg1fvrH19N5-12Q25v1Wvrk1595Vr3e24N1krrc19a5T11C2wQ1mJyA14a5cr2723l1U1y-15J71v2j2dT1fvsP16v4K12B2bg1yJe716v5Pv2E2p1161a318l5kr2H2H91lrwO13N5av1Z2og1oJwX17r5tJ2P2wQ1mJyA14a6kr2g2691uJj81455-12Q25v1WvrH19N5-12q24N1krqA13N6yr2Z2dD1d1yA14a50J3T27D1iJg316T6jv2n28l1jvsP16v5Ar2Z1BJ1nJwX18a5T11a2691uJqX14N5B11K2i51wvj81454Pv1S2691uJwX17r5-12Q2tv1h1wX17r5-12Q2tv1h1ml14Q57J2324N1krr_17D5tJ2P24N1kryA14a4Pv1S1Bg1uryA14a5Vb_e2dT1fvsP16v6kr2g2dD1d1sP16v6kr2g2dD1ira318l61v2Z2r91mJa318l5av1Z1BJ1nJeq14l5-12Q2tv1h1wX17r57J2322O1rvrk15957J232yQ1QrwY_M55tJ2P24N1krr_17D5tJ2P24N1krqv14Q5T11C2p11yrqv14Q6yr2Z2wR_ZryA1154Pv1S1Bg1uryA14a4Pv1S2Fa1yrq615g50J3T1BX1w1y-15J4Kv2i1BX1w1y-_Ci6jv2n2dT1fvsU16X6jv2v2dD1d1sP16v6kr2g33Q1kre716v5ev2g25g1d1qA17g5Pv2E2og1hvqA17g5T11a2p1161qv13i61v2Z2r91mJa318l61v2Z2r91mJa318l85v2H2691uJqA13N5Pv1K2og1oJj81455-12Q2SJ1yrsP14585v2H2H91lrlq1855av1Z2og1hvqv12r6Ar2y2rI-nJww11g6H_Si2r4MGrwk_WJ6lr2r2xa1mren_EN6av1S2yi1I1tw_V18512H2E4MFrhx_QT5p_AA2J91mra7_WT6xJ1P2f8-DJfW_ll6i_X536o-61fo15r66t-n2gO151fh15X6Ar2y2mQ1wvfh15X6Ar2y2mQ1wvxG_xa5Dv2j2r4MGra1_lQ61tZ02r4MGren_EN5fKCK26B-kJen_EN6H_Si2E4MFrhx_QT7gKCp2Eo-qvhx_QT7gKCp2Eo-qvfW_ll6CbZ82nfMHJfW_ll66t-n23O1h1aa_CX6Ar2y2mQ1wvfh19i5DJ172ui12vww11g5DJ172lbMw1f8_aJ61tZ02r4MGra1_lQ61tZ02r4MGrsH1616lr2r2f51a1sH16170r2S2xf_CJen_EN5fKCK26B-kJeb15O5fKCK3r91w1sq14a5XJ3O1Mt_T1eT17a5jt-v27z_T1eT_ZN7gtZu2E4MFrhv_lD7g12B2Eo-qvhx_QT7gKCp3gZ-j1a7_WT62KCj2rk-dvdo13D6xJ1P2gJ1crdo13D6lbBw2f8-DJsH_Pi6CbZ82nfMHJfW_ll6CbZ82nfMHJfW_ll9aKXa2ew_Rvdo1216xJ1r2gO151fh15X6Gr182GN12JfR11l7Uv182Ur12JmF11l6Ar2y2rI-nJwL1og7dJ2x2r4MGrdo12170r2S2Eo-qven_EN5XJ3O2mQ10rlr1857gtZu2li1svhx_QT8e12Y23KMPvfV18O6lbBw2ew_Rvak16O6GJ252dr1evnL1595fKCK2ew_Rva1_lQ7Fr1I2yX1Pvww16T6xJ1P26B-kJen_EN6av1S31117rbe1417Hv1U2e51Tras12D6Sv2B2mQ1wvwd10O63KCB2yX1PvgW16T61tZ02L118vwt1596-J322bO1vrar1p96Vr1h2H11lrgW18a7gKCp2Dr1jrrI_kg5DJ172f8-DJaa12O67J2k2lO1e1gJ18O5N12Y2D11gJnT17i7611E30T1EJwd10O6t12g3rO1ara812T8Iv222mQ1wvxG13X7gKCp36o-61cq_cr9aKXa2ew_Rvdi19a6lbBw2y51tryj10X5Xr3Q2y51brwc13N5Xr2_2y51zrwc15g5Xr2B2y51lrwc14D5Xr442y51Y1wc18D5Xr1K2y51bJwc19D5Xr272y51nJwc1855Xv1M2y91AJwx1pr5Xv3q2y91i1wx18X5Xv2K2y91evwx18g5Xv2J1SJ1d1ul14N4f12F1SJ1jvul18O4f12d1SJ1fvul16v4f13W1SJ1Q1ul1o54f11R1SJ1lJul17i4f12O1SJ1svul16X8Iv3u2VX1eJj81795tJ1V59l1fvMF17Nej11145T1svCq11reAJ4o6Kg1126x111enr1p4j918H9712Nq7r2g5wl1j2gM12ldLv2Z4B91ac6l1355SJ291Av161dL14a6bJ2l2qD1iJqL18Q5Iv2l2ia1svwt18N57r2922Q1q1rh15v57r2922Q1q1rh15v57r292Gl1q1rh15v57r2922Q1q1r_1715tJ2v24N1g1r_1715tJ2v1Er1Y1pE_Xa111eohr522vOq03121rTr56Xk1fb8grTp3vTp3vTp3vT72vTHvWNAr2vT3vDt415O1eJ2y1527r6y91528GORqWX2dr6i1r5I5qaY6vO26Gg2dH5h1e921dgR7r5iqrJhf22D55S1r3vu1r52pGOIpGOI0egd6cgE0xgE1e9q5c9q1r521q2S1wN2nJ6OdWhQdr5HsJ6W7X311r6xr152eWPP1e92fM6RaxT21r52Qrh1r15Gi7Mni41y4EvL_DT-3T311e5v2Jg21a1ur1Duo3JOo1521r521qhgs6hh1sv21r6d1q9v_SCl1rT2qcQ27J521r521eQkmF1i1qJv0GvWp3vT1r52mJ58r3O2pJT23vD24eg25r521r521r521e0yhQCE93l27r521r521sClfWJO1r521r521r523Gg21q9x4v521r61pGvWp3au6vDd4egi1rJ21r526J52o3gO0xJEo3g21eHk1r521r521r5q1e0y7G1R1r521r521r521qP0qcQp3vT2r3Pf1r58pDQIqqP0qcQpoJO21r521r521qv21r5E1evufv5O815X1r521eQ41aTR73Hp1r521r520r5p0v5243aq1qa2415H0v5q1w5u1qJT93JO1r5f1qXH1a1273J24r521JiL1wv21r5hp15H1ql25v5Q1r521r52pJ521r5d1r521r921r521r5W1eQ241521r5x1r521r5d1r520GgE1r521r9h1qJ2fv526cgd6v5q0vr21r521r5293l27qgx1rN21e52or521r521rN21r521r521r521r5d1r521e521r5L4JN21r521r521q9t1r5e1r524J5k1r524J521qX21r521r5L9c524JN21q9t1q9eov5t4HO21r524J529v521r521rN29x9x9x9x1r5e5e5e4JNt4J524JNt4JNt1r521r521q9x9v521r521e5e5e5e1r521r524JNt4JN21eO21r521r521r5t4JN21r52oxXLov521r521r521r52oxXL1q924J521r5L1r521qX24J521r5l1w12i1521r521eN21r521r521r521qv21r521r521qX2i41Ji41J1r521r521r521r521r5Lov521r521r521r521r52o1521eJ21r521r521r5Ji41G1r521r5v1r521r521r521r521r521r526cg21r52o1521r5J1eJ2i152i1521J521r5g1r521r5O1r521r526J5Lir521r5O1r521ri4515J1w121r521r521e9201521r521r52sF121r5291521r521r521r521r521r521r521rTp3vTp3vTp3vTj7cTj7cTj7cTj7cTj7cTj7v521r521r521eDl7Hr21r5g7cl21erl1rQ2i4121r521r521r521r525e5e5e571r11111211521r5211J1-1z_11v13t_-11Q13K_M11T13__M11O14t_M11J14b_N11D14K_N11X14__N11N15t_N12115K_B12515__B12915__B12i16t_V12r16K_V12a16__V12g17t_V12l17t_C12v17K_C12Q17__C12T18t_X12O18K_X12J18__X12D19t_X12X19b_Z12N19__Z13110t_Z13510t_A13910b_A13i10__A13r1pt_S13a1pb_S13g1pK_S13l1p__S13v1ot_D13Q1ob_D13T1o__D13O1o__F13J1it_F13D1ib_F13X1ut_F13N1ub_G1411ub_G1451u__G1491yt_H14i1yb_H14r1yK_H14a1y__H14g1tt_J14l1tb_J14v1t__J14Q1rt_K14T1rt_K14O1rb_K14J1r__K14D1et_L14X1eb_L14N1eb_L1511e__P1551qt_P1591qb_P15i1q__O15r1q__O15a1wt_O15g1wb_O15l1w__I15v1at_I15Q1at_I15T1ab_U15O1a__U15J1st_U15D1sK_U15X1s__Y15N1dt_Y1611db_Y1651dK_T1691ft_T16i1ft_T16r1fb_T16a1f__R16g1gt_R16l1gb_R16v1gb_E16Q1g__E16T1ht_E16O1hb_W16J1hK_W16D1h__W16X1jt_W16N1jb_Q1711j__Q1751kt_Q1791kt_z17i1kb_z17r1k__z17a1k__z17g1lt_x17l1lK_x17v1lK_x17Q1l__c17T1mt_c17O1m__c17J1nt_c17D1nt_v17X1nb_v17N1n__v1811bt_b1851bb_b1891bK_b18i1b__n18r1vt_n18a1vb_n18g1v__n18l1v__m18v1ct_m18Q1cK_m18T1c__l18O1c__l18J1xt_l18D1xK_l18X1x__k18N1zt_k1911zt_k1951zK_j1991z__j19i1Qt_j19r1QK_j19a1QK_h19g1Q__h19l1Wt_h19v1WK_g19Q1W__g19T1Et_g19O1Eb_f19J1E__f19D1Rt_f19X1Rb_f19N1RK_d1011R__d1051Tt_d1091Tb_s10i1T__s10r1T__s10a1Yt_s10g1YK_a10l1Y__a10v1Y__a10Q1Ut_w10T1UK_w10O1U__w10J1It_w10D1It_q10X1IK_q10N1I__q1p11Ot_e1p51OK_e1p91OK_e1pi1O__r1pr1Pt_r1pa1PK_r1pg1P__r1pl1P__t1pv1LK_t1pQ1L__t1pT1Kt_y1pO1Kb_y1pJ1KK_y1pD1K__y1pX1Jt_u1pN1Jb_u1o11JK_u1o51J__i1o91Ht_i1oi1HK_i1or1H__i1oa1H__o1og1Gt_o1ol1GK_o1ov1G__p1oQ1Ft_p1oT1Fb_p1oO1FK_01oJ1F__01oD1Dt_01oX1DK_01oN1DK_91i11D__91i51St_91i91SK_81ii1S__81ir1S__81ia1Ab_81ig1AK_71il1Zt_71iv1Zb_71iQ1ZK_61iT1Z__61iO1Xt_61iJ1Xb_61iD1XK_51iX1X__51iN1Ct_51u11CK_41u51C__41u91C__41ui1Vt_31ur1VK_31ua1V__31ug1Bt_31ul1Bb_21uv1BK_21uQ1B__21uT1Nt_11uO1NK_11uJ1NK_11uD1N__11uX1Mt-_1uN1MK-_1y11M_-_1y51M_--1y91-b--1yi1-K--1yr1-_--1ya1-_-M1yg1_K-M1yl1__-M1yv21t-N1yQ21K-N1yT21K-N1yO21_-B1yJ22t-B1yD22K-B1yX22_-B1yN22_-V1t123t-V1t523K-V1t923_-C1ti24t-C1tr24b-C1ta24K-C1tg24_-X1tl25t-X1tv25K-X1tQ25K-Z1tT25_-Z1tO26t-Z1tJ26K-Z1tD26_-A1tX26_-A1tN27b-A11116v11261o91a12ri42rQ93rl521r72ri51Jg82rl82Jl82Jl81Ji52vr73vv82Jv82vv92vl82vT03rgp2Jv831li31l921a52rl72vg72vg72vg521g431g72vg62rr72vv82vg521r831v82JQ031g72vg72vg72vg721r521g72vg72vg72vg82rl02Ja92rQ03vr72vD03ra62rl72rvp2Jv62rOp2vg32vl62JQ72vg431v04rT63vr51Ji731g83rl521l82Ji42rX92Jv82Jg72vg03rQ931v52rg82vg72vg72vg431a92vr92vl72va82Jl82Jl72rro31g731a82vl82Jgo3rr81Jv731g93rv82vl72vi72rg53rg02vQ72Ja82rv62Jr82Jv731g92vv72JQ82vg62va82Ja74rJ72Ji53ra731g82vl72Jg82vl731g92vl731g92vg52vr721g52Jr82vg71JQ73rg02vQ72Ja92rl631g92vv731gi31l721r52vv74rQ71JJ941vi31l72JQ72Jl82Jg93rO93vQo21v82Jv92vl93vQ93rT731l831l72Jg62vg72rg72Jr72rg72vg72vl731r72vg92JQ82Jv72vlo3JQ82Jv92Jl831l02Jv92Jvp31Qp2vl82Jl93rlp3Jvi2Jli2Jg72va82vv62Jl62Jv72Jl72va73rl82vv02JQ62vT72vg62va521rp3rg62vl82rTu31l82Jl83vru31v931v92vv62Jr52Jg72vl731g82Jg831l82Ja72vg72Jl731Q831g73Jg731g72va62vQ031g72Jg82vg82vg72Ja72va92Jl631g72vl73vl72vl72Ja82vQ82vg82vg82Ja72vv82vl82rl72vg82JQ62vl82Jl82JT72vg72va62ra82Jl82Jl82Jl82Jl72rg82Jl72vg72Jl72vg72vg72vg82Ja62ra63vg72ra62ra82Jl82Jl83Jg72vg72vg72vg82Jl82Jlp2vg72vQ83vlp3vT72vg92Jl92Jl831g82Jap3rQ73vl92Jv83Jv831v931v931J82Jl82Jg72vg93rQ03rQ03rv931v82vl931v82Jl831v82Jl82Jl82Jl931g72vg741l82rg72vg03rQ03rQ04rl82Jv931v82Jl931v931vo2Jv931v93vv03rT92Jl02Jv93rg831T031Qp2vv82Jl92JO72Jl02Jl92vg83JO02Jl931l82Jv83rl931l93vv03vg82Jl831Q83vO941l841lo31D03JOo2Jv82Ja82Jl82Jl82Jl82Jl82Jl82Jl82Jl82Jl82Jl82ra62ra62ra62ra62ra62rao3JQ76Hag5erh92vg5HQh72Nb6cv82rv92Jg72Jl72vg72vg73vg72vg72vg71Jr1111i9vg12vr42rT93vv621r72vi61Jg82rl82Jl82Jl821r62vr73Jv92JQ92Jv02Jv82JTp3vgo2Jv93rvi3rv02rg62vv82vg72vg72vg52rg531g72vg72vg72vv82vg52rr831v831Tp3rg72vg72vg72vg721r521g72vg72vg72vg82rl031a92vQ03Jg82vXp3vg62rv72vQo31v72vJo2vg32vv62JT82Jg531vp4vO73Ja61Ji73rg93vl62rv92Ji52rN931v931l82Jlp3vT03rQ52vg82vl72Jl82vl431g02va02vv72vg931v931v72vai31g831g82vl82Jgi3va91Jv73rg03vQ92Jv72Jr82vl63vgp2vT72Jg82vv731g931Q73rg02vQ72JT92vg72vg831a74vX72Ji53vg831g82vl731g92vv731g92vv73rg02Jl52Jr821l531a82vg81JT73vgp2vT72Jg92vv73rg02vQ73rgi31v72ra62vv74vT71JJ941vi31v72JT831v931l03rJ03JTi21Q931Q02Jl93vT03vO73rv93rv831g72vg82vg72Jr72vg72vg72vl83rr72vg031T82Jv82Jvi41T931Q92Jv83rvp2JQ031Qp3rTo2vl931v03rlo3JQu2Jvy31g72vg82vv631v731Q82Jv72vg73vl82vQp2JQ72vO72vl72vg521ao3rl72vl82vOy3rv931v83Jry3rQ03rQ02vv731g52Jg72vv73rg931g93rv92Jg72Jg82Jv73rT93rg841g731g72Jg72JTp31g72Jg82vg82vg831g82vg031v73rg82Jv83Jl72Jl731g92vT82vg82vl931g72JQ92Jv82vl82vl82JT72vl82Jl82JO72vg72vg72vg831v931v931v931v72vg82Jl72vg72Jl72vg72vl82Jl931g72vg73Jl72vg72vg931v931v941g72vl82Jl82Jl931v931vo2vl82JT83Jvo3JO72Jl031l031l93rl92Jgo3vT73Jv931Q941Q931Q03rQ03rD831v931l82Jl03vTp3vTp3vQ03rQ92vv03rQ82Jl83rQ931v931v931v03rl82Jl84vv82vl82Jlp3vTp3vTp4vv931v931v931v03rQ03rQi31v931Q03JQp3vO031lp31v03vl83rOp3rTo2vQ931v031J831vp2Jl92Jl941Jp31v03rl92JQ93vl03rv03JQp3Jg831v93rQ83JO04rl94vvi3rXp41Ji31v92Ja82Jl82Jl82Jl82Jl82Jl82Jl82Jl82Jl82Jl82ra62ra62ra62ra62ra62rai41T77elj5cak9cTj62Ok7x5x72T82rQ931l82Jl72vg72vg73Jg72vg72vg721r1111u0rg12vr42vO03JQ62ra82vr61Jl92vv931v931v921r62Ja83JQ931Q931Qp2JQ92JOp3vlo31Q03vvu3rQ02rg62vv82Jv831l82Jl52rl53rl82Jl72va82vT92Jl62ra93rQ931Tp3vl82Jl82Jl82Jl821r521l82Jl82Jl82Jl92rvp31a02vTp41g82JNp3vg72vv82vQi31Q72vJi2Jl32Jv731T931l53rQp51J73Ja61Ji73rl03Jv62rQ031i52e1031Q931l82Jlp3vTp3vT52vl82vl72Jl82vl43rg02Ja02JQ82Jg931v931v82vau3rl83rg92Jv931li3va91JQ83vl03JQ92Jv82Jr82vl63vlp2JT831g92vQ73ra031T83vl02JQ831T92Jl72Jg931g84JN831i53Jg83rl92Jv831l92Jv83rl02JQ83vlp31l52Jr821l53ra92Jl821T83vlp2JT831g02vQ73vlp2JT83vlu3vQ82ra62JQ84JT81JDp4rTu3vQ831T831v931lp3vDp3JOu21T931Qp2Jv03JT03vJ83vQ03rQ83rl72Jl92vl831r82vg82Jl82Jv93vr82Jlp31O931Q82JQu4rO931Q031v93vvo31Tp31To3vTi2Jv031v03vvi41Ty31Qt31l82Jg92JQ731v731T831v82Jg83Jv92JTp31T72JJ82Jl72Jg521ai3vv72Jv92vOt3vv931v941rt3rQ03rQ02JQ73ra531l82Jv83rl931l93vv031g831l931Q83vO93vl841l83rl831g72JOo3rl831l92Jl92Jl931g82Jgp3rQ73vl931v83Jv831v831g02JO92Jl92Jv93rg82JT02JQ92vv92Jv931O72Jv931v931J82Jl82Jg72vg93rQ03rQ03rv931v82vl931v82Jl831v82Jl82Jv931v931g72vg741l82vg72vg03rQ03rQ04rl82Jv931v931v931v931vo2Jv931O941Qo3JO831vp31v031v03vl031go3vT83Jv03rT94vQ93rTp3vTp3vX931v931l82Jl03vTp3vTp3vTp3vT92Jvp3vT931v93rQ931v931Q03rQp3vl82Jl84JQ92vl82Jlp3vTp3vTp51v931Q03rQ03rQp3vTp3vTy31Q03rT041To3JJp31vp31Qp3vl93vOp3rTi2JT031v03rJ831vo31v02Jl04rDo31v03vv931T93Jvp3vvp3JTp41l93rv93rT941Jp4vv04Jvi3vNp4vXy31Q031g931v931v931v931v931v931v931v931v931v92ra62ra62ra62ra62ra62rai41O87HQl62lm0eJl6cDm83rW7cJ92vQ031v931v82Jl82Jl841l82Jl82Jl821r1111tpJl12Jr52vDp41T72vg92Jr71Jv02JQ03rQ03rQ021r731g94vO03rO03rTi31T031Di41vu3rTp3JTt3JTo2vv73rQ931Q93rv931v52vQ53Jv931v82Jl92JO031v72vg03JO03rJi3Jv931v931v931v921r521v931v931v931v02vQi3vlp2JJo4rl9325i4rl72vT931Oy3rT92JXy31v52JQ73rJ03rT53JOi5vX84rg71Ji83Jvp4rQ62rTp3rr52cio3rO03rv931vi41Jo3JO531Q931v031v93rv43vlo31go31T931lp3vTp3vT92Jgt3vv93vl031Q03rvy41g021O93Jvo41O031Q931r92Jv741vi31J93rl02JT83vlp3vO93Jvo31O93rJp31v831l03rl95c593ri641l93Jv031Q93rv031Q93vvp31T941vi3rv531r921v53vg03rv921J941vi31J93rlp2JT83Jvo31O93Jvt3JT92vg731O95rJ921No4JOt3JT93rJ93vTp3vvo41No4rDt21O03rOi31Qp4rJo41X93JTp3JT93vv831v02Jv93rr92Jl931v931Q03Jr931vo3rD03rT931Tt4JDp3vOo3rQ041Qu3rOo3vOu41Jy31Qp3vTo41Qy4vOr3rTe3rv931l031T83vT83vO93rT931l941Q031Ji3rJ831X931v831l521gu41Q831Q02JDe3JTp3vT04vre3JOo3JOo31T83vl53rv931T93Jvp3vv03JTp3rl93rv03rT941Jp3Jv94vv93vv93rl831Di3vv93rv031v031v03vl931lo3vT83Jv03rQ94rQ93rQ93vlp31J031v031Qp3vl931Op31T02JQ031Q03rJ831Q03rQ03rX931v931l82Jl03vTp3vTp3vQ03rQ92Jv03rQ931v93rQ931v931Q03rQp3vl82Jl84vv92Jl82Jlp3vTp3vTp4Jv931Q03rQ03rQ03rQ03rQu31Q03rJ04vTu4rD93rQo3rQo3rQp41vp3rlu41J94rQp3vOp51Op3vOo3JOo3H103rQ03rv931vo41Ji41Ji41Oo3JOp31To3JO03rQ03JO03rQ03rTp3vTi41v931v95rT02Jv931vi41Ji41Ji5vQ03rTp3vTp3vTo3JOo3JOr3vTp3vOo4rOu41Xo3rQi3rTi41v03JDi3JJy31Op3vTo3vX93vQu3rQp31vp4JNu3vTo3JQ03rJ04rQo3JTo4rJi4vv03vTp3JJ04vXo51Qp5rQy3H5i521r3vTp3rl03rQ03rQ03rQ03rQ03rQ03rQ03rQ03rQ03rQ02vg72vg72vg72vg72vg72vgy4vJ98HDc6HOcpG5c7x9x93TI8q502vOp3vQ03rQ931v931v94rv931v931v921a1111rovv131a531Do4rT72vg031r821Qp2JTp3vTp3vTp2ra731l04JJp3vJp3vOi3rOp3rNu4rvy3JOo41Te41Oi2vv731T031T93rv931v62vQ63Jv93rv92Jl931O03rQ72Jgp41Jp3vDu41v931v931v931v92ra62rv931v931v931vp2JTu3vgo31Du4Jv032iu4rv931T931Jt3vJ931Nt31Q53rO83vD03rJ641Ju5JN94Jg71Ji041Qo4vT82JOo3vr62Hri3vJp3vQ03rQu4rDi41J631Q931Q93rQ031Q53Jli3rgi31O93rvp3vTp3vT031lr3Jv03Jvp31Tp3vvt4rlp21J941vi4rJp3rT93ra02JQ74rvu31D93Jvo31O83Jlo3vJ941vi3rJ03vDp3rv931vp3vl95H993vi64rv041vp31T93vvp31T93Jvo31O941vi3rQ63ra02rQ63Jgp3rQ021D94rvu31D93Jvo2JO941vi31J941ve3JO02vg731J95JD9225o5rOe3JO03vD03vTp3vQi4e1i4vXr2rJp3vJi3rTo4JDi4rN941Oo41O03JQ931v031v93va031v931v931Q041a931vi3vXp3vO03rOr51Xp3vJi3vTp41Ty3vJi3vJt41Dt31To3vTi41Tt4JJe3vTq3vv931v031O83vT93vJ03rT031v04rQp3rJu3vD931X931Q931l62rgy41Q93rTp31Nw41Tp3vTp4Jaw3JOo3JOo31O83Jl63vv031T041vp3vQp41To3vl93rQ03vO941Dp41v04JQ03Jv93rl83rXu3JQ03vvp3rvp3rv03vl031li3JO841Q03rT04vT03rT03vlo3rDp3rvp3rQp3Jl93rJo3rOp2JT03rQp3vD83rTp3vTp3vN93rQ03rl82Jlp3JOo3JOo3JTp3vT02JQp3vT931v93vT03rQ03rQ03rQp3vl82Jl84vQ92Jl82Jlo3JOo3JOo51Q03rQ03rQ03rQp3vTp3vTy3rQ03rDp4JOy4vX03rQi3vTi3vTo41Qo3vvy4rD94vTo3JJp5rJp3JJi41Ji425p3vTp3vQ03rQi4rDu4rDu4rJi41Jp31Ti41Jp3vTp41Jp3vTp3vOo3JOi41Q03rQ05vOp31Q03rQu4rDu4rDu5JTp3vOo3JOo3JOi41Ji41Je3vOo3JJi4vJu4rNi3vTu3vOi4rQp41Xu41Dt31Jo3vTi3JN03vTy3vTo3rQo521y3vTi41Tp3vJp4vTi41Ti4vJu4Jvp3JTp41Jp4JNi5rTp5vTt42iu5e5e3vOo3vlp3vTp3vTp3vTp3vTp3vTp3vTp3vTp3vTp3vTp2Jl82Jl82Jl82Jl82Jl82Jlt4JD99eNz7eDQoxiz7GrQ9xJP8Gip2JOo3vQ03vT931v931v94vv931Q03rQ02ra1111eirv131a531Xi4vO82vg031a821Qp31Tp3vTp3vTp2ra73rlp51Jo3vJo3vJu3rOp3rNy4vQt3JJi4rOe41Oi2vT73vO03rT03vT03rQ52JT64rQp3rQ931v031Dp3rT72Jgo41Jp3JXy4rQ03rQ03rQp3vTp21r521Qp3vTp3vQ03rQp31Ou3Jvi31Xy51Q03e9y4rv72vO03vDt3JJ0321r3rT531T83JXp3vD641Jy61N951l81Ji941Qo4vT82JOo3vr62Hai3JJo3JQ03rQy4vXu4rD53vQ03vQp3rQ03vQ541vi3vli3rO03rvo3JOo3JO031le41Q041vp3rTp3vQr4vlo21J041Qi4vJo3rOp3ra031Q84vQy3rXp3Jvo31J941vi3JD04rQi3vJp3vXo3rQ93rvp3Jv062i03Ji74vv041Qp3rT03JTo3vOp41Qi3rJ04rQu3vQ53rr021Q53Jlp3vQ02rX04vQy3vXp3Jvi31J94rQu3rD04rQe4rO02Jl83rJ05vX0225u5rDe4rO03vD03JOo3JQi4e5u4JXr21Jo3JJu3rTi4JXi4vN04rJo41O03JQ93rQp31Q03vr031v03vQ03rTp4rr03vQu3JXp3vJ03rOe5rXo3JJi3vOp4rOt3vDu3JDt4rXt3rTi3JOi4rOt51Dq3vOw3JQ03rvp3vJ83JO93JJp3vO03rv04vTo3rDu3JD93rN03vT93rv521lt4rT93rOp321a41Oo3JOp51ra41Ji41Ji3rJ941v53JQ03rO041Qo3JQo4rOi3vv03vQp3vO04rXo4rQ051Q041Q03vv93vXy41Q03JQo3rQp3rQp3Jvp3rvu41J94rQp3vO04JT03vO03Jvi3rXo3rQo3rTo41v03rDi3rJp31Op3rTp3vX93rOo3JOo3H103rQ03rv931vp41Ji41Ji41Oo3JO031Qo3JO03rQ03vT03rQ03rTp3vTo3Jv931v94JT031v931vi41Ji41Ji5rQ03rTp3vTp3vTo3JOo3JOt3rTp3vXo51Jt4JN03vTi3JTi3JTi4rQo3vvt4vX04JOi41Do5vJo41Ji41Ji429p3JOo3JQ03rQi4vXy4vXy4vDu4rDo3rOi41Jp3vTp41Jo3JOo3JJi41Ju4rQ03rQ05JOp31Q03rQy4vXy4vXy61Oo3JJi41Ji41Ju4rDu4rDq3JJi41Ji4JDy4c1i3JTy3JJu4vQp41Ny41Xt3rDi3JOi3H103JOy3vTi3rQo5e5y3JOi41To3vDo4JTu4rOu4JDy4JQp41Oo41Do4H1u5vTo5JOr429y5c9q3JJi3vvp3vTp3vTp3vTp3vTp3vTp3vTp3vTp3vTp3vTp2Jl82Jl82Jl82Jl82Jl82Jlr51X09G5W7cXEiqaW8qgE0qNJ9qap2JJi3JTp3vT03rQ03rQ04JQ03rQ03rQ02rg1111wuJQ13rg6321u51J82Jlp3ra921Ti3rJi41Ji41Ji2vg83vlp5rDi3JXi41Dt3vDi3c5t4JTe41Du4vJw4vJu2JO83JJo3vOp3JTp3vT531T64JTp3vT03rvp3rXo3vO831li4rDo41Nt4vTp3vTp3vTp3vTp21r521Tp3vTp3vTp3vTo31Jy41vu3rNt5rQo3crt4vQ82JJp3vXe41Dp3e9e3vT53rO941No3JD74rDt6H595rl81Ji04vTi51J931Di3Ja732vu41Di41Tp3vTt4JNy4vX53JTo3JOo3JOo3JT54rQu3Jvy3vJp3vQi41Ji41Jp3rvw4rTp4rQo3vOo3JTq4Jvi2rDp4vTy51Xi3vJp3vap3rT94JTt3vNp41Qi3rD04rvu41Xp4vTu3JDo41Ni3vT03vQi41Qp6Hap41i751Qo4rTo3vOp41Ti3vJp4rTu3vDp4JTt3JT53vrp21T54rvi3vTp2rNp4JTt3vNp41Qu3rD04vTy3vXp4vTw4vJp2Jl83vDp61Np2eiy5JXw4vJp41Np41Ji41Oy4Hiy5e1q21Xi41Dt3vJu5rNy4H5p4vDi4vDp41T03vTo3rTp41rp3rQp3vTp3vOo4vrp3vTy421i3JDp3vDw5H1i41Xu3JJi4JJr3JXy41Xe4JNe3vOu41Jy4JJe5vXa3JJs41Tp3vQo3vD941J041Xo3JJp3vQp4JOi3vNt41N03c5p3vO03vQ521ve4JO03vJi3e5d4vJi41Ji5rrd4rDu4rDu3vD04rv541Tp3vJp4vTi41Ti4vJu41Qp3JTo41Jp4JNi4vTo5vTp4rTp3JQ03H1r4rTp41Ti3vTi3vTo41Qo3vQy4rD04vTo3JJo5rJp3JJp41Qu3c1i3vTi3vOi4rQp3JXu3JDi3rJo3vOi3H103vJi41Ji425p3vTp3vQ03rQi4rDu4rDu4rJi41Jp3rTi41Jp3vTp41Jp3vTp3vOo3JOi41Q03rQ05rOp3rQ03rQu4rDu4rDu5JTp3vOo3JOo3JOi41Ji41Je3vOo3H1i5rDe5e5p3JOy41Oy41Ju4JTu41Qe4JNp5rJu4rXi61Xi4rXy4vXy4cao41Ji41Tp3vTy4JNt4JNt4JXy4vXi3vJy4vXo3JOo4vXi41Ji41Du4rDt4JTp3vTp6rDi3rTp3vTt4JNt4JNt6JJi41Du4rDu4rDy4vXy4vXa41Du4rXy5rXr529y41Jt41Dt4JTi4c5t4vNe3vXu41Jy4e9p41Jr41Ou3vTu5Hir41Jy4vOi41Ni51Oy4vJy5rNt5rTo4rJi4vNi5e9y61Oi6rJq4crt62ra41Du41Qi41Ji41Ji41Ji41Ji41Ji41Ji41Ji41Ji41Ji31v931v931v931v931v931vq5c1p0GaY8q9UuGQU93OIpwaA0qQi31Du41Oo3JOp3vTp3vTp5rTp3vTp3vTp2vg1111st1T13vg63e9t5rX931vp3vg021Ou3rDu4rDu4rDu2vg93Jvo621u4rNu4rXr3JXu42ie5rOq4rNy4JXs4JDy31O941Di3JJo4rOo3JO731J751Oo3JOp3vTo3vXi3JO93rvu521u4e5e4JOo3JOo3JOo3JOo2vg72vOo3JOo3JOo3JOu3rDe4rvt3e5e5JOi3Hge5JT92JDo3H1w4rNo3erw3JO63vJ04e5i41X7521e7ei05Jv921rp4JOu5rD931Xy4ra73eTr4e1u4rOo3JOe5e5t4JN73JJi41Ji41Ji41J64JTy3Jvt3JDo3JTy4vXy4vXo3vQs4vOo4JTu3JDu4rOa5rQu2e1o4JOt5rNu41Do41gi3vJ95rOe3H5o4rTu3vNp4vTy4rNo4JOy3JXo4e5u3JOp3JTu4rQo7evo4rr85rTi51Ou3JDo4rOu3JDo4vOy3JXo51Or41O73Jgo2vO74vvu41Oi2c5o5rOe3H5o4rTt3vXp4JOt3JNo4JOs4vDo31v93H1o6c5o2eay6rXs4vDo4e5i4vXy4vJt5ear5c9a2vNu4rXr3JDy5H5t5eio51Xu4JXo4rOp3JOi3vOo4rgo3vTo3JOo3JJi51go3JOr4e9u4rNo3JXs6e9u4rNr4rDu51Dq4e1r4e1w525w3JDy4rDt51Dw621f4rXg4rOo3JTi3JX04rDp4vNi41Xo3JTo5rJu3H1e4e5p3Hio3JJp3JT72vvw51Jp3JDu3cig4JXy4vXu5Jgg4JNt4JNt3JNp4vT74rOo3JXo4JOu4rOu51Xy4rTo41Oi4rXo525y51Oi61Oo4JOo41Tp429e4vOo4rOu3JOu3JOi4vTi3JTr4vXp51Oi41Di5JDo41Do4vTy3H5u3JOu3JJy4vTo421y41Xu3vDi3JJu425p3JDu4rDu4eio3JOo3JTp3vTu4vXy4vXy4vDu4rDo3vOu4rDo3JOo4rDo3JOo3JJi41Jy4vTp3vTp5JJo3vTp3vTy4vXy4vXy6rOo3JJi41Ji41Ju4rDu4rDw3JJi425u5JXw5Hio41Jt4rDt4rDy51Oy4rTw5e5o5vDt4vNy6vNu4JNt4JNt4Hlu4rDu4rOo3JOt5e5e5e5e5rNt4JNu3JDt4JNu4rDu4JNu4rDu4rXy4vXr51Oo3JOo71Xu3vJi41Je5e5e5e5e7rDu4rNt4JNy4vXt4JNt4JNd4rNt4JNt5H1q5ert4rDe4rNr5rOu4Hie4H5w3H1y4rDt4cro4rDq4rDt3JOy6eaq4rDt4JDu4e1u5vDr51Dr5H1e5JOu4vDu4H1u5Hrr6JDy71Da4Hge6cgd4rNy4rQu4rDu4rDu4rDu4rDu4rDu4rDu4rDu4rDu4rDu3rQ03rQ03rQ03rQ03rQ03rQa625opGQL93gKt3XL03NJowTNpqXu3rNy4vJi4rDo3JOo3JOo5JOo3JOo3JOo2vl1111gerO13Jl73cre62103rQu41lp2vJt3JNt4JNt4JNt2Jl041Tu6c5t4c5t4H1q4e1t4eaw5JDs4H5r5c1h5e1e3rD04vNu41Xi4vDi4rX83vX85vDu4rJo41Ti425y4rD03vQy5e5y4Hiw5vJi41Ji41Ju4rDu2Jl82JDu4rDu4rJi41Jy3vNa4JQe42iw6vOu42Ow6rJo3vNi429d4H1u42ld4rD6421p4Hiy4c185e5w8ego6rQ021ri5rDr61N03e1r4vg83cXe4H5t4JDu4rDw5Hiq5c984rXu4rDu4rDu4rD65rJe4rTe421u4rJr521r521u41Tg51Du5rJy41Xy4vJf5JTt2c5i5vJe625t4rNu4rlu3JD05JDw4eiu4JOt3H5i51Tr4H9i5vJe4e5u4Hit4rDi4rOt4JOu8eOu4Jr961Ju5rJy41Xi4JDt4rNu51Dr4e1u5vXq4vD84rlu2JD851Tt4vDu2Hiu5JDw4eiu4JJe421o5vJq429i5vJh5e1u3rQ0425i7Hiu2cQe7e5h5e1u4Hiu521r51Dq5Hvq6erf2H9t4H5q4rNe6eie5Hgu5c1r5e1u51Di4rJy41Ju4Jlu41Ji4rDi41Xy5vli4rJq4Hrt4c5u4e1g6Hrt4H9e4JNt5vNs4c9q4H9s5cid4rXr4JNe5JNd6H9j4H1k4JJu41Oy4e1o4JNi529u4c1u41Ou5JXt4eiw4Hii42gi4rDo41J82JTs5JXi4rNt3Hal5vNt4JNt6vll5e5e5e5e425i51T84JJu4e1u5vJt4JDt5c1r4JOi4vDy4H1u5crr5vJu6JDu5rDi4vOo4cra5rDu4JDt4rJt4rJy51Oy41Oq521o5vDy4vNu6rNu4vNu51Or4ert4rDt4rXr51Oi4e9r4e1t3JNy4rXt4cro4rNt4JNt4Hgi4rDu4rOo3JOt521r521r51Nt4JNu3JDt4JNi41Ji4JNu4rDu4rXy4vXr51Oo3JOo6vXi3JOo3JOr521r521r71Du4rXy4vXy4vXt4JNt4JNs4rXy4crt6c1s6eau4vXq4JXe4JNr5vDr4JOs5Hiu6rNe529r7e5t5e9q5c9q5cTy4JNt4JDu4rDe5Hiw5Hiw5H9q5c9t4rNq5c9y4vXy5e5t4JNt4H1r521q5vDu4rDu7H1t3JDu4rDw5Hiw5Hiw8rNt4H5e5e5r521q5c9q5c9h4H5e5e9e6c9a62gq4JNw4H5q5JDt5caw5eid4e9r4JNe52lu4JNa4JXe4rDr72la4JNq5vNt4H9t6rXq5vNq6e9w6vDy51Nt5eit6clq7vNr7JNf5cOw7eQh4H5r4JOt4JNt4JNt4JNt4JNt4JNt4JNt4JNt4JNt4JNt3vTp3vTp3vTp3vTp3vTp3vTf6HruixXD0qOAewrDpwgAu5u5oFrt3c5r51Xy4vXi41Ji41Ji6rJi41Du4rDu2Jv1111kwvX14rv73Hlw6c9p3vTt4rlo2JXr421r521r521r31vp4vOy7ere52ie529s4H9e4Hld6vXg5ciq629m629w3vNp4H5t4c1y51Ny4c183JN86rXy4vXu4rDy4eir4vNp41Tr62rr5egd61Xy4vXy4vXt4JNt2Jl82JXy4vXy4vXy4vXr3H5d5rQw4eas71Xt4cNd6JDi3H5y4crh5eiy4eTh4vX84e5i5ear52i962rd92Qi71Oo2rau61Xq6H1p3c9q51l93G9a5ere5rNt4JNd6cga62r84JNt4vNt4JNt4JN75JDw4JOw4c9y4vDq5c9q5c9y4rOk5vXt5JDr4c1r51Xj6rOe2Hry61Xw6cie4H5t4Jlt4rNo6vXd4cgy5vDq4eiu5vDq5ery61Xw4Hit5ege4vXu4vDe5rJy92Xy5ra06vDt61Xr4c1y5rNe4H5t5vXq4c9y6e1s51N84Jlt2JN85vOe4JNt2Hgy6vXd4cgy5vDw4e9u61Xa4cry61Xm5H9y3vTp4cry8Hgy2HDw8eim5H9y52at5c9q5vNa6eOa72lj2Hre5eis4H5w6Hgw6cQy629q629t5vXu4vXr4rXy51lt4rDy4vXy4c1r6rly4vXs5ele52it4H9k7cle5era525e6e5f52ra5erf6egh4c1q5e5a6e5g7cam529b5rXy4vDr4H9i5e5u5ert525y4vDy6c1e4cas5eau4cvy4JNu4vD82JOg6e1u4c5e4evb625e5e5e7rlb5Hiw5Hiw4ciu5vD85rXy4c9y61Xe5rNe629q51Dy51Nr5e9y6ege61Xt7vXy5JXy51Du4Hld5JNt5rXe4vXe4vXr5vDt4vDa5c9u61Xr525t725t525y5vDq4Hge4vXe4c1q5vDy4Hrq4H9r4e5r4H1e52gu4H5e5e5e5eQy4vXy4vDu4rDe5c9q5c9q5c5e5e5t4rNe5e5y4vXy5e5y4vXy4c1r521q5vDu4rDu71Ny4rDu4rDq5c9q5c9q81Xy4c1r521r521e5e5e5e5g4H1r52ge7e9g72vt521a5e1a5e1q6rNq5rDg6cgy725w5crq82re5Hra62ra62Dr5e5e5rNt4JNa6cgd6cgd6cra62re4c5a62rr521r62re5e5e5e9q5c9s6rNt4JNt8c9e4rNt4JNd6cgd6cgd925e5eiw5Hiq5c9a62ra62rl5eiw5Hra72rd6cQa5e5s5eis6vNe62vd5Hgh4crq5e5a5cTt5e5f5e1w4JNq7HTf5e5a621e5eae6H1a625a72ad7rXr5c5e62ae72Ts8e1q8H5j62Nd82Jl5eiq51Jr521r521r521r521r521r521r521r521r521r3JOo3JOo3JOo3JOo3JOo3JOj7cgyy4rBpw1NwzOBozDMyQPuuwOr42iw5e1r521y4vXy4vXy71Xy4vXy4vXy31Q1111maJN14vQ842va72io3JOr4vvo31Nq4e9q5c9q5c9q3rQo4JJt7caq5eaq5crd52iq52Qf6JNh5Hra6eib6eis3H5o5e9r4H5t5e1t4H5942196JNt51Ny4vXt4cre4H1o41Oe6eae5clf6rNt4JNt4JNr521r31v931Nt4JNt4JNt4JNe429f5vJa4cld7vNr4G5f71Xi429t4Haj5cry4cJj4JN84c9i5cle5er06eaf9HTu7rOo2ray6rNw729o3Hiw5rl043rs5caq5c1r521f6Hls6ea95e1r521e521r521861Xs51Js4Hit51Xw5Hiw5Hit4vOm61Nr61Xe4H5e5rNl6JOq2Hat6rNs72aq529r51vr4e1o6JNf4Hlt5JXw4cry61Xa5Hat6rNs52ar5clw4JNy4JXq5vDt9x5t5vap71Xr6rNe4H5t5c1q529r61Na4Hrt6c5d5e1951vr32195JJq521r32lt6JNf4Hlt5JXa4cry6rNs4Hat6rNb62it3JOo4Hat9elt2HNa8Hrb62it5clr5Hiw5H1s6HDd7eQl32aq5cad529a7els6HTt6crw6err5JNy4JNe4vNt5vvr4vXt4JNt4H5e6vvt4JNd5cQq5err52im82Qq5cas5c9q6c9h5egd5cah6clj4H5a5cis6c9j82gb5cic5vNt4JXe52ru5c9y5Har5eir4JXt6H5q4Hgf5cly4HTt521y4JX931Jj6c5y4H9q4cQx6eiw5Hiq7vvx6eas6eas4Hry61X95vNr4Hit6rNq5c1q6cia5vXt5e1e5cit6cvw6rNr81Nt61Nt5rDu52Qg621r5vNq51Nq4JNe5JDr4JXd62ry6vNe5e9r7c9r5e9t5JDa52vq51Nq4H5w61Dt52ga52rq4c9e525q5evu529q5c9q5cOt4JNt4JDu4rDq62ra62ra629q5c9r4c1q5c9t4JNt5c9t4JNt4H5e5e5w5JDu4rDu7c1t4vXy4vXa62ra62ra8vNt4H5e5e5e5e5q5c9q5c9j525e5evq7Hrj7cTr5e5s5c5s5c9a6c1w5vXj6Hlt7e9a62aw8caq62as6eas6q1e5c9q5c1r521s6Hlf6Hlf6Has6eaq4H9s6eae5e5e6eaq5c9q5cra62rd6c1r521r9eiq4c1r521f6Hlf6Hlf9H9q5cra62ra62rs6eas6ean5cra62as7cag72Os5c9f5crd6H1q6eTf6elj4Hga5cis62Jr5c9h5c5a521w8eJh5c9s6e9q5cgq7e5d6c9s7cgf7vNe629w6egq7cJd8H9w9e9l6q5f8cXn5cra5vDq5c9q5c9q5c9q5c9q5c9q5c9q5c9q5c9q5c9q41Ji41Ji41Ji41Ji41Ji41Jl82vtt4v_owe2aFN_ia63tW6qywNq42aa5H5e5e5t4JNt4JNt7vNt4JNt4JNt3rT1111vf2114JT94cOd7cai41Je4JQi321a4cra62ra62ra3vTi51Dr8ela5Hla5Hgh5eaa5cOj7c5l62gd72ax6Haf429i5crq52ir5H9r5e904e507e5e5e5t51Ne52gw5e5i4vJq6Hlw62Tj721r521r521q5c9q3rQ03e5e5e5e5e5e5e5w4erh61Jd4HQg821q53rj7rNu4ere5elm62gr4HNm5e1852ry62Qq5cgp6Hlj0cDy81Du2vgr6H5s7Hri42as5Jvp4qvf62la625e5e5j7cTg72v05c5q5e9q5c9q5e986c1f5rDf52ae5rNs6eas6eae4JJv6c5e6c1w52iw5H5b7rJa32lr6H1f7Hla5crq5vQq4H9u7c5j5eTe61Na4Hgr6vNd62ve725f5ele62Ta5e5r5rNa61Xe0xre61go7c1q6H1w52ir629a5crq6c5d5ege7e9h5c505rQe3e506rDa5e5q3eTe7c5j5eTe61Nd52gt725g5eve725x6cae41Ji52lr02Te339d9cgx6cae62Qq6eas6e9f7eNg82Ob3ela62lh5erd7HTf7cDe72gs6Hge6e5r5e5w521e61Qe521r5e5r5eiw71Qe5e5g62Oa5Hge5eav8HOa62lf5Hra7erl5Hvg62vk7eTm5eid62rf7erm8Hvx5HaQ621e51Nw5cgy62rr6evq5Hae51Ne7cia5eQh62Qr52Dr5c9t52103rDl7e9r5era4HJW72as6eaa8rQW6Hlf6Hlf52gr6vN0621e5eae6H1a625a72ad5JNr5H5w62ae7eTs721q8H5e6c5r5JNt5cOk6c5e625a5e1a5e5w6rNq5rNg6cgt725w5Hrq82re5Hre6rNd5eTa5e5a5eis6vNe5cvd5cgw4Hrw5eia5HTt5era62ra62Dr5e5e5rNt4JNa6cgd6cgd6cra62re4H5a62rr521r62re5e5e5eiw5His6rNt4JNt8e9e4JNt4JNd6cgd6cgd9e5e5eiw5Hiw5Hia62ra62rl5eiw5HTa8egl82Je5Hif62if62id7e5s61Nl7cTe82rd6cvs9ela6clf6Hlf6Giw62ra625e5e5f7cTj7cTj7cvg72va5erf6Hlw5Hiw6Hla62ra62gd6cgh7e5e5e5e02aa4H9q5c9j7cTj7cTj0cra62gd6cgd6cgg72vg72vc62gd6clf8evk7HXf62rh62gh7c5a6HJj6HTm5evd62rf6cNe62rk62id5e5s92Nk62rf6Hia62Qa82ig72rg82Qj8e5w6cra6HQa8eNg9cis02rb6Grj9q5c62gd61Xa62ra62ra62ra62ra62ra62ra62ra62ra62ra4rDu4rDu4rDu4rDu4rDu4rDb8HTerzC7iwW8f5h7uDc9esWktDaw4cld6eiw5Hir521r521r8e1r525e5e5e3vO1111cfH1151T94cJf7Hgu41Jq51Qi321a4Hra62ra62ra3vTu5rDe8evs62vs62gh5cga5cJj7c5m6eld72az72af429i5caq5ere5H9e5ci04e907c5e5c5r521e52gw5e9i4vJw72va6eTj725e5e5e5e5q5c9q3rQ03e5e5e5e5e5e5e5a4eaj6rJf4HQh8e1q5qaj7c1y4cae5evn6elr4G1n5e5852ay62Tw5Hgp72vj0HXt81Du2vgr725s7Hri42gd61vp4xQg6evs6e9q5c9j7cTg72v05c9q5c9w5c9q5H996H1f5vDg5eae5c1s6eas6eae51Jc6c9q6H1a5era625v7vJs32ve725g7Hvs5caq5vQq4H9u7c5j5eTe6e1s52lr6c1d6eve725f5clq62Ts5c5r5e1a6rNe0Gaq6rgo7H1q725a5ere6e9s5caq6c9d5cgq7eih5H905vQq3e906vDa5c9q3eTe7c5j5eTe6e1f52gr725g5eve725z6cae4rDu5eve0eTe33id9Hgz6cae62Tq6eas6e9g7x1h8eJv3evs6elh5crf82Tg7cXe7egs72gq6e9r5e5w525e61Qq521e5e5e5eiw7rQe5e5h6eJa62lq5cgc92Js6evg62aa7eal62Qh6evl7eTn5erd6eag7crn92Qz62gW6e5e5e1a5clt6ear6evq62aq5e1e7Hia5cQj6eTr5eXe5c9r5e103rDm7cir5era52JE72as6eaa8vQE6Hlf6Hlf5elr6c106e5q5egq725s6e9s7egd61Ne5H9w62ge7eOs725q929q6H5e5JNt5HJk6H9q625s5c5a5c5w6vNw5rNh6cgt7e9w5Haq8erq5Haq6vNd5cOs5c5s5cid6vNe5cQd5cga4Haw5cia62Ot5cas6eas6eXe5c9q5vNt4JNa6cgd6cgd6cas6eaq4H9s6eae5e5e62rq5c9q5ciw5Hid6vNt4JNt8cie4JNt4JNd6cgd6cgd9c9q5ciw5Hiw5His6eas6eam5ciw5HOs8cgm8eDq5Hig6erg6erd7e9d621m7cTe8eaf6cvs9cvs6Hvg72vg73ra6eas6e9q5c9g7cTj7cTj7cvg72vs5eag72va62ra72vs6eas6egd6cgh7e9q5c9q0ega529q5c9j7cTj7cTj0Has6elf6Hld6cgg72vg72vx6elf6Hvg8cvk7HNg6erj6elh7c9a72Dj72Tn5eQd6eag6x1q6eal62rf5c9d9q1l6eag72rs62Qs82rh7eag8eQj8c5a6cas72Ta8x1h9Hrd0eav73aj9x9x6eld61Na62ra62ra62ra62ra62ra62ra62ra62ra62ra4vXy4vXy4vXy4vXy4vXy4vXv92Oqe529iFPpfDc9y5YoeSHnrava4clf6eiw62re5e5e5e5e8c5e5e9q5c9q3vO1111Wjc915vO052Nj8cvy4vXa5vTy3e9f5elf6Hlf6Hlf3JOy5JXq9cOf6cOf6cQl62Qf62Nm8civ6HTh7HvE7Hvj4cry6cls5Hgw6crw62a04Hap8eiw62ie5c5w5cQd5Hry4JXs7HOd6HDn7Hiw5Hiw5Hia62ra3rQ03eiw5Hiw5Hiw5Hid4Hln6JXj5eJl92as5GQn929t4Hvw5HOx6HQw5qrx5H905clr6HDs6eQo7HOno35r91Nt2Jlq7Hig8clu4evg6vQo4GXk6HOf6Hra62rn8cXk7HO06eas62as6eas62r97c9j61Nk5Hvw629g72vg72vw5vXW7era7c9d5Hgd6ciQ8rXf3eOw7Hik8HOf62la61Ta5ert8eim5HXw6H5f5eTq7e5h72Ow7Hij62Ta6HXg62iq5H5f6H5ao3Ta6Jli8c9s7Hid5Hgw6Hrf62la7erh62Qa82al6er061Qa3er07rNf6era3cDw8ein5HXw6H9j5cQe7Hik5HOw7HiE7evw4vXy5HOwpeXw3qgh0cQE7evw6HDa72vg72ak8qrl92NQ3eOf6HTl62lj8HDk8x9w82Qg7HQa72rq5Hid5ciw6JQa5c9w5Hiw5Hgd81Qw5Hil6HNf6cTa62QW02Nf72Ok6clf82lv6cJl6HOb82Xx5Hgh72vk8elx9HJT6cvU6Hiw5H5d62Qr72vq72Os6cva5H5w8cgf62Dm6HDq5G5w62ae5H903rNc8eaq5Hlf5q1I7Hvg72vf9vQI7cTj7cTj5HTq7e506Hia5Hva7Hig72rf82vh6c5w6erd6Hvw82Xg7His02ra7ciw6c5e6eNb7era6Hif62if62is725s5H5l7eQe82rd6ela9ela6cla725h62Xf62if62gg7e5w62Jh6eQd5els62gf6cXe62lf6Hlf6G9w62ra625e5e5f7eQh7eQh7elf6Hla5erf6Hlw5Hiw6Hla62ra62as6eag725e5e5e9eaw5e5e5e5h7eQh7eQh0cra62gd6cgs6eaf6Hlf6Hlc62gd6cXf9cQc9q5a6cak6Hgk6Hgh82rh6H9c8eXw92lj7eOg0cOf7cOk7HOk7Gvd6Hlf6Hra62rk8eXn8cXn8cOk7HOf5Hlk7HOd6cgd7HOf6Hlf6HQh7eQl82ra62rapcQf5cra62rm8eDm8cXno2lf6HTj7cTh7eQk7HOk7HOE6HTj7cOk9eOb8G9k6Hlm6HTl8crf7G5m7HXx5HJh6Hvk7qra6Hlb6Hgj62rh0qrb6Hvk7Hgf6HJf92gl82lk9eJn9cid7elg7HDf9xilp2ggpclQ7GQn0xgE6HTh6H5f6Hlf6Hlf6Hlf6Hlf6Hlf6Hlf6Hlf6Hlf6Hlf521r521r521r521r521r521Q02Xaw5meya0wjW2etSuaa7mYqs1d52Th72gd6cgw5Hiw5Hiw9eiw5Hra62ra3JJ1111Uner161Dp5xim9cOr4JNd61Je3cgj5HTj7cTj7cTj4rDr6e5f0HXj7eXj7eDv6HJj6Gac9cgW7HDm8HOI8cJn52lr72Tf6cQd7els6cvi5eli9egd6cga62rd62Xh6clt5rNh8cXh7x5x8Hgd6cgd6cgf6Hlf41Ji42gd6cgd6cgd6cgh5cTc7H1m639c0clf6qNx9Hre5eOd6HNE7cDd63vE6cl06eTq7x5g72Du8cXxixgw0c5e31vs8cgl9HTr52Jl7rTu5wrn7cXj7clf6Hlx9x9b8HNi6Hlf6Hlg6Hlf72lp8ern6H5n6eJd6crk7HOk7HOd625U8egf8erh6cQh7egT9e5j3cXd8Hgn9HXj6HTf6JJf62le9egc6x9d7Hrk62Da8erm7HNd8Hgn6HXf7x9k6cgs6crj7cidixNd7vvy9caf8cgh6cQd7clj6HTf8egm6cDd92vv72li6JJf42li825j6Hlf435d9egx6x9d7Hrm62Da8Hgb6cNd8HgI8cJd521r6eXdoG9d3xOnpHXI8cJd7x5f7HOk7Hlb9qQv0qrY42Nj7cXv6HTm0q5n9xgd8HDl8cJf82gs6cgh62gd7vJf62rd6cgd6cQh91Jd6cgv7xrj7eDf6HJUpqrk7HNn7eTj92TQ7eNb7HNW939E6cQm7HOn92TEp31P7eOK7cgd6erh6HDq7HOs7HNg7eOd6crd9cQj6x1c7x5s6xgs6Hva6cri425W9evs6cTj63gH8HOk7HOj0vJH8cXn8cXn6eDa8eri7cgd6cOd8Hak7Hlj92Ol7erd72lh7cJd939k8Hgfp2gd8egd7eiw73rz8elf7cgj6cgj6cgg7Hig6crv82Ja8Hgh72Tf0eTf7eTd7Hil6G9j6cgj6cQk82id6G1l6HJh62Tg6HQj7q9w6HTj7cTj7xld6cgd6ciw5Hij82Jl82Jl82Tj7cTf62lj7cTd6cgd7cTd6cgd6cvg72vk7Hiw5Hiw0cvd62ra62rl82Jl82JlpHgd6cQh7eQg72vj7cTj7cTW6HQh7q9j0HJW0qaf7evb7cQn7cQm92ll7crW9q9d0eTm8eNko2Xk8eNb8HNb8GXh7cTj7clf6Hln9q9x9x9x9cNb8HNk6cOb8HNh7eQh8cXj7cTj7cDm8eDv92lf6HlfoHJj62lf6Hlc9q5c9x9xicTj7cDm8eDm8eDb8HNb8HNO7HDm8eNn0cNz9Glb7cTc7cDv9clj8Gac8x9E6cNm7HOn83vf7HTQ7cQm6HllpxQQ7HOb8HQj7x1j02Qb8HOb0q1x0cgh8eOk8x1j0xvvoeQkoHTT8GNxo3JO7HDm7cij7cTj7cTj7cTj7cTj7cTj7cTj7cTj7cTj7cTj5c9q5c9q5c9q5c9q5c9q5c9Tp39dsS6kraPnnsPlq6MbdRsZaWOh5cXm7HQh7eQd6cgd6cgd0cgd6cgd6cgd4rX1111Lc2l16vXo63lv0cXq5e5h6vDw42vl6eJl82Jl82Jl4vXq6H9gpx5m835m82Nz7eNl7qvW0evT8x1b9cXJ9eXc5eTe7cDj72Og7HQf72Ou5HQu02vg7evf6cgg6x5k72Te5H5k9q5l8qaW9cvg72vg72vh7eQh4rDu4evg72vg72vg72vk62DQ8e9v6qaQpeTj6FiW0egw5cDg739U8q5f6qJU72vo6cJa8qak7HXy9q5WuGTspe9q31vd9evn0cJq5cXn7JOy5FQc8q5m8eQh7eQW0qax9x9u7cQj7cTj7cTj7eQp92gc7cic6HXg7egn8cXn8cXg6ciL8Hvh92gl72Jl82vO0eim3G5g9cvc0x5m7eDh7rDh6eQq0evW73ag8cln6G1d8Hgb8q9g9cvc7x5j83am7evf72gl8eaguFrg8rvt0cgj9evl72Jg8eQm7eDh8Hvb72Ng9HOz7HQu7rDh4eQu8Hil7eQh4qag0evW73ag8cgv6cNd9cvx739g9cvJ9eXg5c9q6G5giGag3F1ci35J9eXg83ah8cXn8cTx03Dzp3lP4q9m8q5z7eJvp3ac0qTg9cNn9eNh8cQf72vk6cvg81Dh6cgg72vg72Ok9JDg72vz8qll831h7eNLoqlm8q9c82Dl9HDT839x8q9T9GaU72Jb8eDc02JUo3iH82XD8evg6Hgk7eNa8eDf8x9j7HXh72gg0eOl7qrQ8qrf73Tf7eTd72gu4eiY02Of72Jl6xQS9cXn8cXlpvDA9q5c9q5c6G1d8Hgu8evh72Xg9cvm8eQm9HXb82ag7HQk82Xg9Gan9cvjo2Qg92vg7Has7xlE92Qh8evm7evl72vk8caj72gz8HNs9cQk7HDhpeJh7HDg8cab7qgm7evm72On8Hag7qib7cNl6eDk7eOl7Ggs7eDm8eDm8qTg72vg72as6eal8HNb8HNb8HDm8eDh6eQm8eDg72vg82Jg72vg72Ok7HOn8cas6easpeTg6cgd6cgb8HNb8HNboHQh7eOk7HOk7HOm8eDm8eDY7eOk7GgmpcNYpqQh7HOx8eJc8eJb9HQb82gY0qagp2Dv8G9ni35m939x9x9x9z9l8eDm8eQh7eQc0qaW0qaW0q9x9x9m72Dx9x9l82Jl9q5m8eDm8eNb8HNz9HQh7eQhu2Nl6cQh7eQW0qaW0qaWuHDm8q1v931b8HNx9x9x9x9J8q1v939cpq9E0xOx8eJW8q1z0eQl9xQW9qaU739b8eDc8GJh8eDR82Jv7eQboxDR8eDx9cJm83imp2Jx9cDxpqiWpcvl8HDm9qrlpxJzieJnu2DO9ziWi41J8q1b82al82Jl82Jl82Jl82Jl82Jl82Jl82Jl82Jl82Jl5Hiw5Hiw5Hiw5Hiw5Hiw5HiOo3ggfSWQeS0Rc7eQwEcTgX34dErl635v8cOk7HJg72vg72vgpevg72vg72vg4vN1111GQ2Q171Ni6qTzpq5w5c9j71Xd42Tb6HNb8HNb8HNb4JNw7crkoGav8xrb8x9E7G5b83DTp2TO93ix0q5D031z5HOw8eNl7cXj8eOh7HDy62Oy0HTj7HTg72vj73in7cOq6e9n0qan8GvT0eTj7cTj7cTk7HOk4vXy4cTj7cTj7cTj7cTn6eNT92iz6GlToeJl7zlTpHva631j7xaP8Gik6F1L7cOi72Xs8Gvm8qit0qaTt3Ddoera3rQg02TvpeNa635c8vJt6wXW8Gab8HOk7HOTp3vW0qay82Jl82Jl82Jl7HJo9Hvz7HrQ7q1j7Hvc9q5c9q5j72gH9cOk9Hvn7cXn8cTJp2gb43aj0eTQpqrb7HNk81Xl6HJap2TT7xvj92vv73ig9cvx93aj0eTz7Gik8Gvv7HTh7cvb8HgjyFvk8JQepevl0eTn7cXj8HOb7HNk9cOx7G9k0cDE8eOy7JXk4cOy9erb7HOl4xvjp2TT7xvj92vz739g0eTW7xaj0eTD9G1j5Hiw7qajuGvj44rzu3iD9G1j8Gvk9q5c9eJW0F5Eo3OJ4xav8GiE7HNxoqvQp3Dj0q9v039k92Oh7cTm72Tj8JXk72vj7cTj7cXm0vXj7cTE8GOb8xik7G5GiqTv93rW8x1b0cNI8xaW93aP0xvP7cXx931Q0HNPi3gA8x5C8HTj7evn7G9d931h93al8x1k7cvjpeXb7GlT8Gvh7xDh7HJg7cvy4crO0HDh7cNb73DV0q1v931bovXV9Giz9Giz7qig9cvy8HTk7x5k0eTv92Ob0x5x8clj8eOn8G5j0GQv0eTli2Ok9HTj8elf83OU9cOk8HTb7HTb7HTm9ell7clE9x9f0eOm8eNlo2Nk8eNk9elx7GQb7HTb7HDc9clj83gx839n6HNm7HXb8xQf7HNb8HNb8GXj7HOk7Hlf6Hlb9x9x9x9x9cNb8HNk6HOb8HNj7cTj8HNk7HOk7HDm8eDc9elf6HlfoeJj6Hlf6Hlx9x9x9x9xiHOk7HDm8eDm8eDb8HNb8HNO7HDm8qQbox9Oo3Jk8eDW92XQ8HXx0cOc8HvOp3vjo2Nz9xacu3rv9GaW0qaW0wgn8HNb8HOk7HOQp3vTp3vTp3aW0qav7x1W0qan8cXn03rb8HNb8G9x9x9E0cOk7HOky35b72Jl82JTp3vTp3vTt2Nb8Giz9Gix9x9W0qaW0qaD93iz9GaQoqaUpxNW92NT8GiEp2Ob0qJT03vP7xax931Q9z1k92NI8HXz7HOciz5U931Q0eXv8GgbpHXW0q1Wo3gToeTn9x1v03lbow1EucXcyeNJ0wlTu4rD93ix8Hlb8HNb8HNb8HNb8HNb8HNb8HNb8HNb8HNb8HNb6eas6eas6eas6eas6eas6eaJi3QkhA6PwsYJQ7SPsf6Hk9LygEDn6qrx92Dm8cXj7cTj7cTjoeTj7cOk7HOk4H51111AEHT17c1u6GXWo3is62rl7vNf4cOc735c9q5c9q5c521s82amixlx9qlx9qaY8xrc8z1IpHJK9xaWp3iX0GiE62Xa8G9n831l92Xk8eNt6cDtpcJl8eJj7cQl7xav82Da6crc0Glc9xOIp2Jl82Jl82Jn8cXn4JNt4HJl82Jl82Jl82Jv6x9I9caW7qTIi2Xn84OIoeTs6q9l83vH9xgl7wrH82Du7x1f9qOb8Gar0GlIr41gi2as3vTj0HJzoq5s6qrz91Dr6QiR9xlx9cXn8cXIpGOTp3vt8cDm8eXn8cXn8cXi0eTE8egR7Gil8eTz9Giz9Gil7clS0eDn0eTc835c9eJDpHlx4qllp2JRoqlx8x9n8vNn7eXspHJI83Ol9cTx7xaj0eQW9Gvlp2JE8qgm9qOx8eJk82Qc9cvlr4Dm9vTqo2Tn0HJc835l9cXx8x9n0eDW8qampeNY8HXt8vNn4HXt02gc8eDn4GOlpHJI83Ol9cTW7xahp2JT83vlp2JX0qil6eas7GllyGOl4wvWy3aX0qil9qOn9Giz9HXTpFaYoGXD4Gvx9xgY8x5Wi3ORpF5lp3az0Grn9HDk82Jv7cJl9rNm7cTl82Jl831vprNl82JY9xXc9qan8xrAuqXx9xlR9q9cpq9L93vT9xvJpqOH835W9x9Rpx5Hu3QV9qiM9cJl7HQv8xag9x9k9Gvn93im82Qlo31c8qTI9xOk845k8cXh82Tt4HgJpcNk835c7w1-p3iz9GicirN_0xgE0xgE7Gaj0eQt9cJm83im0HJx9cDxpqiW9eQl8HDv9qilpxJzp2Jnu2Dm0cJl92Qh8GXP0eDm9eJx8eJc8eJb9HQb82QY0qahp2Dv8G9ni35m939m9HQW8qJx8eJx8q1z0eQl8xQW8xac7q9b8q1c93Jh8q9x9x9x9z9l8eDm8eQh7eQc0qaW0qaW0q9x9x9m7eDx9x9l82Jl9q5m8eDm8eNb8HNz9HQh7eQhieNl7eQh7eQW0qaW0qaWuHDm8q1v931b8HNx9x9x9x9J8q1v93JxixaJi41m92NR9x5R9x5WpeDQ9eTJpGOloG9W0qvzy3lx0qlR0GlR0FOc9x9x9cDm8eDRpGOIpGOIpGvTp3vx839R0Glc9q5c0Glx9x9x9xaW0qaYpeDm8eXmtqrc7cXn8cXIpGOIpGOIr39x9xaW0qaW0qaTp3vTp3vX9xaW0qlRi3vPow9R9x5I9xaYpHDc0F1I0GOH83vW9x9R04rm9x9L9q5W8eDQuzaL9x9R0G5x9qQxox1Tp39Ti3QIieJc0q9x0GTciwrYyx5ztq9D0FOIy4vX9xaW9evc9q5c9q5c9q5c9q5c9q5c9q5c9q5c9q5c9q5c6Hlf6Hlf6Hlf6Hlf6Hlf6HlDu3Jml7cAaA6CEZsAf8YVm0jhjRac6GgW9G1v931l82Jl82Jli2Jl82Dm8eDm5291111VYcJ1825y7w5Ti3gf6ean821g4cDz7xiz9Giz9Giz5e5d8cgbuxTW9GTQ9GlP93lz94iLocXF03vRpGgBpxaT6cNd9qrv8x9n9x1m8G9r6HNroeXb8HXk82On83vx8cNs72azpxTz03XLpHXn8cXn8cXv931v521r52Xb8HNb8HXn8cXz73rP0egT7xDLiG1v8zNLoHJf6xan8xTS03vn7zvS8HNu83ih03Xx9xlepxTLewrhiHlf3vTlpcXWi3id6xgE9JXe75vU03TQ031v931LoxXIpGOr92Nc931v931v931up2JT8HlU8xan8HJE0xgE0xgn82vC0HNvp2Jz8xiz9HXXocvQ4xTnpcXUi3TQ93rv921v7G1focXL8xXb02OQ7Gvl0HOR0qOnpHXT8Gvb03XW8HNm8HOQ02Tbea5b01Twi2JvpcXz8xin031Q93rv0HNR8Glboq9P9x1r921v531r0Hlz8HNv53XnocXL8GXb02JT83lkpHXI8xOnpHXBp3an6Hlf8qTntGXb4zOTyGvBp3an9GXv0xgE0x1UozQOiF5X53TW03vP93iTiGXUozanpGlWpxlv0eNm8cXx82Xn9H1b82Jn8HNn8x9xo21n8HXO045Q9Gvv93lVyw5W0qTU9GaQoqrG9GOI0qOFoqXS8xiR0qaUoqrSy3J-9Gh302Xb8eOx93vh0qam0xOv9xgb8cOnoG9Q8GDL03Xm8zrm931k8cJr52lDoq9m8xrQ7Fu4pGaW0qazue25pqQYpqQY8qvl0HOr02Xb8xgbpcXW0eNQo3gR9HOn9cNx03gnoqNWpHXvy2Nbp2Xn9cOk9w5Jp2Nb02XQ8HXQ8HXx0cOc8cOO0GlkpHNx9xrviGrb9xrb0cOR8GNQ8HXQ8G9E0HOn93JR93lz7Grx8G9Q9xNk8GrQ03rQ04an8HNb8HOk7HOQ0GlR0GlR0GrQ03rb7HNQ03rn8cXn03rb8HNb8G9x9x9E0cOk7HOku35n7HOk7HOR0GlR0GlRyHNb8G9x9x9x9x9Q03rQ03rF8G9x9xNQuqlFiFib9x9U0qiU03iRoq1R9HJFoxXniGrT0GOEt3TWp3TUpxTUpzNz03rQ031v931UoxXLoxXLoxOIpGOW8xaUpxTz9GizpxTQ03rQ03lR0GlPoq1v931vrqlz831v931LoxXLoxXLeqrQ03vTp3vR0GlIpGOIpGON0qvTp3TUu3OJi4gU0qrL03vPox1zpziLpxXS8xOR0qaU0Fvv0qrH03iT931RyzQH0qaUpxiW03DQixiIpGaIiGDLueXz0GaWpxDQuwvOtxiErxrXpzNLt4JN0qvR9HTz9Giz9Giz9Giz9Giz9Giz9Giz9Giz9Giz9Giz72vg72vg72vg72vg72vg72vXy3Nbn82-ddx2YRC_gXy4bj7WlRXz7qQT0x9x9Gin8cXn8cXnu2Xn8cNb8HNb5ei11124J35192rr84vLuGJj7eQz92ik5qiY8xQYpqQYpqQY62rj9cQztz5Up41UpqXF0qDY0wOSuqiBpxXLiqH6i3OK7qah0GTW9xvx0Gax03lw7Grqu3iz03iv9q1z9qNT9Grh8eQTiw5TpzaSiq9x9x9x9x9W0qaW5Hiw5Giz9Giz9Giz9GiT8qTSpHTL8FaStqgW9QQSy31j7xOz9z9MpxNz8Q1M9Gir93vmpzaR0GDaiw5Sa4Jnt2Tj41Jvi3iIuGQj7xJOp25a86iHpz5UpxaW0qaSuwaHiw5w0xrE0xaE0qaW0qatox5K02OJ9xOz031Oo3JOo3Jz92P3oxrWox5T9xvTp3u1ueOU5w5xiq9Jy41U0qTW0e9W8GajuqiS9Fazpx1U93Xcox1LpF5ziqiK03NQpwaI03ic9G1YpcXza5OQpvJduG5Wiq9T9xvxpxaU0qTWoxrL03XQiGlF0Gaw0eiW5GawoeOY03rW5zazuqiS9Fazpx1L9qXviqiH9F5ziqu6oGOz7cTj9z5xqwaz5aaKeqM6oGOzpwaWo3JOo3aHua9FyFW25F5UpxNF0qQLyFaJuwDzixXIi3DWpGrc9GiR9q9zpeiQ9q5x9Gix9GvRiHiz9GiFpzQYp3XW0qS4rwQUpF5HpqTYiGTVp49Gpz9BiFaM9GvLpGOJu3QMr4u9pqHipx9z9x1T0qXmpGOcpF5Wp3OQ9x1zuxvY04rSpzac9zJx0qgv9x5w5HONu3lc9GQY94HyiqOIpGOYteuyoGNKoGNK9xXcox1wpx9Q9GJQiq9IpGrUixJPpeNx0GrTpqJzu4gIiq9Wr3rQoGix0HNb0zQXoxrQpxiU039Y03iRo2NE9HNGoqDbixrR0GTWyGQQ0GTQo2NP04lU03iU03lOoeNz0w9P0qDY8GTR03vYp4lb03TUpxTUpzXx03rQ02Nb8HNYoqDPoqDPoqTUpxTQ8GrUpxTx9x9xpqQQ03rQ03lR0GlOo2Nb8HNbt3gz8HNb8HNPoqDPoqDPe3rQ03lR0GlR0GlUpxTUpxTB03lR0FlUtxDByFOQ0GlHpxvJpxQLiGaPpq1BuwazyGTLoz5Oez5Ioz5Hiw5HiaQTpxTUpxaW0qaJuwaSuwaSuw5Hiw5I9GOHiw5Tp3vTi41UpxTUpxXLoxXFiGaW0qaWqGDY93aW0qaSuwaSuwaSa3TUpxXLoxXLoxXHiw5Hiw67pGXLoz5Jt45Xy4XHpxQSpxXFuqaYiwOSi4aM9F9LpGOHoa1WpGTCpqvL0qaPrD5CpxOHiqQUpwiUyxvGixTGyFiStqiToxOIiwrYta1Fq3QOw3Y1iaQSeQh7pGXLpeXYpqQYpqQYpqQYpqQYpqQYpqQYpqQYpqQYpqQY82Jl82Jl82Jl82Jl82Jl82H1r4lQxT7qhZxdJ0pqlYngQoU-vC5Y8w1LpGlRp3vx9x9x9x9xt39x9xrQ03rQ62g1112oSGr102gq94NDtz5m7HOT02av5xgL9xXLoxXLoxXL6cgm0cDRewgKowgKoziVpw9Lpa9Nt3m3oFrFuF6uuz1S83QlpGNU0xDRo3QEp3Os8xvsyxlRp3lQ0qiR04rO0Gvk92OPuzgPoFJNuGgE0xgE0xlYpqQY6eas6qlR0GlR0GlR0GlP93NBi2DD9zOBrGQU0W9Ntqrm841R0Fc5oFrT9Qc50Gle0qXvozJIpFiduzgNdQrxrHXn4vXWuxlJtqXm8w5Hoeid8SDAoFgKoGQYpqQNt4JZuFlspqTYpqTUpxTUpxQeu3aSp2XA0z1Rp3rHiw5Hiw5R032piGvYu3aP0GDPoqm9t31K5FgEuGgAtzgKpqNYpeaY9GQnt3lN0FJRoGrK04rWiGiFi4lRuGlSp4aTozJJp3lW0GiLoG9TdsrToJXhtxaUuxgP0GDRoGQKpqNYiGvFp4iTyxOVpGQspeaY6qQsicXLp3QY6wJRt3lN0FJRoGrD0wizuGlZ0FlRuGmuu41R8eDm0zgEazJR5DDDwweuu41RozJYiw5HiqTZyDTCrQ206wlKoFaVpqXDrzJAt5rRy4iJuziYi3vW0GlO03lRocaY03rR0GlR0GJOyeaR0GlCoD1LowrYpw0oqa1Ji4lAoqNLyxM1owvXi4m3yzH50GDFi41AyxC5q4Weow6soGgR0xiOpwici41WiwlUo45T0GiRtqJLp4TBoFOW0QrEpqTz0xas6eC4yxOW0GXL9DufuF1Ji41Le2sfuwaSuwaS0zrWiGisoGgT0F5TuGgJi3vKy45FoqiEpGQOoz5RyzDJuGgUq3vTu3lEo3izpQ1-u3vYoGlKp3gLp3lIiqiU0GiXiFizy3vOpGNYrxXYo3NTiqiFpwDKp3lKp3JHiGiRpwvFpziP9GNIpqJLowDzpqNKoGNKoDaEp3vTp3iz9GiLiFiFiFiFiGNKoGNY9GQKoGNE0xgEoxXTp3vTp3OIpGOHiqiz9Gize3TR9Giz9GiFiFiFiFiFwqvTp3JOo3JIpGOKoGNKoGM3pqJOo4DKewu3rQ9Yo3OZoGDAoGXFyxQGoxe3t4JRrxNDiFlHwzgJu4lZuFlZuS9PoGNKoGQYpqQAt4JNt4JNt4lZuFlJ0F1ZuFlPoqDPuzgKoGNKoFiFiFiVyxQYpqQYs49L03QYpqQNt4JNt4JNdxNKoFrDu4rFiFiZuFlZuFmyi4rDu4lArFl-tQgZoGXNoFrVt3QLuD9NuzH50FvFi41AiDvYi3M1oxDDpqQGqDW1i41ZuGDKozTKr3DXy3NZrzTNe3lPiF1JuzTLe5vCaqDHsqM9uS9NwQCyi4rFox9LoxXLoxXLoxXLoxXLoxXLoxXLoxXLoxXLoxXL931v931v931v931v931v9329q4DTEC7zlXjRSVyQvpEUTm4sQViP94aDiqJOoqDE0xgE0xgErGgE0xvTp3vT6cQ1112wBxQ1p2Qa9DgVe4gv8cXOp2lx6qTF0wiFiFiFiFiF7eQvpcNIwwJDizJDizc1owlFoQW3rxP0u4TXtwhst4rB8GDbi4rLpz5IiqDUo41f9qDfr3OOo3OYp3lIp4vHpGJn9cXHt4JGu503tqTUpxTUpxOPoqDP6Hlf6GOOo3JOo3OIpGOG04e3uq1V0D62qGXLpWH3eqvc8FaIpzCou4TO0s2io3OapwiziD9Ji4Qht4H3gDOWqG5c4JNYt3ODrFic9wlAicah9ElNu4JDu3DPoqS3rQ9MtwDfoxNLoxXLoxXLoxXwyxvBo39NpzrIo3vAuzgAuzgIp30qy3JPyxvGpF9GixPrrx9D6wJUtqTNewJDowrPoclL0GXcrxP3pD9Ou3QDpwTTy3lXuwDItqOBo4OOiD9So3JYo3lFu3aOgSXOu1Nke3QLt3TGpF9Iu3DDowrPy3JXo4vOr421i3DfoelP6GDfuG5FoqDL6D9IrxP3o59Ou3vVp4vRtqOMpFDItqPsy4rI931vpzJUf59O6saXswcsy4rIiD9LuzgAuxXMrW9_qamr6FDDu4P1owiCqa9NrQOItzvDt4vPu3JYpGOHp3OIiHlPp3vIo3JIpF5HtHlIo3O_u5lFizTPowmwaagSuwDNizrFr4e8izX-uwS0r50opF9XuwaNr4uowFMhizhnu3TOpxlHowQQuwaYuzDLiwgOpGlIrF5Fo523u59YpDOUoqXRpGvf6G6pr41YpFiF0DPvtwaSuwaFw2mcyFOByFOBpzTTy3lfu3OOpFgOtqTSuqDDtzgXixlIi3DHiFlIr5iAtqOLa3JOyxOIiqlRoDm6yqDPiGODo3OFo3OJuxlKpGl-y4vRtxJHi4rLqwiPiwrOuxlXoarDo3ODo45Ay3lIozXXozvG0FrJow5FiarRowrDu4rDu5JIo3JOo3lR0GlFy4vXy4vXy4rDu4rP0GDDu4rIpGOIiFiOo3JOo41Ji41AuxlR0GlRqGNI0GlR0GlXy4vXy4vXsqJOo45Hiw5Ji41Du4rDu4e0ow5HiarDw4c0qaQPiw1Mu49Nu49Xr3DZiGc0rQ9IqwrVy4DAszJSyzDMtwDMtsTGu4rDu3DPoqDNrQ03rQ03rzDMtwDSpFaMtwDGiz9Gt4JDu4rDu4vXy4c1r3DPoqDPfwlFp3XLoxC3rQ03rQ03gFrDu4TVyzTXy4vMtwDMtwSduwTVyzDNqFS6eaDMu4u3u4Y1rxDFtaW3t50opFXXuwaNy61Puwe8iF9VoqDZaS67uwaMtw9DiD1DeF9-tzaMqa23qGOGy4aSt51FqDN_dw9AfzertsH3sWhduwTXiGaFiFiFiFiFiFiFiFiFiFiFiFiFiFiFiFiFiFiF9Giz9Giz9Giz9Giz9Giz9Gura5rOUV3Sv0dCBIqSzkLNO-bOTBrG9FOCuz5Hiw9IpGOIpGOIqxOIpGJOo3JO7eO1111111131151111112r11J1211127v111rg11151111111111ri11112111111111111111111111r111Jr62vl93rTo41Dy4H1e5cia6egf72Qj7HJm8cNv9q9z03aE0GvYpxOOoqXKi45GiFrSuzlXywTBt4D-tD22rQu5eah8q5WpqDHuwQMras0ws6sdsSchdWPlfsCbg751gEuQhdhRj7WUjAHPkEMJlf0Fm8sAmZcCnRPNbfC_v973vXq6cTn9xgUoz9AyzC3eQYyaWhjfE0EjECGmRY-vTjpzYpdEYVxYUULOIjVKOo7GOBqSPInXLkUBKoA-KN42JOt5Hlk8GiRpGNFuFO_rDr4qDMwsSPbgAmIkZuZnZ-1121wJ1111z13111g1412-1fN2Qv8_1cO3uJo81OQ3Zru-1XT4z1yc1NX541et26J5fJqe8TanNG1s92Xv9x1E941viG1V94Jvtx25981vnq309prvYG3O9rac5G5d9q1c9x5E9qXcfx939vgx4G9q9cax7x9n9xOxq30v9EaW13a30rJW53aa0evWTqdI0lTWFGfE0EIB1K__1111913v1h92-v9g1zl3Hvo01Pv4bvy51XJ4zvyz21554vee26X5Q2V18K9v5G1f931v0x1J949vyq1N94Xve32J98rvbG3z9plvI3569eic6x5v9q9c0x5L9sOx1x979vNx5q9s9cQx8x9I9Qvxg30Q0r1W1xai0e1W63ag0j5WUxfp0lNWCxhU-J8____z114_611111135J11_c111tGv114-6J11114MSbZa_mtMDKAxXJ_xTJ1111111y36X0kc4-36Xt_cdn2XXCIzWJ11114vWL1eX4Bvin5bXeBbjP_mX7KvtMVdZKBnxJ11ZUl11uCDZR8nfMXKZz4mtMD-ZwfmiPDKZqFlWmGuAL_ljPHaAMO6KJ121111xv111Qg3a1111Wr1110a1113f1111Eg3z11111111111111111111Pr3A1oE1111111111111111111111111Pv3B111111111111111111111111111111111111Pr111oa1111111111111111111111111111111111111111111111111111I13z19r1cr9B10g1CJ3719X1xJ3m1pQ1Y15619T22v3410i1BJ4J19D1WJ391ii1Zr4L10X1Uv4G1t51NJ3x1pD1Gr481pX1gv2z1011h14o17a1G14p1iN1F14u1iX1V12E1u91D14e1pN1hJ4S1051Sr4w1ur1j14U1yO1xr2U17Q1jJ2P17J1kv3v17N1lr2J1891lJ2S18r1mv2Z1yQ1n12V18Q1nJ2M18J1L13c18N1bv311951M14O1oT2ev681rv23r5p1rO1_r4-1av2qr6p1aO1_J511rJ24r5y1r52w16u1aX2wJ6r1s524J5r1e525v6q1si1-14C1sr2sr6d1sl2d16h1sT2dJ6l1sD2fv6b1d12gr6x1di1-v4d1wX2tJ6Q1da2hv6R1dv25J5a1dQ2jv5s1eg26J5g1y51Xv5h1eT2jJ6O1eO281611dD2kv6K1f12lr6G1eD28v3J1o528J5v1fi2m15c1q929J5Q1fa2mv4B1tJ1XJ4Q1Qv3qr5R1qv2mJ6X1fQ2nv6B1fJ2br6-1qQ2pv5I1qJ2bJ711g52vv741gr1LJ5P1qX2oJ5J1ya1Cv791gQ2xv7o1zJ2z17u1Qg3eJ5W1qg1SJ4v1uT1AJ4l1uN1A14n1aa2Rv7b1gX2T17c1j92Y17W1jg2YJ7T1w51U17Y1jT2UJ5G1jJ2Ir7L1jN2O17H1k92OJ7D1ka2Pv7Z1wi2L17C10N2Lv7B1kJ2Kr7-1zD2KJ5D1l12Jr5S1wg2Jv841lr2Hr871ll21v891lQ2Gv3k1lO2F15Z1wv2Fr5C1lX2FJ8r1m52Dv8w1mr2Sr3G1oi3u15V1og1PJ451ol1P13S1ia1vv4319l2t1re22955Jra22a56vrf22v57rrj1tl2E13h1yD1JJ3W1121dd2bsShss6uqas2twQSiqDW9eDh6e5u3ra1_tzDNyFTCy4lAuwrFiz5JoGXPo3OUpqvR0xaQ9G9c92Nn8eJk7cQg6Hgs62iq5e1t4vDi3JT031l72rr41v51o5azeE1vO3hvO1rE9Dc9oqH69Dgzgq3J0E7J23gzq5vPo5azeE3J975vO5hvO1rE9Dc9oqH69Dgzgk1vg33J0E7J977J23gzq5vPo5azeE3Jr75vO7hvO1rE9Dc9oqH69Dgzgk21g33J0E7Jr77J23gzq5vPo15r94J1t3DO95az9o4ue3ivL16jasvz9o3ue3uh9o4Pasvz9o2ue3uh9o150W6g9G3J4arzdq5coqJv95agj5rvO16v95dJeRhTxQsve3DO1k5o3QizrAapoqJ1OrTorGu43GDO1o1T9Z3H1qv-1k1T9Z3H1xc6yI5311vuoqH6O3Jze5dJpGu5oqJvek140ascho2rasc6e2Oc9sQPoo12rAizgI119DpJ4GOPo326O124g5rPo17J2QyJ2DuW3xDO97EJr77J19OvOqF1xTGX512xg3Oih3uQgsHgO1ucdqDOek1epB1Y9DqJpfIQ73DOL17Es6xJ3ayX1r2adoQ1ot-1OqL1e5ehdqDOxvu6xTU8O25IO3Qzeo1YnLrgoqJPo5Pqd366e2OzegJvO1iWes0ge2Oc9sWhoqJ273NPo5sWO3Jze5dJpGu5oqGH52649DiooqGH4vM49DiooqGH41S49DiooqGH41S49DuW3GDOOrXtrGu4hrOPoo5r5aizrAaooqHoaWc6e2Oc9sQPo15vO1iW9DEJr73J97ivO12qd3yJ1xaX9B130daX19Yzy2Oc9q5c9sQ2oqH6jk10rA3p54TPo17J2qar9G3pMr3J1d1zBnJPo17J2qar9G3pMr3J1d5zBnJPo17J2xarMr4PB3DOO104O16qd35c9q5c7DgzeE3pxQgz95jpg9YcLt-1gxiv53ypLr5j1eUpl5sv9o11a6xJ1d7X_BUo7B27z6EJ572T1wYhoqJvek140ahqqB1wasPgO19Wex2Tgk140k140wNz9wvk9e6hoqJvek140ahrdo130agvj77J1GdJ1Ga_9G5X7G5edqDO1o18rB17rJOPo4VJpxTPo4aPo8jJoquJ533JoaavO12rdo12gsQVoHvPo35c47rzh9LXr12xoqJcO92ed1HQ9AqoL311gcLG151KpSEJ1E1Po37JJ66g47rzh9LX6ssx7B91v3NIdk13g3DO47rzh9LXr12xg3icoqGD1151111sO1vEO1vEO1vEO1vE4H1d5DsTyI126xDOP11211116k190I190I190I190vNr6cu6j7aVO15doqH69G269o552qdpa6vEggUo7GhvxTHhe3DOexu7g9UpexiveTYvxE7X_X2x9G1r9XUHoqApl5sv9o11a6xJ1d7X_N3o7B21z6WT1wTPoo1FpB1UpxDOequ6g3u6g3u6g3uAj2xJv79voqHoaGuoasYgy2Oc9sQPo326O12ado21e326O52ce2Oc9sQPo5dHi3M69Dscgo12g7W5oqHoasxJoGuJO2rzrcOc9sQPo5Ped33J1Gs6jsuge2Oc9sQk9q6hoqH6O2e4O12vgB12g7W5oqGJoDs5oqH69G26xE25oqH69Dsve3DOqGuedoQ1i__vOwrv7BiF14r1dae5oqGJ6QugO1iEegYgh7jJ8A1kho1vg7gvd2OcO52hO16cdqughsEJpqu59H3Jpn1k9q5c9q6hoqGJ6QugO1rWedqJ972E96vk9k21dk12gqughsEJpqu5O1rWO1lW332g1cO4dk160e3J23aveI150qu3to180e3J2xaveI150k12g3u3t32g1eO1dk160e3J23dJpn3J2GarO1gWO3RvO1rWO1lW332g1cO4dk150k140au9O1gWO1iWO16vrDvk9sQc9q5c9q5coqGJ6QugO1rWedqJ972E96vk9k21dk12gqug7AshO3Qzeo160k190rvvd19k1SEJ23arO1aW95jJ23azrzGJ23dJ2Ga9O1lW5o170q27O1rWO16v9D9N96v27J2hO1rW5o160k1YXo1Y95sWeo180e3J2xdJpn3J2qdJ33a996v37JuhO1aWO1iWrDxJ23dJ2Ga9O1gWO1iWO16vrDvk9sQc9q5c9q5coqJ3O1rW9327O1rW9DpJ2qa9O1iWeavc9q5coqJ3O1iW9o150rxJ1xs4q35c9qDOeqiveevvO12r96vzhquh9AvvO52rd37Jr6Qzd7shxE25oqHoaGuoasYg95dpg5rk9q6hoqHos6vvegYve2Oc9sQPo5Pw9DPedWvX7G5cdqDOqSegy2Oc9sQPoo1wrSv47J0hoqGJ1Quado29pHOc9q5cdqDOO104s6xJqqOk9q5cdqDOO204f6viO1rWO1rW2vHQ9Aecho14asxJ23dJ23a295jJ572995jJ5729drTc9eOc9sQPoo1qrSHg4o150k150rgih3uQgdqX2Jcedo150k150r5veIz_N72995jX__2vq6Qp9q5k9q6hoqHoaGuoasYgO4TI7G5cdqDOqSizqS6jdo1BpHOc9sQPo5Pw9DPedI1qrSHjd4vk9q6hoqGJ5v2o1aParxDOOr91rI5z1gceOa12x6ujdoQr111vx6egOv921QuvrWEH0179asxC9111r9cado931v04g5pH0179s6xG1x13rA2315O2qS0gOv991QuvrWQkLa111939s6xG1vr3rA23dkW11131gBv219cado933104g50hLa111r2zL191x6egOv9r1QuvrWEH0v79asxCr11317yX2139s6xG1Q13rA23dkW111r1gBv919cado93v104g50hdsWhdsEH1104s6c13vs13510r1J34r9kOr53rSegOvs13oT211101r3F415u1eLHv104aWxG2a19L171OrW17B96r1xV1g113r61dkW11131x6dCr11317yX2139ssYgOJJ14r5kOJJ14r6hdsW3rQ03rxDO133pqk11asxJr3ivxzvqu2Oc9sQPo5gzeE3pxQgz95jpg9YcLt-1gxiv53ypOaPoxR26g33J162gO16cLt-VxHLJeTHhO22vj15VoqJ299Y0O12edo219G3py29D7G5cdqDOeecT9DPed3iveq2QO52rd8Hhj9YvdarPo5gzeE3pxQgz95jpg9YcLt-1gxiv53ypOrJixR26g33J162gO16cLt-1xHLJvgHhj4TP1o6a556D1ga191761412cr141aD1iJ6i16N1fJ6i1151RJ6i1oN2w14K1aJ11J2t1aJ11r1v1aJ11r6o14i2qv2b11N2qv1b1aT1fJ6p11i1KJ6p11514J6p12N2qv2b1aT1bJ6p1pN2qv161fv2rv1D12N2vJ121fa1fJ6A14i2mr2b1g91iJ7216N2er6314r18J5F14i2iv2b1w92oJ1G12N2tJ5-12Q18J5H1152oJ2b1w11iJ5K16N2aJ1F1s91fJ6914i2eJ2b1a91iJ6216N2tr121wO1fJ5N14i2yJ2b1qD1iJ5O16N2yB97ic-X1wpG249bL15KOv9G8Bv2ooi1icNtK15g18N26J3t1em14ru_T9-vRV3KTo-v2r3V1e11515rr1W_vT-3RXpKvU3X1e3GKXpJLv5r11R_J54_e21aec9e353GQCiDtRYViFVaW4r-nZOFtYnfiFCGlzi-E0vFtE2viFCIjFi-waDFtWeaiFCywzi-sWgFtQ62iFXVyzi-twDFtQW0iFC3rzi-wDNFtEhEiFCcgwi-WfODtUjgu4Vdg4r-fAODtR6uu4Cps4r-qDXDtEWdu4Crrwr-t4TDtzQMu4XBqwr-ea9DtW6tu4Cihzr-jE5DtOgd1jLIAFVOIuO-R0FktT31AFVmRmO-IjZktUVLAFVKIMO-Oo4ktTVyAFV2vmO-kdZktY3rAzCxgPT-c9wjtRsSAzCnfPO-Ok8jtECLAFVcTmT-xUKbtTLOZFVURuN-lX4brtN-YCZvtYEmZFVYRmJ-bpZvtTGPZFCMImJ-cUBvtTALZFCWIPJ-cV_vtYUKZFCjIMJ-Uo4vtR-JZFCfOuJ-x9BvtRxyZFClzPJ-kX8vtRE2ZFCsvmJ-k7ZvtRePZFC7kmJ-h04vtWLrZFVtQuX-d04ltWArAFCzgL1-uAobtYCxZzC8gPJ-y7oktEn5X4X_cuN-RXwntQ35Z4C4cuO-tRfbtTuSZzCqmmJ-e8fktQcnZFC-fPJ-lo8btRjHZ4V3OmO-ddBbtTWLZ4VkTmN-Tp8ntRncZ4BvZwZbZwZnZwZlAwZkAwZjAwZmA4ZhA4ZfS4ZdS4ZsS4ZwD4ZqD4ZeD4S1mMwttm4ttlBotlZotlFotlI8tlR8tlz8tlK7tlb7tlf3tlw3tlt3tl7-tl3-tk--tlpMtkVMtmxNtl-NtljNtkANtqiyeq9ieq5peq19eeN7eeX5eeD3eeJ1eeT971vd32r95vvr31X941vp31v92vv5319911v11aLJJ7i1qA9vOthw9Bv23W6jO1azrv7J5QO1qSe3qBv8_S0oO1crdSxH1r7ydexC1152_Xdu6xOIpGOIpGOIpGOIpGOI73OIpGOIpGOI73OIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpB6xgQsY9o11s6xJr72heopIt8AX1gnDhwEOt8UX1fAG54ElL1y1P5DVR4HAL16JOQXCnIv2bkrryg1Njov2ek9ryhAX1Q3DyFUmt7yX1wqGt4WTL166P21CIwHkL15mP7aCIzHgL15wP35CIFHaL159r4uWyk1NabXrygXNwb0Wyg5NqLvgydDNePHWyh1NrM9Fyd9Nriv3yk5NiV2lydXNi0aryj7X1g216SiVTwJOxsrCi0aryff19wYSt4UD9zWnL101r26QyWB19wYnt4jUhwQVP39Ccov3v51yh4U5t4A-hwW1G19CiicJpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOI75928aLJ56ugO75mdaLJhsugO11mOeg1rWES4FNG10iNLr5A1gqF8wWVtoQ27v6cOJTCW4GC1rT2wor_yfON_kv2torsyhlNBIv2pIe9yf9NXBv28o95yhxX1j3DoFUgtupX1rnGi4RzL15lr815yd1NUPsyydONTivxyaDNQIlrysrNvVr_yaXNmYr9ysgNjTsaya5NgfQaywTNaAvUywDNr613yaNN9GJeydgN7eNYyd6vaFYct1Nws4Qh8GQC9GJeya0vpwY3t3DXpzW0X6iVqwJAe6rCr613yw2r7f1IpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpHcJpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGOIpGO2edWwrv6oa6xH3123dauldo59150hOJ9o3c04d71k9sW3pZuFlGOIpGOIpGOIpGOIpGOIpGOIpGOIlZuDpZuFlZrIlHvI2Eg111gy11174v1122a18v111111111T111111111117hv11111111111117hv11111111111111111111111111111111111111111111119v11139111111111111111111111111111111111G1491611j12517v1a13D1oX1Kv2C14v1G14914v1Z1491pT1e13Q10r18J3Z10r1o12C13J1P11e1pr1V1361tX1Dv3s1rv1Dv4G1u91Uv491ua15J491iv1Dv5w12N1Kv1y19a15J491uJ1Z13s1yv1T13Z1eJ2er4l1or1T1301t91V16c1wJ28r5m1pT1_v661yv1T13D1oX18r5w1rv1Nv3s1gl2br5m1ei1Nv4q1u918r3F1gr2w15N1ua2pv581wr231301f12u1491oX1xr301pa1dr6R1aa22J5D1tX2u16J1gl2br5m1ei2314-1p113J2L11111111111111111111111114N2fv11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112Q111781jr3tJoX1TT34bCq1pT2er3a1111111111111111111111111111111111111111111111112xl19J112ma1jJ2_2ni1o_CQ_xi111111111111122r1i12I__z_Rv11__F_Gr11114_LtCB_mf_StX_2Ta19Jup_-51111111111tCH_-i11111111111111111111111111111111111111111111111111111111111111111111111191111111111111115Xr1H__I_Lv11_Yt-krfJ2Wz-b_Cn_Vg5vJ1k10911tVj1La111111111112O1111k11117J1112O1111-1111jJ111iv1115j1112nJ111lQ1118c11132X111xJ1110D1113TX111ID111oev113Cv111Jv111i_1114m9111Na111rkv115wX1120D111wd11163r112sJ111dOv116DJ112b9111ggv117tr112EG111jEv1183T112Aa111b411191g1134U111xtv119Hg113eq111WYv110TT113md111Tsv11peX113ID111O6111oyg113Zi111K7111ii91148q111GIv11iA9114ej111Ar111uC1114xT111CD111yRT114Oy111BK111t81114Fp111Mpv11tx9114Nx111__111rtX1150y1124e111e8X115dG1127lv11eDX115x-1120tv11qK9115KD112iGv11wkv115VO112thv11au11168y112qU111aBT116d5112dDv11sBX116zl112hJv11dcX116Oy112kGv11d_X116H1112mcv11fjv116Za112n7111fET116Vg112nKv11fLX116Nx112be111fAX1172O112vEv11gi11174T112c8v11gsr11771112cP111gv11179T112xw111gR9117px112xS111gKJ117iv112zev11gX1117yL112Qk111he1117gQ112RJv11jtg117WA112UTv11jNJ117SX112LTv11l7v1184-112Hk111lQr118e1112SD111mOT118b7112XTv11nf9118Oa112N3v11bi9118ZX112-Mv11b_T1193-1132Q111vcJ119uy1135Av11cn1119j-1138qv11cMv119xQ1130xv11xT1119Lv113ixv11zfr119X9113y3111zz9119CT113yEv11Q7J1107d113q3111QTv110uQ113auv11Wu9110sj113d0111WPJ110lq113fr111W-T110WX113j7111EUr110Ky113lBv11Rvv110Xj113nj111RK911p4j113c3111Tag11p6V113cTv11Tlr11p8X113x8111TQT11p0A113xT111TOJ11poV113zi111TSX11pyr113Q0111YuX11pdX113E6111YU911pkU113Rv111Y_v11pxg113Y6v11Ulg11pUA113Is111UZJ11pLE113IG111U_T11pGp113Px111IRT11pVl113Kfv11O4111o3d113Ho111Onr11opq113Dov11Pkg11omv113ZQ111L6J11oxL113XHv11Ltg11oQE113Ca111LL111oHi113Nc111Kor11oFa113NNv11Kcr11oNj113_pv11KFT11oMp113_f111KV911o_i113_M111Jj111ioj1143-v11JHT11iiU1145I111HnX11igy1147o111HWX11ih-1147Wv11HIg11iky1147Bv11HH911im31148dv11HZJ11inU1148Sv11G1g11ivJ1149dv11G9911ixG1149X111Grr11iQT1140av11GdT11iEg1140H111GmJ11iR-114puv11GWX11iU9114pOv11GAX11iGi114yyv11FFr11u3x114evv11DR911uiT114am111S0r11uqO114sf111SVX11ub7114fNv11A3g11uvA114gwv11Akv11uUg114jV111AHg11uOD114kfv11AXg11uLJ114kX111Z1T11uJG114lf111Z9T11uGD114lZ111ZrJ11uDD114mh111Zhr11uBO114b8111ZDg11uMD114vN111XWv11yp3114xI111XPg11yi1114zpv11XSr11yuA114zT111XNT11ywi114QXv11Ctv11ygl114R7111CMr11ybO114T1v11Vg111yUd114UJ111VLv11yOq114Iyv11VS111yJd114Or111B7T11yAd114LOv11BPJ11yN5114Kov11BSg11y-1114KU111BN111y_g114J1v11N3T11t2a114Jb111Neg11t6V114HXv11NWX11toE114F2v11NFv11tuT114FE111NVT11tta114F_v11M3v11teq114Dv111MpJ11tw5114DAv11MqT11tkx114ZE111-dJ11tLl114-6v11_MJ11r371151Uv121ur11r4-1152p1121aX11r6A1152Ev121lJ11r8l1152B1121bJ11r9i115381121xJ11r9N1154s1121Ar11ruD1155v11220111rdT1156L1122OX11rkn1157Bv122KX11rc51159lv123p111rz91159N1123ev11rW9115pev123HJ11rJ-115uh1124R911rV3115tJv125ir11e4a115e-1125vv11eo-115wB1126or11egg115fgv1278J11ez9115gM1127eJ11eW5115hkv127hg11eI1115jN11285r11eHa115lh11280911eGx115mA1128GJ11q2v115vxv129or11q7-115cFv129Ig11qo7115xSv129_X11qry115WJ1120GT11qcU115TW112pgX11qYU115Unv12pTT11qUj115UUv12pIT11qIp115UAv12p-T11qKV115O3v12otT11qZ9115LC112i4X11w5v115Hqv12ivT11wil115Dfv12ulg11wfd115AX112y2T11wxA115CD112yn111wLq115Nbv12tmX11wX7115_uv12r3v11a8A1163V112rCv11aq11165Q112ep111aa-1166wv12ePT11akU1168V112qo911aRr116o9112w2111aA5116yy112wGX11s2Q116eUv12an111siX116wa112s3T11srV116aqv12s0g11sqE116sGv12sPg11svU116gs112d8X11sWG116jpv12dLr11sID116mo112fdJ11sAa116mS112fvX11sCJ116bb112fV111s_y116xa112gRJ11dpQ116xA112gJJ11du1116zm112g-X11dr7116Q8v12h4g11dei116Qh112h8r11dsx116Wlv12hg911djV116EGv12j1J11dQp116U1v12jzg11dOa116IS112j-r11dKD116O2112k2r11dJQ116Ou112k5r11dDj116Ppv12kwT11dX-116K3v12l2T11f6E116Gsv12lAv11frE116S9v12mxT11fll116Zs112n0g11fzp116CS112nnr11fRD116Vov12nzX11fPU116NP112bnX11fXx116-d112bAg11g1x11724v12vvr11gor1174Ev12ciJ11gdT1177R112cVJ11gxa1170j112xWX11gIJ117i1112zyX11gAy117yav12zSg11h2j117edv12Qcg11hpx117wd112W9g11hdA117dQ112WCT11hby117g1v12E4g11hcU117gRv12Eu911hQ7117h6v12Eqg11hRy117jI112EIJ11hIi117jZ112EBT11hKp117kAv12R9g11hGd117lYv12Rmg11hZE117nH112RPr11h_n117bBv12R_X11j5l117co112TvX11jij117zav12TXT11jy-117zNv12Y3g11jej117QQv12YoJ11jhX117ER112YP911jl7117Ryv12YZ911jnT117RZ112U2111jc9117Td112U9X11jz5117T-112UqJ11jWv117YE112UUg11jIl117I5112UDr11jPN117IO112I9r11jGN117ON112Iqr11jSy117Pc112Ikv11jZO117L9112IWg11j-a117KG112I_J11k1J117Jsv12O9T11k3-117JNv12Oqg11k6r117Hc112OKJ11kiG117Fj112OCJ11kt1117FMv12Pl111kfD117A8v12PWr11khV117AUv12PAX11kcJ117XY112LiX11kQ5117V0112LWv11kUi117VH112K5v11kHN117NTv12Kuv11kDi117Mr112Kdr11kAg117MK112Kb911kBX117_o112KA911k-g117_D112J1v11l1L1181gv12J0g11l4p1181_v12Jwr11l651182R112Jm911l971183t112JR111lpT1183Zv12JJr11liU1185Qv12Hl111ljq1188Yv12GeX11lTX118on112F8J11lA3118ys112FZr11m2p118ehv12DYr11mu-118ab112Skr11ml9118fNv12Ay911mRg118jEv12ANT11mFG118mV112ZHg11mMi118bv112ZBg11m_O118v0v12X7111n97118xov12XEr11npj118xD112XJT11ni-118zm112XVT11ntQ118Wq112CfX11ndD118WVv12Cx111nhd118EQ112V1J11nc1118Tmv12VpT11nzx118Y7112Vnv11nTx118Ud112VTX11nK9118I_112B4111nHQ118OE112BiX11nFn118P6112BaT11nA1118PUv12Bn111nXa118Lq112BRJ11nVE118LZ112N6111b35118JL112NyJ11b5r118He112NJ911biA118Ffv12NC911byX118DZ112Mnv11bkO118Z9v12MDJ11bn3118ZQv12MNv11bb-118Xy112-QJ11bU1118VUv12-L111bOa118Bq112-Sv11bLi118BOv12--g11bDn118Ms112_gT11bZ1118MB112_xg11bCr118-cv12_IJ11bBJ118_0v12_SJ11b-i118_Kv12__111v1x1191av1319r11v3D1191H1131ur11v4Q1191M1131rr11v5a119201131QJ11v0l1193k1131Dv11vug1194j1132p111vqJ1195J1132u111vfn1196Bv132bX11vgy11978v132JJ11vvO1199hv133p111vzj119p6v133QT11vPL119obv133XX11vK9119oA1133-v11vKX119i311344J11vHG119ivv1340911vGx119iOv134i911vFq119iXv134t911vD3119u5v134ag11vCd119yhv134Rg11vV7119yWv134Ug11vVA119yHv134Pg11v_n119tBv134_X11c1y119r8v1353X11c1-119rwv1356X11c2L119rbv1359X11c3n119rIv135rT11c61119emv135jT11c8v119q7v135W111c0V119qT1135FT11cr3119aM1136nX11cjV119fXv137pJ11cWv119jwv137Fg11cP7119l711383v11cJX119lq11386v11cHT119ln11389v11cGg119lU1138fv11cA9119mE1138jv11cAX119mG1138mv11cZT119m-1138EJ11cNl119b-v139pr11x5V119x1v139IT11xol119x_1139HJ11xiN119zfv139ZX11xyv119zJ1139-r11xr7119Wr1130dT11xhQ119Em113pxg11xCL119F6113y5111zJy119-zv13e5J11QUJ110yI113anv11WeU110gnv13dxg11Eo5110YRv13kig11R6U110Gsv13lJg11RyJ110SW113mvX11RkN110Xrv13nn911RI-110N2113b4T11RHL110NT113bu911RD9110Mtv13bLg11RNg110_qv13v9g11T9a11p3q113vRJ11TpJ11p5n113cu111Tsd1191v1111X17hv1411l1e51x2vnv1v512rqv1J1p3qQYo1972j541J912Jqc1r1I36hY73Py5trNwbDN5uDN5tDNwc26hawE14NNwbDNtFFMt45JiH5c5qac5q711J4Mv191_v17hKEjv1sE1191nt--1aJ7er1y12J1iD1j3rau11ihne9o2fa11rN16v5dpHNn1eS2qHvIwc2m_6SuZmrN_wJ1oDZMSzN25igHi15e63ixuwrEuwrquwrFicia2xix0GgSu4gFicld1aPhdra6dsQ2yqrTp3lC0qlY0vfO-VmhdqEzp053rC6h-m9QuwrHpqrDu4511v2D1V13IJgD12i10121OeT7L15ar3gx4vra76XnwHSb8dNmFHZb8ram1H6n3yNo_JO33JNE8Gh_0TNE26DKflwMHuhmHtZa14_5_wJHi15a6caa2xixuwrquwrAiF9d6er71er76ri79G9EuHiAuFgFicg20vTA0E17ixlRivg2xrg01WlEu1501vOstqlG26Jere1WijP31rc30F9G0D4_1wOryvZ-nWTG0v7uwG1NiJ111v1v_-r7UvgT11i1w13hr6Nb3HgXp1a41JN_prr1y466yFOttFr5tJrk3vNpiqQT8JrmizT21cl57wgL9cQX8w9X54h3uWQAjwhJuT9AUwg8ucg414O55zS621ao255uy29My559q722l57qrru2we4dfmw55tZaBe5fye5q6FRdfnZmBmw55e9fye5q6FQ1tFN_tH5qyqNNttDNt25qyqNNttDNt45J1q5w9r5w9q9Su4icuzlAiF9d6er82vlcuzlAiF9s61iFicaa9G9E9Gi4iF9f6caa9G542xixuwrZuzlc2vl79G9Su4lAuGixuwrZuzi3p18DlbXg_OcV_KsbW1597zamd35I7xJ81naxyHY9s6t4hR5ttJ-qjOH08zef_ICj7Ssq9qX4_vJnqHS6a2lz9BMw9cDY1Q52R_Cc1hMQw8w9f4avp6Gb98RpsaC5_KYojrw-grOat6F-LA6tyZ7m4RfzeDNRqR2KgGlg6r111J2Q_Rr5GvjC11r13J2119Y1dr1I53OvpF1Ir3PrpJgIierftJDQ0J24icc4wJa22rh494640JP21aiB6Diu27g4hzl3yrvC3QalseHW81aq3Qil91D675iRizO11GQ4rJ1ZfFmJuC1Z24m25uhmBfZ5724dt4JN_wJNtuwPH6Sm14_PSyDrMyZaBqMmBmwP5irrH2455iemiw125rgs61aeuzlAuwr26wiG6Hgs63ix0vle6cld6er82vle61gz9zaS04aDiF9f6cld6H5z0xlEuwrZuzlSu4gFiv0iHJ6CjQmt_J15g8Lcdqz0uPSMlTPBHziRdtXgaGNIr36rxvxklgG1mUTS0Sg4mJ6RqCScNbZX05hrfjX51VQcpDugpJ8-jeeMmpw0c8rW_KgRiSz_2_hj0wlep1g3uJh7sYE0nf1FJ3lD11a1Q__x2QQ7jv1t13O1yv2916g1bQ2krT9v1711Q14r11r1yX991QE3u633o1Oh3SmwvW1XO4v3y5A3i9Nfv3db6C1W23aU6GNlkHGt80Nl22J5eT9K47NizJGb41ritX912315a1ev2815v1w121l5sH4afnZmfnDrS6ZuZlSmSykafnD15ywDBmZPt-ZmfnDHi15x0GgSu4lAiF9f6caa2Jg22vl81Ji72Jgz9xgSu4lAuH9Z1wgZuziG6caa5G9R0zaDuFgFicld6er71q982caa6ziGuFgSu3g29vl76erdiF9AuwrR0v7Bz66ohE0zQshqhWO3R3aUeNkv8DgloG5S2z6Pvql24zgP8G5xurx9dWCad0p9hR85_4gLp3P2r4gOiQT3CavY0smfa5N-uvregsLugWWsg6AqnQP61jONgVo-s_XTwhgSoGit5Tbj1r6l1Wx6iq9F9ckV6s6sx0ecj5HschRi2man9qWraevloWew_1XAiQS4e6Mbyxab111415K_TvwD2cJ13r1s1551m52uuxXa9vTv15197zvT5ziqy4v8rviX7v0E3Egyjq0Yt7W12a1p64g5uegL939434aJ0xJ3y1Nn1eX9y11d1egyy5NNl4G1t01NT4J6t59rSWZPS6ZMZsZPSiZaFe9fye5q6FWm14_P5twPH2455e9fyw5J1wgSu3gz9vgs61i72Jgs62ldiF9Z0v5DuFgFicld6er86ciAuFgZuziG6Hgs61lq6er79G9R0Jgz9xlEuwrZuzlE1UG18HNqqwyOtRWfaf4pQDF-LSuhgf02tb6uT2rp51ljuxTg67xRyqrP98t0-kL5xCusXwi5t7YToxS_6at-Efi-nghPew-IlriKh7CSa5WSGBdY_J1ZyAghaxDWoOLP_KTH04iFHNeFnoz3RSGdcJ121eJ5m18g2RJ16r1kLr161ee13e155Ji1fvX843_5Sbw5H11_Bw5J1erd6erz9xlEuwrEuwrZuziG6caa2v8y3WT-5rvo32e50zr92jgnmcV1o2m987Nlh3utiqgssr1218o-a1pX2Qg18r1Dr1Hp5alkde6E47Qe2e7X1eh162O16vc736g9hvv54v19y11s1ean5uhmBmZ5fr1_tSDHi15a2Jg82vl76e1f6cld6er79G9R025r5H9ZuziG6vpXtxXPkFNZCxXKyzrx8xI-ddSVHxvf04g6Vqu4oxC-VOF6_vwP03rLoq5H6-D3Nr5t1eg2ugOlyr111r2G_W13L1h712D1okmh27Q5hvQ42ov26Q1q711h4sQujrD42Hauy1N11r1b5uCm_mw5fr1_tSDHi15r2rgz9xgSu4lAuFgeu3lE0GgR0zaDuziG6Hgw5vpX_WvY8x9DyxXKCzm1kxXPtzaQ6GR7nED3ebDtBelH9qDL03wP1bF6FyY-oxC49GrC89K-G_BU111213N44rt42zT1oJ3dr6L06v6d9A1zzHxb7pNgFG8t9Jl64H5go1lT7x5g9Slf1r629eNj9HvW3vie73ab22v79rNTtGv59JD69eTg1HJt4ar82qv1iqQYo1Na8Her661l22rl13OJwS1gpDXrM5ZuZsSyeds5CQDrHuZs_mge6FQe5zWm13_5ZmZaH25qywQqyaXI1e5qyr1e5zQCiw12fr2m5FrAiF9f0zaDuziG6caa6FgFicgs61l72Hgf6caa2xix0GgR2xix0zaDuFgZ0xlEoFrQ7tl9iGgRiJkJuxaHqDjHyQehy3rE8FApFQQQuG21nWpnyraz0wYcxFaRiz9RuZ9Quqh751NsusuLpGrS06phVwvQ9x1AmHTM7r121411V1ye22g1or1BK11i1ev15r1c1exSp2P43e51L15gPvQQp5ik82dX1exS3aitoJ5eoSZPBmwa_lw5C11KHtZ5Be4Qiw1261gz9xgz2JgR6erz9xgS0Gl79G9Su4lAiF9Z0FrZuzgFicgs61gs6HlGuziG1C5H0rJJ4drM0SQOor52nwpkuHueiRQ23rTU9qgS2J6o669aY1p40wl91v93VSTPofuD2SH251a8msOz03rH0c6p5Z942r111r47_Uv2NJ3y11N1o51noJ1_18N11J103H1b415i11ir1G14i1uJ1X142vir5uhmZsD15tFufw5J1q9EuwrZuzlAiF9d6er42v5m9Fr-ucDjpGrFzcb-U4gz8gMNuw1Z9Hz-Jzg11r2K1lD3Mv0Z11J19D1t3rj41vXYpqJo23OuyzJgpDXrM5ZmwQsWeyg1oDZMH45J1rgc9zaDiF9QiF9s61pRxtVQs6et1wHtdr8k4QCy4QC61151z_-z1gl1EJ1o13h174N71rg13JJur1Wr3d10J1Rr3n102vQ4424dZsZ7124DFsDHi1ax0zaDuziG6caa2v5ou5c9u4u0qsS9u4u0qwiDq11216w_Yvto2WD16r1Zr31661vteHl2155a4Jv6211a4Jv621rfpqQO4rrI6zDC73Py5teuZaC6hawE5clC13NfiGOHi2lx0zaDuFg1uH9f6cgs61l42vl41JjH0wv8wv7JwXu40wvol5uNAIakdz9W52of1GRg1dg41wiQ6G4-NoRG_Eo-kFO11v1M_MQ5EJgw11X1812Hr6QW13T9yrm915l92rTt2egj4HadpvNW6ETtheg94Fv96zvD11513HDV31591El5v1G17viE5GQjscuh7EQihcuY7vlwy1N58JrK24T5wJr622TXyrGt419i8c4lfbZafnSmfr1_fe4DfnDrBsSmiw1691iE5e1Zux5v6Hge51149vl76e1qiF9Zuc5r1v0z_P3ijTUz1ev22Cu__Lw-LESkOIoaf53Y0J5dSv6f1qog_n43_LR-rtX_2fEMROK-P_VANUv21v5t1rX11151RK__1G576J1J15P1oqY43Qi2ieNwoHi_5DNwfHuK5Jgw5eJ5oQiU8x5QrH5U0Hh45rh43xm44F924qMmBlwQblrgC2455tZ5H24P14_mH6DrSyZPiw169Glx0GgSu4if6FrEuwrwuxl79G9EuwrZuzlAiF9s61gs62gs619s62gfuF9d6er71O48HQgliCDJpe5f6v770qvBszhzd62441lJ516YpzlZ1r505zYW1r9JK3M_1rt_c7vN0GM40Wehwemk6G779fo-t85VYza3uGQUuv121pw__rey2v11tJ3yr2gCuQi01J109eH4prrM75iPrqiArH215uwPH24dBlr1t_Z5oNrK5tZ5O1pJ1Qued51emxD2oecd5dae1c5Suev3ucJe5clC5wum5wum7D1Z23Pa5WQldx6v77Nbjqmvo71Pm42Zu0lPWFrueHh09sOJdFev5E1dj4r86HgW5zOJy4eii5vD2WSmfsQHi1ax0xix2xix2xix0xix0GgSu4lAuFgZuzaD0Ggz9vl82xixuwrZuzlAiF9f6caa2vl72Jg82clZuziG6Hgs61g4N2Wk74tiu3nh0JOU3Das48NV_XNJsWu0eWHwzGOjhGhSsRE1TR-yyzPoOBJBkJoyS6Pie6TA1cNi61c49SfYzQ7Kgzmvva1GowsJ9W9K9EXHesczEAjOeSYKmzSFY2ii7xi-0FD11r3q_M95yJfA14J1Ua2Y2cJE7Fikwes587Osh2J8jvi2svWhp710jqv57HaI6wrls2Ps87akh2HJ3frf3elk9JQtp3u4oJM411OMoJeh5SQbkHHC18g32aOmdFmOpAJZ23PI2v577eM4iFiwrD1V1wTr2E171vgM5uemZsZPiG_MH22mH6Sm14NrMyDr_lrrH29Cyk13O104asxGuHOf525C7BlbuAgtjxi4uHQKfsWmfsDHi6D69xlE0GgSu4gFiclf6cgFizlAuwrR0xlEuwrZuFgAuFgR0xix2Jl79G9EuwrZuziG6Hgs61l72Hgd6er11WAfn9lK2zDTp2DL08Ysks0fkApxkSbKeag21Qh0c5e1lq5ap4EhcskfbTn-5ej6ctBUozM0c29ep4aWew5He5cTWSYy5rPtyHNB7saMd4gX9alstqmtqa6bhIZIqJl8ilyqHbBP1191it_E2pa7711n1391fa1Vg20K8J9b8Hri43649QifrJ103r142Gia8H9I5zQqi3605Q1cfH0r9dOwg35p9q5y3aibrG046HO1024aFwFPBbZaizDKfr1goH4QoFiK5yZPBwiK5wihoSDHi15e63ixuwrAuqlW9xlEuwrZuJ5AiF9s5wgFicaa2Jg211l61Nekjvr2_Qn0usOZsv8OrAmH5exXw3o-G_BSWv7c1kf-zWAe5Q9iXJO04FvPedg3FWSx_i52gDvw3ruq_Wka3v1218B_Jrq22vv1qr2Or5Ts4qaui51Sq6guaD2drEguhQ9082s4i592rQ9154J2t3X84ai13DTL24TeewCatWe1h4CQr0Q02Fm79FC10vrbqc6415grev07qH4dfnDrSirFiFiF5iem14NrMtZ55iSH5zQKfbZ5fw5J2q1R0zaDuziG6Hgf6ziGuFgSu3lE9G982vl82xix0zaDuH9Su3gSu4iG6ziGuziG6ziGuziG6caa9G9E9Jl861iAiF9f6car2Jg3iKBQcc9-0GQWueP2lpSGkw1-vdP5uzmPo3XTy21x9AQaaerVV4TkkcOwq29RtyDbfvUYUqd0CuHDgYVQtM9m7GlCo51qo9e-Oh0klHDfy8lPyqvaRv5BgGuw64D831rtyxhJ21i6obBvkjGqXKBGIBg11v2K_Bv5srga12T1pJ2hr4ve62Oe42M70sQadHPU7JrkrJNa1erWrJ1oo1Q3uxiC0Dgzqxml2AJ82vJi23W46GDb9ait2155o24dfbZ55uwP5zQKfr1_5twPoSZPfr5e5zQ15e9Ciw1693lE5e12uFgFicgf6vl82vlAuziG6caa2Jg49vl72Jgs62ldiF9ZuzaD0v0s_KPBhv7efQazp4J21EziawYfvxIU-TnuB6h57EQ7t5GcWSuuRQx_Rr571nX2jSM3yqlQhNmqYxvR-LwKWCD4ueXirwaFOZ7rk7qWxgQ11r27_BX5KvfQ1351fa215c1t21i22ci91ciX8v9p3G9s1Ga4yvDB55vuqvMo56OtdH2b5EOtjH2K5vDq51N921i22Hlv991f1elI9QWi73Py5temwmDe5clCfr1rwnr_MfZ5725q6FQHi1582vl42vl72Jgz9xgSu4lw5zlZ0qlEuwrAiF95iFiG6er5vWL3kkgwrwrP84rTta4cWhDw_vIcgwvUbv8CbImU2eYUEuz-lqGBW5QKy3lERr9R1anH6rT73slUuc1_oJ111J2A_NT5hvfV12Q10J1Z10Y1l6Qif2Yq8SixfqYmuEgJ2DQjeeM69QJTez2c8A5xk3YUuRgJ3xTTyxcsiuDp-vT62c9vrGvTi2Y4jrJ2442411OX41r921gy6JCs87gnjqeRo8lu31g95vXnrJvOrHN5tJer21i5u3e44ze4N2g26zQrSWZPbmrgBe4afnSMS2zP5irrH6D1tH4DBe2m_e5Co-DCysSmfw5J2q9R0xl3uGgSu4lAuGre61l72Hgf6caa2Jg49vl76HgfuzlAuwrR0vi72Jgf6cldiF9ZuzaD0Gg3hPy3W1i5CBp0vBO2Y41Rl0aNeYniS965tr52CfvDaFDDchNSaJa5kS6RO5gXhQrAf7z01auSkinMbfv32tCmn55AyaPfhItim7T6naW5m9JB9GiXfTvZobA8qzhwWZD-o6u3cTuruJ13184_Trq52v11911J1pc1vcQcpJ1S3s90dvCsp7vhjq59yG5Sp4OKsxJ53GNd3xOc0qvvo3OKqG66p51OqGNp4xve4xXQ9aihp5ie7r9K24N5wJeb27N52reoi6T5fJmh6dN8hcSQ8JlLrJ1m52Dv8w1mr2D68eat2J5805it6eNsoHa_6aNsfHd16rlspF5Vt2vIwc4DfaZMFsDrS6ZPfr1KfwMuo-DrBr5e5zQ15e9CfsSmiw1W2vl79G9EuwrZuFgAuFl72xix0GgS54lAiF9f6cld2J929vg862ldiF9ZuzlAuqgE1H20Tku7pws5YCLDqxOXO4nMxUxOQ--XQYT21sME_OyTUr6RdXYrsGcT4r8enwhiszJTyHXCtVqfsx1Ajg4O1enimCjbXbBK_KX5dUVKQS68i2husFuMBv111v3Z18O2RveY11X18124r3X1461ig1HJ491i2e1i91G1401iX1FJ41gi1JOm5cO74Hvmv11219111f1p1rTm5uhmllSH5uBm14_u5tZmff5Hi3aa2xix0GgSu3gSu4gFivia2xix0zaD0zaDuziG1hXVoqDl8rD_pZ1eyqDPyvQNo7BxowTm8qDwqe9Uy19powTVorJH4qOX1191abN-1hO5h11u12J19Q1e1JJ74cro8r108elrpHSafHvI5tku5uBm124MZw_uiw1261gz9xgSu3gSu4gFivixuwrZuziG6caa2Jg82v7kyxJOyvTMpABJdWhhyxrXeQv63vyAo4TVo1DH43OC-PYnrf-5uxrQaWgRsr1212i1Jv0F23a18r1Vr39p1vJ1dcl2159i3v9122l941T311r652T653On4HN2gaOgpSSy5teuFmDe5clC13MuFelCwxOHi15d6Hgd6er79G9R0xlE0GgSu4lAuFgAiF9d6er82v5Uy60cq4gQ82JTvAemw5smkCOB8xrZ8E13hxWdhwXW0wvs8gWY02JZix5Pmj9HuGax8Eg11v2z1er4l1tR11N19v1Rr2g2rJarrHls51i21HN44JJb441i1JJz5uhmFlrrflr1o_ZdBw5J1raG6erz0q979G9EuwrZuciG24iG6erz9xrz9vgz9zaDuFg2e18wdsR-o2mk6xlHs2jJrv59rWWhrKBXrcCX8sHdkJtR1sWh1raD0Qvr2bZR2WWh2vchavl9111214T1Lvov27a1712Tr5s51QOis10m47Nig2a721O347Jf112241O51vrwbJj12v97i2T23JQi219412107xQYo311i12r11i1tJWb3r90pHW3aevIwc4DfaZmfaC6hawEwe4a5elC5wWm13MmFelCwxPmiw1261l72rgz9xgSu4l20xlEuwrAiF9f6cld1L1WBKBB82QQuql2c6E4T4vQ0eBQLwO3WGrzZjlqyqrT8v5TyZUfyxrA9KMv8v111v1D_Bv4Jrf71311or2nr4aI3zDp1vab2cL76J12reNk2va5p1MF44ldp0Tc2ri78GTk7rvUkqr434vKpqQO7e9IoQ9N73Py5teuZaC6hawEwnZmSyDe5zQqywQeyr1KBmZPBe5fyaXI16DHi15x0zaDuFlAuwrR0xix2xix0zaDuFgFiv1s61l72Jg82vix0zaDuFgFicaa2Jg2lGQ-vy-2kdWAtN9fpwLhxsI01acny0xht3ubo5lc0wYv7x12u4NTeddDkSHDgW-2rxWtwQk-HOxqlaeOkDaY_TrBpzXGy8gZo4r11151kKMD2PQ7fv2w10Y1jWQKszHU5dQKhwJ6oJiYoGgZtJiVoFgVwJu6yWN4kJip1Gl7rFNZt11Z0HvZ2cDioFmi11NvpJiEiFO4q1uk1SQIjJuK7JQv9JNts6a_pFcrsd2s1WaYpqHrq2aX3wumfDcKq109pSrVqHvIwc4DfaZMSLDrZaC6hawEwsZMHc5qyq_aH6D1t_ZdSuZMStZdSyDe5zWmfw5J1q9E0Jg79G9Euwr1iF9d6er82vl76erf6zlAuFgFicgs61gs62ldiF9ZuzaD0Ggz91l75e1f6x5GuFlAiF9d6er82xix03l15e1w5x5v6Hge61l72eYUExNAhF6KHr5zLqTXh9aZaeOboWmprFrUu1DX6QE0uFo6PtI-ZjdsIBg28W6EIGJupwFsTgGu_PWY_OIaXr6A1soH_dCF1hJ-twaAPdGC1w9-o4Jm0z68xcDk8v95RTT-oeer655e2DiNx_dkzPF5_Pb-BIF58D5rrqPbyGHPdJ5i1g12v1531ewoS_VZXfWM111319t_Xvs92lg19r1W1ym1s3aa0quV1RTlxvpp81gC1zQyyeHo3aNyqc2j4WTrjvCU51TO2AJ81cJ02J953FQx1qaz9cTd61gg1Q153JT13xid61Q82rXW82T51vaxa3mK0J9v0Bv27a1ipqJbfJX24xOEsQOgpDXrM6SuZaC6hawE7cWufmDfye5fyr1gtF_a7zNfysDq6FWmO1pJ1Qued51t2Hvp3zgxi2gzux9g3eaApGOI7D1T23ax1vl82xix9Gax3eJ37x0g6J52rvlz23sQ6J11rrQa9chW6J52raXIpGL838DrH1z5cJXNH6QHi16misD69xlE0Jg82rg82xix0zaD5GgSu4lA5H9Ficlw5Hld6er71r5AuJwxf5rj0AjW_KgGnq1Zp4-f5d0GILDVwHD_WwQmtKCZ_L0CMcBOdL5y04n4_4vVpF12teTxaebd1eg2nAB-OtS0RW5kpFT5m_XF8GJ111i1K__r2ov79J1l13Q1t13Cr4JFy198teDX5213g2g27xljywTReehp0Jaby35X44iXwJs_2r960FvaywvdoHr_619a12Qr7q1hi2Q57wXrSWZ5flwP5tZafnSMS2zPBsSm14NrBe4DBk13O104asc142gLy3u1521A9Gi3525qyqNIBwQkr4m7udTqk2hOp7aSk4P_6IrW33Qm0zui6QJBsqsbyJgc9F1zy3QLuv9_ozaSsv0boWgFswsKovQLoSZPH247fsShiw1W2x5x0zaeu2iquGgZuzlAiF9f6car2Hgd6er82v5x2Jl46zlAuFgSu3g40G979G9R2cas04lAuFgSu3lE1Zkc_U9Iwe9a1v5i2HU9Ik3xLNxdWguk_ECPo19azvUfg7bq2dTuurXAtrg22Us7r4A1g3cgaqO29XN23r5nv6GAic1Un9Io_K-ar0Hlnf6r2rv8I_CM415iaWEifVoNZH543fCzFJW27FQD7xNBor1216I_V1qF2bi1oJ2Rr5OE5wgyr26r165qg2r712Q7qvhj2vi7uGvz1cryuHOoi3gperT36J91o41Oa3HJo1rO3zv18J6J8X1bQ2-v8B1bD2_v8JlbpF1Mw2vIwc4Dff6uBmSmHlem124D_mr_HbSmSWDHi15x0GgR0xix2J9e62ldiF9ZuzlAiF9d6er8235x0GgS515qiF9d6FgFicld6er82verr31l72swQk8JaSsXhAvVn4QmpFTE_Kz-NO-txv5lBb5HwcXzy5aq52gk270or1XoZKBd_Kd2fd1S8WvUrqvP9LUbEP92aJ6Q1qQ03zukafgY8Gl11v3Z_CD6g1ga12D1or2yr3TS7fav1x1X5GlX1vOL5JT0o6QOjqJ4o4vk9G1xy1Dr51U13Y1pO1T53xXrSWZ5HtZ6HuwPfr1_5twP5ySmO1pJ1QuedooE916mdw5J0rgc9xlE0Gix0zaD5zaD1zaDuziG6Hgf22ld5er31qgW5Hi46cldiF9ZuzgS51rDE_BnqsCHyrTIyci0s3Tgx0Tg1eF9VV8-TAk-zJa451lyd9kQj76F2ATf7GONpAQ2TAWS1m6SpsY4qJccGnZ-CpK-Hvt4rVt-XtBc_mX43zP7rPMC1eT11r3i_CD5Krh615g1xD2wu4iNyvr811e4tJ9V1cu4v1Vr4U1y1JXsrHNowJLt3CNo21Ox8HH4p1P8g5uJrJ9i5Gr0rFvo2DiFy3NH025vrD241QiH6ec4o11H5453iamdyHvIwc4afwHu_lrrZsZaH24aS4FMHe4M5wQCfr1rMtZaH3MmBmsm7yD_t_SMSmag5e9C1e47iw129xlE9G972Hgs61lWuziG6caa2Jl62vgs62ldiF9AiF9AiF9s61l79q1R0c5DuzlEuwrZ5zaD0zaDiF9fuzgFicld6er82vek4c7YRso3l1Qe1kk2o3JNfyB-ivr692x6tKQ_65XwjWsn_Ob-GWcv2vao5Hrah3TnnusnNC647cD6rvaJ8cM20XKFpcrXoSOo6qY8bFbm0HJ84dca5euqdr62r0cg6HTx7J5cxxdt0flm931V7DaT8G911151Ib-d2or70r1G15h10H5d64vi341p1rTj3Fi12JrX0xO313N24xN832gfy3i18r5m94r2iH2mSWZ5_lw7Huw5fr1_HtZ5H24QoSZ6HtZ5H45J1q9R0xix2vl4uziG6Hgs61gz9xgz9vl461gz9xgSu29Su3gSu4gFiclAuziG6Hgs61l7269q68FirI6L1O6cEUsnyxODD4e5XvQXpGOC4JiZo35jbiholCw07cD69vvL5Hw-a4iq3WJPyH9V_s1IyFOIHrisHqGHo3JN5cgs9qCpp2Nz1151w_-B2aO79J1D10c1l2gopcgC3FauycgS95N2d1uj6Egoj1SU67gvbGVtovNq6Qio1xvQrGXW931Jv414i3241JOS4GHto6NOkGJ52cJE83OxucJC06QQjqr84GrX14iQy11F2xJly817v1jr2U17D1g62xOS4FgKuv9Mw2vIfaXrM6Su_lgrZmwQ5uwPH6Sm124S_mhmblrg_fZa74_MH6DHi153135x1c5r5zlAiF9f6caa2xix0Ggz9vl72J9e62ldiF9Zuzl52Jgz9xlEuwrZux5G6caa2er-_Rt-NKkAMl31zSLsPzJU6xxhjaPqpaZRyz-YOXqou_BIHcldo2Dkumv35qOV1WZ-FbVe1ei25J541xdYlwH9sGW17sSy0Ab-FKVjK5Pqlfzb4WDo9cNYuG75yxH2111210z_IrdC2c91rv3sr75O7qJSt2QNuaJhw4sl7sJSk2WOurTFaF5huegXgHl1155h4zaX6xX3tv9Xy2gb3JXorFve6xaTueQIrF6mp399rHrd5aioyQi32q22i553reH48G9K9zNxwG959xP4wzJgpDXrM6SuBmSmSuwPStZaSnDrStZPSirrH25qyr1rMtrKBwN_5e9C5zWypJ5rCz5J16D22caa6caa1caa5caa2xix0zaD1zaDuJg82er36er79G9EuwrquwrEuwrquwrAiF9d6er36elW04lA5wrZuziG6caa2k1t23iduGQTy2g6U_F-f3rZpqQZ9JvauGQYuHa71jD21k1o7q5N0zJ6vqYe8RgnhtCDh5F-D5DYy4vYwr5Jw5Wo1F2qdKVSdGQCyqWU1jsUuMXXwJ5MwGTXy3Yr_O6r_s5J1TN295HyjFlU4J111r2o_MJ501fd14g1ea1a1FvEy3Nby1TX5elaoJpviB1F1vV_1e11iJ5r11a17v5r13O25oa6y4NQ1qrKfnZQC24QC6D1tGMMHirgBbDrBnDHi15x0Gl35erd6er80w9d6er79G979G959G9EuwrAiF9ZuzaD0zaD5Jl89xgSu4lAiF966caa2Jg4Ka2cTel92J5BpzQCpzzvy5o--aiUywQUrhgp4eG3vxOVfW8nHJ5Odq9n2uXu6bBm_Km7FQhnwrrBpGJB2qaBpGON6s6Telm5CJ6j21iVosD033OufxNl6J111r2n_Xv651fI1411rQ1U0egS6Qad1H1dy1ToieJX2wvI1UT9L1z03uQ9AckP31gqy1Xz7xDjy1v7oZZ67yZ55iwaBsD1t-ZP5twMH6DHi15x0xix2Hlr1Jgz9xlEuwrFicaa6HgFiciA5wrR2G9E9G9EuwrFicgFizgFicaa2Jg5Ie0f74632du3YjVIKdsWmR6Wax1t2wDRRqvOt9Oxcx5_-F_Q7HD64vN4m_Dg_UZvbTGSnZWwaQX2M-X2j2Hr1raXi7l74ZrT8G911r4d_C95AJfB13X1k529wv6y1QJ4hxl52xll1xJ3uxmd0JaQ1Hv45rl13JlooHD35r0r00Nk1xrI7G1I62v42rX6yp1oO1O311Or3A1ol1L13C1o2vOK5uemfnSMH247HirgSuwu7e45fr1gtFNrCyre5clCfsDHi1ax1r5s1Hrz9xlEuwrquwrAiF9d6er82clAuJ5AiF9d6er22vld2eld6Hgs61l7297g_Lb-Sr6fyq9l84QUpFQi4177Ur5b9xTTtKB-OICX1r2Yya0t6eTY1rO2orBMM7iGpw4U1VwYpFJNpA8uHEW_J16u0FJIrKBxJBP-B6vO6cY09cNE1151hb-z25572v1b16C1rr111f11v13r1p11O1411u11X14J11Q1211j1f1jv2Ur7U1jO2I17P1jX2IJ7vQj6zv53G1y1cgX325X3Jvn9rvv5ugrFe2MS2zP5yD1tH4D_fZ5ff5rH6SH745J0rg82xix0GgS5H9eu4gFicgs51i82cl50wgFicld6er51f8GZXSWo4Ja7zQUpFQk4rv31ra2zH5tpHDhpwaU0HNUl16o1lT3oxONt3KMG_XHE6u11ZX69cNTr1111r2J_VD7JJf-14X23522yzaHo3vx92ro2Jro0vN17vDgiJ9E1vNp71U3p15x92v48vNT61OHo4TS21iN2He1o3J_r1lvr3QYo4JnpFNVyevIwc4DwmSyeds5CcThwlDe5zQK7czu5e9fye9Cye5Cye9fysD1tFN_tH4aSire5clCO1pJ1Qued51s651u9Fga91Qiuvm14qiA2G1044gOLt_1OJDzuxGX_-3G3rJApGOIpGOIiw1kr5NE6zgdwHCo8SJlfHCk8ArdgHmc77JTjwri7Jlr3HNHs455m46Su9rHc4a5o1NT65gf1r63731a9Waf1r62yvrS2Dgf1r63o1OH2SJf1r23wxOIpGPm1sDHi16mdrax0GgR0Gg41Jl72Jgz9xlE0Gl31Jl42vl79G9R0zaDuHiwuzlAiF9f6ciq5H9wuFgZuziG6Hgf5cif6caa2vhhuxin73rYdlvB03lUeFOx6c9mhaDQvrvU8QaH8eW6kzTOiqvBrq1RowsJW7Jn5cDRe6gP52lBd45ErsiXi83OT19x_jd-lacir3Y2kJ6c1hyF_b2mPQXz8xGRNJ7w1wKme4YpdbBL_Ib-vr721j7qd4hpYzEF_zF-JpGp93OV111218K_Orgo2vN1uJ2Dr5Ok33O9yJct36N9kJcvp1l_35iQe3hb36rEg3ev0vlYp1T9p3g92vr59v9F1vro4JOX33gu2xvH4wvh14aHp4vS12Qr7a1ha2Q57wvrSWZm_fZ572455yDe5zQqywQ15ywQtFNq6FWy1e475igHi12misDW61l79G9R11582Hrq6e1z9xlEuwrAuwrAuwr3uwrEuwrAiF9f5clq1wgR0H140xlEuwrFic5a1vg6522kuDF-jbZH2ri8j4lv8rD92cctizsy-lbP1eO41Jix22lajUX7Zz2Jhav2vrodX-ew_Iea_Kiz8GOUUxT-MFC31rP3t_Q_oQHD_TKZ_PK-MqPabv7Z1rrjwDrEmtSZk_C8111318w_JJgi2nO14J1b1721qeTrpc9W6xajpcX62cvs74a9ueQ554l91cvZ11Ov6crg83a00e0665Tlseeh87aajeJp84vv415i64vK24N5kJqr21r5pG22yevIwc4DfaZPZsZPfr1rMyD_BsSmiw1693lE5e1w5x5v6Hge51i31G982c5a6HgFizlA5wrR0vix_Lk5DiZW1sg2qj3RKuzNMjUmzXRpNCVujAgMUkr2816j1eO2yYqj_Iw-YKBU_O96d_wv_Ko2nfoSAJ5eBA6m111317w_V1tP2xi18v1O16W1yqgWpqOG0FDI21looqaX911212NX6J0opr5Yy71k1r1k52Ov7F1kr2Pr7Jgkox9Q1vrX5vMr3v5poe4dffZ5H2zMblk5H2vrSWSmBsD1t-DKfnDrC6DHi15x0Jge61gz9xgS5wrw5zlSu4lA6FgAiF9f6caa2Jg49vg82JifizlAuwrR0v7m86X9u3lTu29a1vJfqG2AsInvOoGTLxH6719skUcFbRcK1QOuW_V7p4lZp15EQJ5o1q6MxEiPd1Jp3RApJKxwc1ij21qX_R9ussAnl66p1191wbCp2Pg6VJ1g1451YQ2O8GiE8GNzueMb9ANz2c9w1e9q5qJUo3DU5GiL0rgy8HOO7Ji35J142qTctJ1V7aN11HQX419cy1aoiWN1kJ1313T41viW5H1L0qaGiGXX921J571r1H1my2N91qN9tJcK3819J1v633OGtwJgpDXrM6SHwnZmfnDe5zQK5e9C5clC13Mm5twPt-Sm5wQqye5CyaCm1e5qygl9be453ir2fw5J1sD29xlR2xiv125r0qrc92id5e166Hld6er71q182c5a6HgFizlEuwrAiF9f6clQue1R0vhLoi8KUjk-D_XZ1rT2216z1fk2YtVNAT5EtbDW_LB7FpEUSQs0Ja5Ti3szbr5mngI-qUKke18v1qN2hbRG_LzJ_Tt-Pno0kxrUpa57DInN_KokOkreU75Oyz32hUkN1qECS1111v2S_MD5F1g613v1t14Lr70jydTC1QOCsq939zQP3Jit8vNC7JiY84N4u3gDuaN4jx9ppQih1vQ21r1pyq1n1eX-pqQOi3g293gJ0Q1Ea3hv0vaE4JrJ2rgUorJsrH04oaiK4FNtwJMb4ANt2rNIta6673Py5temwbZP_lrrSmwaSirrZsSmwQsWeyhuS6Zu14NN5ir_BsD25e9CfsD1O1pJ1Qued51d231a7av551Qtq395921wq1e4iFi07e5qyq_PpFQIpF5J7D1Rw1eb27N51DOUdG0a07Tmhq2W07aSjFO9pJrQuxONqq0201a5iJ5FoH5qysSmiw2mdrax0J1W6Hla2xix0zaD1zaD5zaD0zaDuFgf6Hgf225a2Jg822ld6er71qlf6caa2JlG6ziGuFgZuzaD0Gg5hxgc_If-jJv6yqOIyrNT5G1Er_70fv7sxE-E1wnj7zZMdYrp2JDs4zOt_ZNXi4dnQrOv1amHHiaOyFOOwJ5CwSJ2k6OFG4iCpFa65H5GS_BpE8snijnC93rUtvaU48WpoS2ZHJ058F9X0XPXkv111r36_Nl6prdB14a1m52qpQut4SNtjJMWp1rd3qg0prNY5F1etw2r5d1e325e9z0v1J543aiG8G047r9G3Fg06evsbra42r1ErJNsoHsK6riskHD28wQu1rS413Xrov9LuH4dfnSmH6ZmfnZaFsD15yr__lrr_lem5e9CoSSmBw5JuGgAiF9f6cldiF9ZuzaD0GgR0xlEuwrZuziG6Hgs63ix0vl72Jgs62ld6Hgf6caa2Jgz9xlEcv5BpF5WiGcsTYL6UTMCOYCKzOI2FE6VTWTTG4nlkf3auCBWvfklK_GZEoICpzaXw2OXrSjhbQQ_2rg_ahnGQXOcpDugpJ53qDSLaG9u3H6_mpbLzRP7sv1218w_-1dZ2nX1ur1-r3vrucS42aiP1Q1FRGpriVNxT4i6iJJx8rH45Js412Sv8f1mv2Ar8ramoSZPbmrgBe4u5iSm14_PBe45iw129xlE2Gid5H9s62gs61l79G9EuwrAuwrEuwr41xl89xlEuwrZucld6HgFizgFivrFicgs61g6aQUjWQC81Hvd4cglyGc13vDf71ukAZSe7cXK9ZSQtzFDt5D2oDDIyzT5BJJo1gI-GKBbT3yy05rHrzvO4FJtilrGzJ541ecV1q1swxQb9Ji351J66zOOpFO11r3k_Mv6krfb1391qa1Shv2Q5r9711re611a5qg102665sre326411Oz7J9i1ETqj30X5riyy1vz6FvY8wQmqeD48qrrSWZP5uwPfr1_tH4DBsSmiw1693lE1Ggeu4lAuFgFicae535v5wrS0zaDuFgFicaa6Hrs51id_OEhb31t2vgi7a6l1jv2zJ5d84mQ1qxFQ15jbJ6Nz6hk05EY_kfMTvtN0zJN64XKt9QYaSiY-ZT11r3e_B16ovf_13r1na2t6cQE7r901JQk1cQ781076J51rcQp6rS76J52rcJh6rD32eip31OW919w1Q1p3cau3vit81939HQt92rz03uQ9Jiz8JNK4M1t1JNI0aCU73Py5temwmSm7cWu5uDe6FQe6FQ174NjtFNrC25q6FWypGOHi16m16D22vl81rg82xix0J941GgSu4lAiF9f6Hiq5Fl2uFgZuziG6caa2eT-0DF-NGN_94Yu8ZEawFOv8qWi6xsvg6O71rHsya1coqv_2sPmhPKMpg2Vt5X2i19B1etrr3Dm7SpL_UF-ztBF51odMheip4DI8v1219K_T1vJ2bg1rJ5yr6Q_twlSiF5Op3rb7eau3rXU211wrcD3yr9U1Q153Q9pp4aTtzvShza5wHPb7SOZkHPvyJah8Hak4qv0o1rQrzNMuFaF2zO59450r2aQ7G26pqQOyHOIe6hi73Py5teuZaC6hawE7cWu5uZu7czmZeThFe9fye5qye9Cye5qywWmfr1gtFNjtFN_5uw55e9fyk13O104asxC148_Noi09FgQLt_vPJQzuvQg3qiApGOIiw1kr5Ts9q9cqvep4sOSdFSktET537a_mwg3wJeorEN51F55o1W16J52rxrs8HWg6J52rwi_uwS76J51rqrup1W76J51rz63uFS76J51raXIpGOIpSD2fw5J1sSh2q9R0zaE0vi30J981vld6er82xixuql40viEuwrFicld6Hgf5FgwuzlAiF9f6cid6Hiq5FgZuzlAiF9s61N31rg82vdtoxiTocc4iH6hhRgz43vQoTlbka7m2AW29H9ZyFPcjAY29WYsecDQ0erJsTk03GlmpxrVhq1Tu_BfpdrQg2Tno8Eg1di24jt-PLf-MCgf6xDm7ZW_1nIX1lNd5WS80pLS__C7-16QAswmeSk-KpwE_Rl2rv9W8YMSrwmQ5suOOKDLm-u4111215w_I1s-2b51ur3Tr90rpWNKhcsvpEDKlJuF28Q7mGCAi9TK3ZgY1sNtfeub6s1LkrsE2ENtkeuQi1WQ3ErjjGsPu1rn5JaL23vf4rOf3FgH1xv3d1Cr6s1YsxCQ2dgL2Wr61ai6w1Mp8Q5YeqCii1g52ei69JaD2w5Y2ran8ci6ovrD0eTpa4r2u71j1eTA5uhmZsZ55irq6FQMoGNgfsSmfr1_tH4QCe5q6FWmfsDHi16m1rg82Jg85Hgf6caa2xix0GgK1v582xix0zaDuFl20xlR0xlEuwrAiF9f6cld6HiqiF9d6er6gXh9baW1Z9uE7FDU0x6pa9jm_UxX9qvYtcUD1fmLb8e7t3TVpSd5pseGh-wnrxQ-2adxjkcTe_V-KZQc03T-8DhXFL8-lOXctxTQ9iQ2OCyaRsXG9GXYroaMl9x01wX2uwXU9J1212Z_Lvw02b51o13or6Pv871bg36v9JrS9ATtmeHV0vrt4H1z0xgy9JNl6saf1r622JX10Qgf1r632JX64Saf1r632rX80xil6r164HTT4G102JTE9HJs4JX82r106GXYpqJI6GOPhzQgpDXrM5ZmwQsWeygq6FQ1tDZ57cRmZez55clC5wQCwxOIpXlybe453iemiw11fr572Ji74J979G9EuwrZuGgR0xlE0GgSu4gFiclf6cld6Hgf5FgZuziG6caa20rgppHQd8DS9wvRr6CBOFaPjh1h4FNTiq6rjx0opx6OCqm6855TtJw_0Q_-s--FZAJVyxOxO-8Rcf7nA3Dk7GOBoZGmyfPYaC13oQdre4vOov111r25_ND6hvfW14i1cD2qFHZt8MNmZHN5oqTsj25l1HN2dcl2159k2cD4sHl2159m82O41raQ3eNQ9wvJpv982zvf3wve6Hld3Frb8eJk2vi22JXE7rXSpqQOicQIu5We73Py5teuZaC6hawEwlrrS25fyr1rM4JrSyDr_lr_HtZaHe5q6FWypGO15ygrblgg1sDHi1582vi22vlWuziG6Hgf6vl79G9E9G959G9Su4lZ1e9Z2q5x2xixuwrZuziG24iG04iv6er5NTnACKVc7ev2cb-8c4Me1J9x8xDmm2Ag_h-glFCI1dRbJtVx_EJopJYUux6ier5eeaD2iDX21rwzf9Z-GKX20x1t41Jrrz5m7rltha0QWr8A1qnz61uRe2gy8eecrv121o4-fJp-2b11p11HPevX52JX1ov26Q1y511l72Ts9HT63cTX33QrSLSMHirg5ueMH245H2v1tF_P5yDHi15x2xixuwrquriR0zgFicgFizgFicaa2xld6ri4uF9diF9d6er79G9E1kvddcn28e121ziT8RQn5DOwfpcZ2vDrsHSS8qvKoGvmmbCQ2fdZ227Z1qNy0zT62d6h51sjlbSc_d942wQTp4Q61151ObMF1_l6M11f14C19ci54vmg6J52rvX821iw411w3vX821i07qQYo2i0pHcua2vIwc4DwmSyeds5Cc9fyr1_wmZu5elCwxOHi1ax0GgR1qg40zaDuziG6Hgw5H9f6caa2vygicXEw_BmrpNryGgP8Zp6FdPn44EuiF-B1LEf1wXm73lVoUK-J_ZM_K407egRyr121o4-fJp-2b11p11SPevX52JX1ov26Q1e511l72Ts9HT63cTX4Jv233TrZWZPblw5724ablrrHirg14N_Be4Piw12icgFizaD1zawuFgE9G979G9E9G9s62gZ2caw5Glx2xix2caa6ziGuv7A6STdveDr1r9F0HMC8cuo5SGTn1lu56lmmeDRi41R8ff-h1sSPJrePJ5K4xgV2rscde16dR8MgbSx1JaCp3vC2r121ig5gvtM2EX1712br4C_4v5J4Q1ya1sr4WTshrsv4vl6419ysHl21a5y41a321Tr51Yr3Y1p1JTg111y41a322ijpqQO2HiI7dPp73Py5teuZaC6hawE5clC14NNwlSmHe9fyaXI1sSmiw12icld6Hld6er79G9R0xl39G9EuwrZuciA1W9ZwecdRcOX035napK-q3rZ8FbC7JhLe2sjUcXb0wlmdUI-GwvQ9HDA1eOb1112_MZ-YJaI_Ai1511mr1Jo31lr31Ny1JNq2H5rHe4513_miz9FiH1Niw129xrz9q979FaG04iG24iW6rtue_BQe_C46SJdh17rh5l27al2w_VR3vUC1JO9Lr1210a5Ev022RD1511Qr2rK1J544r2W17TpEva411TI5aVw73Py5teuZsD1tDZufw5J1er79G9R0GgR0zaDuziG6Hg3rwQQpHSQualRuqr-z9Q5NGrSpYs0uHXY04EEY11314t_KvtS22r1911G16W1tvQ8pqlC0ZQRxql621lRy1XPy7g11r2Y2J583Fiy2EgkhxT3pzcb3AlnmcVb3Jro9wvn8Hl_6Job6_Nf1clD5uemllwMS6ZPfr1_5temH6ZP5yDrH6DHi1ax0GgR2vgz9xlE5wr1iF9f6caa2Jg72Jgf6cld6Hla2viDuzlE0xix2caa6ziGuFgZ1vyg5F9P6E3qinYIhr6uCSmOx2rp3J525vTS2H17ytao3GaS50Kcm8evrGe2959Opq1DugeN1r4G1svPy5Nk6qjLx8H9o9rq9H5Tu1pZpAaC5HoMYjqQ9HiC1rQ11191Eb_d26N70J1Q14g1fQ24pxaWi4TWuw2015gndr18i4v10wvni4v511OZ612d8v5n2cOXpwvb3zNpRJT43ziXa30v9v919c1x1x9ry31Xi4v4y22mS6SH_memBnD1tSD_5tw5Be4P5ySmiw169xl79G9EuwrAuwr3uwrquwrZuziG6er76rl8uzgFicld6er11G982vl86Hld6HgFizgSu3lE1WVhbq1L0za63J9h9wYo3vi3sCS6SXh-_PUSaWgUhv921w2ftQAeLQPepzJJuqvjhcYU1jmUqr7fqzJJtslyuvBk_FOBYhKxCtB31XlL6DGPRprd9ctiE0sQk11217R_Jrt023l10J2Er5D065glmx549eJr4Gg9uvch66glhcJ74HrX32JX11OT31gd79grWcv474cb27g5RJr421Jv051Qg3q1001QT3qJ01l1021Q93rJ01rQpe4dff85ZsZPfr1_5twP5tZ5fe45fw5J2q9R0zaDuFgFicld6er79G9E0Ggz9vl76erf6ziGuFlAiF9d6er82v0tFgErcCjNgREhixampHrBcEhQdSYac4H5m2Xu0wjjcFMNvPfoAt1LySaEyGieoBjRnTeieG1-54OEqarN1191h__q25J7yv1b1451hD1Gpq1E0zQvuxh70WaEjvPW71vvy2aEy1Qy6rgl11XoeGuf9J9zy2Nq1eNqRH935vOgoeVX1rC15GDXQ1921W1Fg4i354iJiNNF1Firff8dfnZQ5if6S6SHBsD1tFN_5iwP5ySmiw122car6Hgs61gz9xl72xix0GgS511Ficlf5zlAiF9s615x2caa6ziGuFgZuzlRuFlE0vrQ42N3y3a-8axksi-9z15kXRr_fvXw4aCk_cGTUomBs4TxwrNy1J530RX4lCyw_IyU4vQTu6TSuTUuZr5o1a9Qer7WQWWcx_XoHNx2LcNqrrDqIfeAas511191s__q24O56r1b13l1D53Pevc55Q5Wge0c0frrl26A8R1zY23v5j1hT3yJ5lreS25reJY755lze3es36grsGus07rrgGrp311s3xap0H1U8xlQuc1S07a6hqip0xie4vrh94v97erX11v711Oh5r5v5QazdvYV5gTeYvqE9Jle9Fvb23N5tJr48Jet28N5IJwt2tN52vrEy3QlO2F18u1l22Hv415r441il1Gt49NY2qgiuvJ3441Yl3R1prumoSSmlfZ5fezMS6SH_lsmlr1_tH4MH24P5elCfsSmiw169xlEue1ZuziG6Hgs61l72Jad6ziGuFgAiF9d6er82vix2vlWuzlE1WBxz0W-xndEjg6HiUo-vzxRkDsmmQrR9FnFEjHVTxv2iBsusxCHbn522o41y5dth69Qwosws2TcjFazkS251X-MKY0grs111151q_Mv1VD7tJ1P17C1a2DX01JX1Jg403Q1yr2Wp7aY211Xpv2t66NakHe_69NaRHqK6oNa32rL11lr2Z181Jli93529riX01JX52St8sNmkHA_8lNmBHD88r1K53N3fqMmBlwPFsDrH6D158Zdfev_BsDrS4_PHyDHi15x1JlAiF9s61l70vl862gs61l79G9EuwrZuza45rgz9zaDuFlAuFgZuziG6er4p_9m1VTGRDXxdBQ932gew3QV1ca4bq6WIA1442YdjuAt2fB-O4Xih5Qy2vitC4BXtkCUa4aT31G3Er5e1q9pgdi61FcvZEW_gd111191yKZi1_95111E14g1Q52Y5ce3619W2aQH1z1ascCx67gLhw716p1a2Hge0c5E8xaJ945A5wgnuw1JiaQ8ecCq66gL4e1X2HrLozvf0GlX8cln2xg21rOIy2NjoHT_7QNj26NjbHUt7UNj22Tay4rX9JN11r2Jy15X56ZdlfZ57yZMS6SHBlem14NK5yQgoH4Y73_uo_Smfw5J1sD1fr542vl72Jgz9xlEuwrFicgZuzlAuJg79G9Eue1Zux5G6cld6er82v5x2Jgs62gFizlAuFgZ0xg4Jcl79GSznyy6dRCf0pcEJ5QJ1FjsgofzEV1266S-9dOs6_VBKEcmkECWfSgi6evTsv7K_I49bV0ufe9hwSQz1vyZnKSQhtb61rVWUz1J1Ze8mXT2bXuAPY7qlEWRkylb8v111r3e_N95uvh314J1ca2Q41D3ic9G9z9GiQgJaz0_4XNtRJNp4JO15Hioy417011e4GDX4HJ2wHHb879ubHGt80NlIHG_8uNlBHJp819XyvQXRFqKuiNDZFr5u21-i4C1tW1-g4CJtT1-Q4VvtO1-D4Xotc2mSWZPbmrg_memlbZ6blrg14N_BqNrblrg5iemiw169xlE0GgSu4gSu3ix2Jg851l79G9EuwrZuzlZ5FgSu3gSu4gFicld6er82clfuzgFicld8J9d6Hgs61g4D5ld6Hiq2sC_h4uh92JBpwX031i41JlwyxYq4c182v52aIPYYzXO2vva4cr5t4CiaYnefeYU7IHFyVk-vDg-y3vy8cWCW1obb3OFdF5UuSccwEWGkdCgkESOwoq_D8sh5rJYuJ131ot_-J7_2mT13J1z16s1uvgX12Xq8vgv0w1Wa3f10rq10h1WT3a43wv472ak74vt9eNWoGa_0fNW22NiKJJ3a1H_419i0e4dff6mblw57tSMHirg58Za7ySmlr1_oH4dBw5J1q9EuwrAiF9d6er71Hrd6er79G9EuwrEuwrquwrAiF9d6er31aTJeQgJi5s61JlAo3OZ2HrZpGOZ61wGe41Je5rJi5wNS4FKt3JXy3JNBFHn1eWnowvXosB-CJ13_-BMUJpr2mv13J1I16u1y61Qg3r32zv1939J9Q1x1G9Ty2O15vhv0154y1Qty2af8JJX12lr6G1fi2m16S1fg2mJ6X1f3elP5uhm_lrrbmrgBmwPfr1_Fx_MH6DrBw5Jfr5x0zaDuziG6caa2viA1JiDuziG6clw5Hr82xix1GgSu4gFicld6HgFizlA1miJeaaJi5h7y15z9zQO9Qr39ePwdT8fQrJ_p4P153vRiGJb71wHe3NJe5rJoDwV0Za2Xv9RiQXG7KZ1_hxolfO2qHOsp4U39Q1Grz911r3z_Ml5u1h514r1SQ309Jazi5J8GxD51GN2Gvo6pJ9p11Ni1LN1BJF_1tNi25OTKJ3_4iX1FJFb1uNi2GNPorl89GDEcHl1155J1xN6sHl21a5JoGDE9Jl62J9j419p9G5mi3NP0va32x3tuYNAIFj_uONAZFg7uxQYo51G1w9y5wvx935fy2rX8q983wct4v5ypFsaw2vIwc4DwsZMSuwaBnZaH24P5uSmwQsWeyhm5clC5e9C14MuSiDe6FWypGL84RDrH6Smlr6mlk13O104asxSsqi2dva216Smdw5J16D69xlE0Gl72Jgs61gz9zaD5zaD5zaD0zaDuziG6caa6ca42clAuFlAiF9d6er82vlw6caa2vtiuHXDjk5VnvOZpAaf3rQZpGOZ3vl61Tc-Z35E0FNmnBwjEwNYyEdpNqCwECiPy9cw1aPwE178WxSVoqDXy3DLbqB-KUVLj8Fz9zXY9x7rYbBfDwNTyv121pB_Sr7w2QQ15J1Mr3Jt2eN6oJa_2aN6fJsK2rb_2r564J14y1luy1lXi26r5f1eKH555wNsbHa36e2mSWZPBe4P14NKff5Hi15461l79G9Su29Su29Su4iG6er31gQt31YggcgpgEip1Ho-4D-hh7hC1nsCRv7fREeQRKCY1151nb-52nv5sv2i1uY1Uqa_0arStFs5wJS7e6h5jeSK9Eh5mQroi1DJraQmdeD551Drrq1u95553wc58wv_6qOo11Puurg_2Qr77Fvu74vu1252526r5d1eQ27v5l1eD28v5rveev9X15T2Q5UvqI2pJ5IrqL2pN5T8qvgX4Dg215gbeQ27fDjbeUM7KDktePM7BDgpex9Ny39X141ri31Ji42Ji1aJ15Xvwz2yr5CvwR2yO5BJwvcmoSZPBe4aff8PbmemlezPbe1gZ6SHblrgBe4M14N_tH4QM8Z5724P5ySmfsDHi1ax0GgR1GgR0xix2Jg82clw6caa2xix0zaD1zaD0Jg82Jg861gs62gs61gz9c5DuzaD0zaDiF9d6er76elAuziG6FgAiF9f6cld5Hg72g6q4c9q9vTg9xvWhd1n1rgn5FlIpFlH8Qh9mc1z6ciMpf5d5AgRrrT3uiY8RwOZE7pRtrJm83J4t6ufkOv2uQs3dzNV9SCn_KdnhGJCyqHC1mWCjzOvq9rg0FFUy2CO73QX1r5NBzJSS4kze3vwa2sYjVAlqaED0tdO_ENTy11218F_LrtL25r1uJ2Er5gu419L5xXxoz9LRrJ7fJCK4RNyzJVK4INy2c1UoJX_4QNyfJCvpTNy2J1o71OX3zvU0GJ75zvUy2Vb9r5c1vaXur1J1w1C5uhmbmrg_fZa7uembmrgBnD1tNw5Be4QC6Smfw5J2q9R0GgSu4gSu3ix2Jg82vl76erd6er79G9EuwrEuwrquwrEuwrAiF9f6FgFicld6Ha8629s61g4xWgo81X8a82Ef4r32JgiuGOOuvDm2FQUf1Q4Uo7vtGO51qOCeSBkmdglccFgcfEC0FOGoHCX8xDXy3Dnn2CR1dSR98XvpFn3mn3ufIcWfst--s9OuJ1315Z_Hrti21D14J1m17M1s7Q1hvv3evCk2Wryfe0d6WrjmrWV5Yam3qQr0cvC54ggecv654v974v1qvv231g13HCY17r9h214ecpq319ay6N5RJqK21i584ct4151415izHN28H2mS6SH_memBsSm124QtSDKBe4PfsSmiw169xlE0GgZuziG6Hg82vl71Gg82caa6HgFizlAuH931UcCcJl7n9FVG7mq1JuHv0nwaQ6trWWTqSa64zPNxLRxIiLZWu4nRk94br7ulh7eaauis9N2vJ111v2Z_kO4N1eo13i1iv2ar4h005gOdqedo1rQy2Jq83JX11g181g04vOh6riUp4cb3XNo1vOJy51va32v91i1921v931494rrS6SH_mem_lw5SirrHir1tGNK5yDrSuwPfw5J2q9R1Hr79G9Eueie0xlRu4lAiF9d6er82vlAuziG6Hgs61l71G982vld6egFizlAuwrE1zeQn19ZpGOZ1Jii4HTnyqlS1Ja3sU20FsMom8L9f5TSarSPkfS3ysQz9tXxo4vXo17r1g_kPiP8iwOZp1Qg8HTByBjrBmxiW1uzpeSuX_TUfs72PIa11191ttZa1VN5pr1n13N1dD1-7q6apdrY1GlX4xTLyxCUoviLy2g77vgd2vX79DgzqGQ434viy1imo4cr8g1mQ2AJ8rrm9Fct5WNqkH945z1rSWZMS6ZM58Za7ywPfr1KtFNK5ySm5ySmiw121Jgs61gz9xlEtJ979G9R0zaruFg6iclAiF9d6e1W2vl76erf6zlAuFgw5JgR0vyuocQAo6J71Jvu5SgzATneYjQ29FllpG5Ty_VZL6Ciq5-ifGJJ1JXaizl2y_V1SUDOy7aOrA_m6Z6CSv5WOkg3pGh1pbBhV37jbjWAqW951AeJ1rD23Jl52v1219K_Kryd22X18v2lr4vg6vl37cg74vOb621824vvpqQO52Dv8w1mr2Sv8ram52vo49re8H1K54NrwH2b57Nr2c1I8SgB73Py5temt5ZMSirrZsSyeds5CQZMHc45124EtMwuFe5Ciw122xixuwrR0Jg82vlw63ixue5DuzaDiF9fuziG6caa1Ca8fsg41CCbdwO3gSv6d792JyYea1ozbdiwiSrweQ74_mHWhrp-9grchjjCnROD111213R_H1yr28g1yr41r0rKp7OQ1zT7yGcu2QQqqGcpo7rijxsI0EJTn1HF0giWQGay7H1kp3N1pJgIo41hfJ2K181hWvrp33ab24vt12N1bJ3_11r1i46rir9H2x1hr2E17h1h22Qby29oyxayuvChpETUccjs6vg7o1vK23iX4zr9y3TDr4mvuX1Z1Fldg3T213Trpx1Ui3YJpKNU2xTVl4O2fe4aff6MH2zmfmrrBe4a_lrC5zQCfr1rMtZ5fwMHFsZM5wQCfsDHi12m1q9R0xl72Jg86cld6Hgs61l79G9R0zaDuziG6Hgf6ziGuFgSu3lR0xlEuwrZuxrZuziG6caa6caa2viLuHgt3DLlTr5n8nhJTXSSOXuZEzNT8F5gs5iLs52mKEx6y686t159yqQJpFlhuJi30eYq5Fu1fvO6pacYHVuwe3JXh3vNi2lt42rmtXvJ6HDRy88edePo7c9XoeSJ8qDX1151rb_11XT6mr1P18h1d3aey1aX7rgt8J5b3vOLzHd1pCNsQ3O5i2a_pD1swGPr6sNIg2sKpZNsl3OppCD66hDWy2Qe2Fvr2wv15e1e926J5k1e2e8JoJ5roG1Kr3MJoV1KO3_voJmmfqMmBfZa7yDrHyZQ5yemfr1rM3Mmt-ZPH45J1q9E9G985Hlf6xix0zaDuza40xlEuwrAiHlD0zaDuziG6Hgs2JlAiF9f6caa2viT6wQs6Z5w1r55kqvB2ce0WsQApP90yxYj4Ji31fJqj31MuJua21_MOqJFAFrR0YvE1Qv44vHfo4TeiVOEpznw0wrVtc1p65TOyr111r2P_B14FJrU13X1a51P3JNk4GOtyJN59Fvu3rOu3GNI2cl77x1my25sRHi25GQWovgWy4N11r111r1J5uhmlnSMHirrH2zaffZ5H2zMblw5711_tH4QC24Pfw5J1erq6erd6er79G9R2xix0GgR1zaDuFgFicgs61gs62gf6cgFizlR0FrZuziG6vl4LJ98yxYu6fAzvShb5xln4W5IycDd6x618Xjs1r9w3SgIyv93q5z-X5vddcgIuSM2yQ2B1rRtxjMfuGOLGzdRBQvq5GKoJPxbf4vU111214B_A1tp23117r3Cr9Pt4I1y1v1q22Qa23O5pJsk27O5j2WV28TyS21owJe_28grneQ5i11D241yu2WB4K9q2QTyfJhb36Nu221yr1Cv4L9y211y7e076J52rrX54rhg6J52rcQq4vD721181vOa2v111rD721iy329h6J1f1r214v5ywJxJ6J996Z19v1v333OK7J5jrQJgpDXrfbemwmDrfmSmZsDeywQe5clCfr1gtNrq6FWypGPm1sSmiw12fw6m16DW2xix0Ji40zaDuziG6HiA5FgZuziG6caa1J0g1Sc09hEG3zXYt2I-qZ9kycNCpwVWu6Hd1hg2GHTapwTM_adv1w2rQQ1Vp3k-nv111r2i_VX6rvre14i28a4hW1Ak5YOwEG7a0YrR2vOIdqL19hvcWqdd0CvI2J1113D1ivyW5IaqHeoQ3-1zX3l7l3mDp9OwxG7o9COz2cNz63lK9GrR2uNdZHzb8ru56Q1gr2Sr161Pa497drca6W1ga2D59rDz3Dlf1r23pJ9P15lf1r239eim6Wvf1r63pJvR3ZXf1r63oqOR9G5m6ciu3Jv311DW5eO7oJgW2c1o5rOD8egw1Hvu9G590JOP1v14ixOor35g14srur9vuqQYo2NG1l1G1w0t76NgkHcJ7u1g2evIu4S673Py5temwmSmwWS6hawE7cWufe4m7czmZe5fye5Cye9Cye5fyr1rCyr_tFNe5clCwxOIpGO2fsSmlsSmfr2miw12fr531Jg82xlE1GgR0Jl42vl72Jg40viR0zaDuziG6Hgf6Hiq5FgFicld6Hgf5HiAiF9d6er6y5C-855zt7DM62acaYvu7eC3w5lQ02vuyGYi5vD94FPKmG6qwHJj0Gvbqg5teGT-1Z_-LKCWdA1S1r924sjaZB_-gGgayv941qAk1rEddzDUuSiBsCt-tJ5D1h0Kb8fF_9D2519ctwQT2r1214Z_S1e_2651oJ3Br06U47aggGj91XTiR1yO0vlQ0wrWe3sa0drQh3sB7JmJ3R9kv1U37CT3Q1Uj40NtEHqk90OzLJpA7MO3AJJtjcPWoRQ3nvHV4ZrYxJ-5phgpEvNpz1y449inAJFK3yrW2RJ4lJHF8vii7Gg3225z325I2xi77JJE1vrapqXp2rNa2f1L1qBv915vv2qr6p1a1HrJ5uhmblem7uSmblrg5iDrFe4u5clC14N_oGNe5clCfsD2fsDHi6D1fr582J5d6er79G9R0vi82vl79G9EuwrZuzlAuFlR0xlEuwrAiF9f6FlAuFgFicgs61rxQI92ecQN0xgbfyz4yZ5v0qgB7eJBeeksvDNB0zQWyZnPH8TI93JRt1ujxk8-sx1b0FJWjJ5HGwsJ04JR8G1Wu4DfZBSHu39Tp4VjBBeFrqNV0zl11b_N_kD511rr12N1bD2oa2g27r1012X3yrHv3f10N1RA3Js18E1n1cQg6Hgd61Op3JN121rX3cQa3vTh6crd6HrX4JOa4JNo7Jgq2vgd6x5t3rQt8cC_9r5toSDFoH5FoH5qyqN1oFN_cJXLpJcM5iq84xXgpJCM5ir95ir9H1B5H15LfsSH13Cmiw121r982Jgz9xgSu2i20GgSu4gFicld5HiAuFgFicgs61tF_Uj1e59jr3TMAtVjoeO_0GXhUOyaa5Tvu3Q_1ZFM6tBKLi09uGWQ1mN3OaQL8GQ-9-F-w16hOX5Xyxvd111218I_OJrr2311ov3dr73t291lRJqr8pN5T2G_2o1l32T5812M6J51rcT05v1n2vQZ4Hgl92XZpGvW2vr75vgZ6vOK141ri3T10eTV14aj2cJj2115439K74NgwHcb77Ng2evii3QYo3DgpGM2eevIwc4DwmSyeds5CQZ556Za5elCfr1rMySMHevrS4MMHcz6_lw75uwP5e9C5e9CwxO2fw5J1rg82vlAiF9diF9d6er79G9E9G982xixuwrZ01579G9R0zaDuziG6ziG04iG6er4H6EoTaPYwxnj0GJZuGJRExbcGcargw922r5FcwGaR6QApw87iDr255es1GWIG-Hx2eXCo3DX8xQ5sw9LB18F32lusxJB6Hu7ar111r17_T13Lrhh14v1rIa1icvLrGjX1eh17rP45e152FaGrHvd6ws48G9lpvDlpFWceevIwc4Dwmf55uwaBmwaStkaSir1t-D_Br5e5zQHi15AuFgSu19Su4lAuFgSu3lE9G982c5f6Ha72Jgs62gs61gs62ldiF9ZuzaD0Ggz9xlEuwrAuwrR0v54uGOY4gJxrDlVi4v_ell61F0paIDraAqcqcNFiHmqew5R53DE1zDkwDONpJ63pNat1rQruzrv7HSf_Ow8HHJyeaJDogmq7AXkOhEX42a_rc59cAHa9grcoS0811121d8-Wv9w2Ii1411Yr2912rXYpqJ21r94mrT0pJSVW2vIwc4Dt5ZMt4Hy55sWeyg1oDZmiw12icae2xix0Gge5wrA1kSd1WaB6rOD2Iuh-o6Sw3v24Jh20F9111512KV11IQ7dr1X15H147T11r1giE1l1qC40Iv26Q1k3Die53Tu9QiG8DiS2Jrl25igl1D24qOCgaagpDXrM6SuZnZ55uwaBmwP5ir1t_D_Br6m5e9Cfw5J1qgR0zaD5zaD0GgR0zaDuFgFicld5rl86egf6caa2caa6caa2Jgz9xlEuwrZuziGuFgSu3gSu4lA1kJZpGQuz304eFTJy4M6HJa4iQYqKc6whp6p8FiF6S06iqlroqg3tePtqFJI1a9IHrN23e1Au31k8sb-Hib881C6w4rPcS9kkcLHEkvi6wM35rx8k6rcc35KaQl11151h18w28l4Yv1c1601oe545J0l6J51re5h1Hi71vvs7rN914Xs2zXt5H541vro83iYpqJo42JI9zTC73OrwKwaHasWeyge5clC13Mu_mwPH2455e9C5zQC5wWypF5J1w9f6Hgf6zgFicgs6vl79G9R0xlE9G982xix0zaDuFgZuv8wsDmLrQlYwwXEu16eaEMKf4e8uHsfkcDJ04QpuWmR1Vh8caT71_gH0TeEjaOIg5LMiFiQ5HmSwSZ__J34_-96q1lE1xg101111rl1zv6G1l917Q1aa3CvoE1D1J1L14rroxNDa3Cru1g2fsDH__N1v__x2av8Dr9E13r111581uJ2lJ4F13c19v1J14rri21D211J14eti5NDa42ru71Jg4e_i8NDO43Ju1J2fsDH1151dKCY2oi6NJ2119S1fwOO1eTfpzN14reh3Jv_qxYYpv9UuHll1QNQfGqb01iQg4c_iTNGRFpKivaXic1ptJYT0v5717Xu4a63yF1va31392iLy11w1f1wv2yr5V1wO2tr5-1w2HiIrwSi73Py5temlaZM5uSmH25qyq_PFsD1tF_mS6Zdfw_aBsDrSuwP1e5qyr1e5zWmiw1661l79G9Su4iG6ziGuwrR0GgEue125ziG6clAiF9f6caa2Jgz9xlE0Ggz9vl35erf6ziGuFgZuziG6caa2Jg86vigz6A-vQQqw2thjU7yzJ5lBt9JwHXzy5ld3cTlowNc8cTwah7HN66anAhIuEcu7GQNU9PYuTVWt3cyqJeDe3QXa-Vk1s52hv5Y3rTFm4uBocNxqD9u3PB-SbBAbsCzuHHpy51Ywdha85t__J3i_CD5Krz31xg1p1111rl1zr7B1Q512B9Kqv52fw51__N1n_-H2vO8V19E145111581uv1Gr8d12013vMj8ST3oST_dv92fw51fw4__J2D_Ni741m11xg1iv111rl1zv6n1mJ1pQ1cfGhbi7NEkF3b0YNJ2vNE4F1b0cNJ22NToGvKu4NTtFr61sDH16Smit__10K_A1sP2GQ30v1X11122J3y1yN2Hr1Xr3JtiJ7rph1F1cNI8FlKpGNZtGO_uJgtprNF1YNYRFi38GQbiGNYoFubpsNF2v2mfsD2fsSmiw4__J23_BX521j21xg1e1N11rl1zr5f1111651i4Fetu10trsM2kD541sDH16DJ__N1rK--21r7mv9E15rt115815i1U__C11LA4FhtuENA1J2mi14__J23_BX521jx1xg1e1N11rg1S-5912c151M2Q57Jrl22D556oD6trr92fw51fw4__J23_BX521sQ1xg1e1N11rg1zvD112H161NS4D6tusNSkFa64FateGNSoDl516DJ1sDH__N1rK--23O6_v9E15rt11571uzzB110P1M8oDl316DJ1t__15o_Kvr52PX30v254J122v4l51115Q1u4FateGNSoDmtuaM82v2mi11217R-rJt023l1yv2gr4PdoEaL1vQ449NFRFi38FibuxgjoFiKuzgjbFi8iGXXy1lN536J9g1c1G5Ey2T7sxT22JN1ucgXpcXAt24nHuwP5uwmH6D1t-Zufe4ABlSmfmwuH6DHi1aa2xix0GgSu4iG6ziAuzaD0xlE0GgSu4lAiF9f6caa2xix0xlE9G982caa6HgFizlZuziG6caa2egd1J0Cnssig5rQdFiHi5PiRA2RcCjNgREhixampHrBcEhQdSYac4H5m2Xu0wk_12DlH8HM93Y0uz52oxDJw2DQm8LHGMzJozPs0zOz5q-AYZU5w5lvtc1B0Emo0QX1__N1s__q24O7vr9E15v1115819D29J1112e141NFwFi3i4ubiANF1J6mir2mit__16b_DvrB2RD30v2911122J2410X1111oPvNIwGPKpJi1fw11__N1s__q24O7Ev9E15v111571ubB111rr1OtuR1Av4jruP1A2r2mit__16b_DvrB2la30v2911122v3yoE518Q1d4GTtt51Ur4J54GQtt4NYtFHtpENU2v6mir2mit__174_-J9Q2T530v4d11122v3uxJ118Q1d4HvJ75Ng1JNk8HOK7FNkwHPb7ANk2J6mir2mit__12R_-J862RD30v4d11122v24c111651i4HOb7J9t7DNkkHO416DJ1sDH____lK_B1Uv7j19E1ug111581ub-Ot_y12Y15vNTl3x1po1T22NIoGPtpZNI216mir2mit___Xk_-J0X2dr30v4d11122J3y_UQ1111Gr3Qt71NOoHvKo1et95NO1cNv8GJK93NOtG1_o5NvfG2K98NvbGF_9tNO4r6mfw51fw4__J2N_BQ5ivgq1xg1ar111rg1AyT111-Z4DQKqr9Kdv52fw51fw11__N1a__61M97vr9E1697115819D26v1111ED4Gctp191fw11__N1a__61M97br9E1697115815i1CJ1111LA4Gctp7NT1J2mi14__J2w_Na4Xvjj1xg1avg11rg1S-T112c151NOl3G1o01O281OQ3Gvo1i2fw51fw4__J2w_Na4-JsQ1xg1avg11rg1zxJ112Y15vNc4GJK9qNO21NOoG5_9aNc216mir2mit__16t_Hre62c930v2q2v122v4g_r114BltixNG1R1G1r6mir2mi14__J2P_B14FJj21xg1d1111rl1zr5p11113krti5NJ1v2mi14__J2P_B14FJj61xg1d1111rl1rJ3M11v13Bgti5NJkF1416DJ1t__17Z_O1tt2YT30v2g11122v4fLv119Q1g54D24FSJtg1MQ4AJtm1M2cNM1w1MkFD31sSHir2mlw4__J2P_B14FJf11xg1d1111rg1zKMl12h14vNH4FD34FDKiaNHQ4D51sDH16DJ1151i_NJ29a7Tr1Y15219ql92G1t5Fvky1lT1Hmv9Z1zBJFv9JrY7cOzp4v761Jw2G_5F8Z5H2zMFisMHlem711KoG_6BbZ5H245H45J2rg79G9R5ei89xlEuwrAiF9diFlwu4gFicgs1HgFizgFicgs61l79Gl41YO2uGHc1vG0Qx6HuGQvvx7w44vIo4lihwgWQGiUuRvFxpOpkqOXgJ021vi32ceqpzOp1v7bo4vXotCl2e9Nps9f3vfM-J1315r4Fvo-2Y114v1m15d_12T26J1112i26J1812l26D1o8GQYo8N4IJi31J-X1em13Z1oT1O33GOnqwOgpDXrM6SuBmSmwQsWeyhuBr1KBmZPiw12icgs61l79G9R0zaDuFg462ldiF9ZuzaD0xix2Jg2RhK7lAVqEsPwjdaXpz6ds5u8kSSoyzX7Qu7vzEebkddfWdsb_UmsyDrDy62xnzgV1191br1v26T7F11D14J1da1I4G9b9v9xyxvX52vai4QIy1Q32eXF73vI1c9ryzQ01zv8uwvr4r6J4r5ute4dff8MSLSMHufsSirrSuw5Sirg13_mblag_fZ67irKZfZ67tSMH2z5fw5J1r966Hrz9zaDuGgR0zaD5zlEuFgFicgs2HgfuziG6er82xix0GgR0xl71JiAuFlAiF9d6erW62ld6Hi72vewv_B21sHa2u0eeKpF1vg9e3iS1ECn8QT_8GrT5eHu6zW3225ln50L9xgxutF08Gx5idLe1E8-LrlCLWcfgajunLGM1sODeXH5ixqH3FY3rwhbkHW753v9IbBN_W16ej5JoG9eMjH7f4O49wwP11510bMU2ki7qv2g1pH1hScd0AvW8dvjoxNJicTy8J6u1GTLo2vWy2N2wS5Xsv52irVo65v814c5Ez1XrwXXiz9tieNHoF5_iaNHfF6KirlH3x9odxQYo4Yw15lreG28i5m1eS28g5l8eCJOy5D4y2cwpSWEqcvIwc4DwmZPZbZPfe4mwQsWeyhuSir1tSDN5yZm_nZ5t-ZP5zQKStZ55ufP1e5qywQe5zQ15e9C5e9Cye4E5ygrHz5J5FlEue1Zux5G6Hgs61gz9xlE0Ggz9vl76erfuziG6ziG6caa2xix0xix2H9s61lFuvrFizlAuFgFicaa2Jgc9xrz9vgz9xgSu4lAuFgSu3l79G9Su4gFickUq1puRv5fTgdcy3aF8xSptZ42j6T2WW5VV4TRiz9RyLvVwZJMp2Pc1e2vUzgq5JS8dcsi_UCx_LYxqpDy9FrHrcQGyQWyW49W5DQ4nv5l7J5qLiC6s05QizHh9cGgclXs6rJiixlRivJp_Khsb7O3n5ggjQmvuaoUmWrS9HXFrGMgnWzV26DEu1r11191mb-F25J7jr1C15l1ga1MT1J211Jv43TDi1H145TIg1J86HvNtJ1news53e5IozvQ425X2vP9019TuF9X94TX7JXp7Hs3y4lsy4l3qe4dHyDrBe4abmrgFe4PSyDrH11_5twPH24MH29fysSmiw126caa2Jgz9xlEuwrFiclf6x5GuFgSu3lW0xgSu4gZ0zaDuFgFicld6er79G9E9G982caa6Jad6er71erf6vrfuzgSu3lW2vg4BsAinI_ExU2hyHvbtr50kDWjL_VQfWXCyw37mpoYWx9J9HIfdQC5sog20o9V_dsRr162ur5oHtBm6xJ32dx7OSMqfEZadzmYLxTDhXv-l47vkDuFiaCREWWuT3aW9Fnn03PpmWL4jNTJgJ6_k4DEacN8u22OhXO0eJ111r3Z1xX3eJy_11O1s51-4Jib1GN4tJub1AN4bJyt1MN43ri04qQYo1N78JgK2zN7fJhK2RN7zJkb2vQ74J1b13N1tJ2t11a1pJHuWcvIwc4DfaZmfaC6hawE13MuFsDHi2iDuziG6caa2xix0ImSaSuSmsuwmroAaZhAaSuSmr1415b_t1aL2RQ16J1Q15a1sD1J94vAuQ5O73aXrqJ7rer384vVezrx73M50qNXa3YvpR1U1GTgy3gt3wv5129ty1285ukMH24a_e4mBmemBe455e9Cye4lBr1_H3_55tZ65e9Co-DHi15a1J982xix0zaDuFgw5zaD0zaDiF9f6va52Jgs62ldiF9Z5c5Z6H141vl79G9EuwrZuzlZ2xix0GgSu4lAuGaAiF9d6er6oWmjycNH0wv7qDWi8SP26c_-2bBAxpxrnYiUt4EL1F9_e2gB0wv56Haz9e_vIlpyxti2heay0w95XjZMV_Zrk4OG01XsBv7b1kociNQGsQSF5wMFQtx8s5la1al2jlWc_Tb-gtZDG4OH0rOef0oJ2Rx7SKLAIWhz2FQWr11213B_gJuS2x91rJ2Pr4XS8aamseSvoJrN9J1X8r1KizvY3JH5ja529FvNrwvcuzcJ0Y1ET3g40xD9y2gt5eQwuzc6pqQO0ciIe5WU73Py5teuZaC6hawEwnDrblw5Hirg_lklfnZdBmfWfr1rHtwMH4_M7qNKfevHi15x2vl76erd6er82xix0zaDuFgSu4gSu3gS54lq9w9f6caa2Hgq6er79G9R0zaDiF9diF9ZuzaD0GgR0zaDuFlAuwrE1bhQme5q2JvdaGvV1crp1zYc1eyxf68ybfAUUWY7a55ngGWw9Gmyp7WytZa_e1szKB_eNzZDtYTKcFrR2JA0bFfauqnk0v6kUv5mbR3TQlHs_K7CIUXLussuqeNxsoMFyQXVixONkQc9jdv1212k1iN71Jhb11X18v1Y15D1L52DkFWKyAM3bDyKpvabywOBp3Tzp3a5pvJS24TidvJ6l2N2rzP4p69f1r23yD9Mp5iE8Hl-24i1tr5M8Ds_0v5Etv291avitvN1fGu_9J04rzO413vTwQNzbF3ti19Ja5Hvw82i1DJ9tQNYpqJw14XkpDXMyevIwc4DwnZmwQsWeyhu_mhmS6Zu5e9CoH9fysD1t_ZdfnSmSuZmfmwdBe5qywQqywWypSD1fr5e5zE84RDrHiemiw1262ldiF9ZuciA0Ggz911292ld5e182x5v0Gge54lA5FgZuzaE9Gix2Jgw6cld6Hgs61gz9xlE0GgR2vl79G9EuwrZ5FgZizgFicld6er24h74XuGLJv52nT85_I_-Kvpa1rdGU_zW_PK-SIb6DmUqR3y9ok1R8296UFQrpzu7ixepeqWpq3vo8eu40wg3sHca4DOvLsUx1DFRn7GaYr51G0pj_ON2XP89_Kb-LuKoRVO2iJ6KFmbMW2r09Q9c2ww-_Q9t0H9ht3aZuG2dacC8z5QH0rvo1bnL1cljoXRx111416T1NJfG2Wr14J1l14X1ha1V7ev-2ZN9zJxb31i9oFXLtxaTt4Xmtzg1tv5-511JpS1I1xOVyzM144C1pqQO62Tctz95tcTItFDN73Py5teu_mkP5uSyeds5CQZP5e9CoNem14_P_mkP_mkaBbZdflwMH45J1qr82car6HgWuzlAuwrR0xlv6Hge61l72rre51129vl76erf6ziGuziG6caa2vl70GgSu4lAiF9f6caa9G9E1B8-DBVVQXi25uAczSSTNJ5cUj8pAKBQ_qv2N15FlWYmrwQMqYOs0wkzlTcPm0-qTFvYoDXo0vdn1YjaC_BZlAv31lxHLOhDvInVObBQ-ytD1Jv3R15r1kf-8FlVazQR9ROC05j91vuddXjmldvl94su3J111v2u1DX7Drh013O1wJ4lr9CB4XOt1xMTo0NaIHq_6iN6J1z10PN6D1zr0LNuBJNop1aE2TQf1r638vvx2Rgf1r238vDm4Zlf1r62taaCqgQf1r62qaaMp2Xm4JD92vaoye5x0xHiywlZw6QFo2O4rH5p7Gr1eaQM64Qm4JD4urvx8xvE2ri12zaa662eqwWy8Q17965YpqJ1wxPrtwOgpDXrM5ZmwQsWeygj7aZm7czu5uZu5e9CoNDe5clC5zQC5elC5e9C5zQ1tMwmHuw55urN_wJrH25qywQe5clCwxOIpGO2fr1rCWDHi15a2xix0Ji72Jgz9xgR0xl39G9EuwrZuzlwuziG6HiAuFgZuziG8J9d6Hg2icgF0wlAiF9s61l72Jgf6caa6caa2xixoJ9EuG9E9G9Su1kei2C9ya6086W5oGvw6r-2j2XK5QgHs2rHg49F5qvO8w1HuH24ocOP4tR8001W1asyi2CteWKl21lp7GNbe1Xp4vQ4pV9YqJyg8xFo1e40tly6bXQV_zNL8cgjgUT27ww3_K1mcCr_jwZRPWHw6vpy4vg61DP52vv6tEWNo2MC6cNYqoGzfzNyqDT11151Srqz1YQ7vr1s15P1oQT8dvl3yva2uer22er056Jf1r2262161JQo11Q162102rr46GQYo1X4pHhvQHvI55BDZasWeygq6FQ1tFNe6FiI16D2fw5J1sD29xgSu4lAuFgZuziG6caa2Jg82vl71w1QuHNId50e7HTQuxh7rarM81qzy3rx8GYSszQwyqrT8zchfzih1191Zrqv1NN6h11p12l19a1e3FNr14N769Xy1TX9pHcvqcvI5teuBmZP13_PSyDHi15G6er82xixuwrA0w9d6erz9xlEuwrZuv6ivGJT9ZPo1zNxeTNY93rP7rsljeXl7dlmy1v_8WJs73m661J11r2z16i4l1w91411qa1E19i67Xig6H-479iW4vDR0TiuvGDL2eQmoJim9ri09qTs51Q23w5rSWZ5ZlrrH2455iDrFr1KH4FP_wJrZzFP_wJrC24Piw1W9xgSu4l79G9Su4lA6HiR9vgz9xgSu4i6uFgf6caa2F9s61l79Jificgs61gz0rl71avWuGaI86HmodnwIHmk6xgGR15Gu3XBaF2_eJMKzLJEiFiE_OOGp6iH02uk1WW761T41dg22wrEfv76f152axmRdalt1_Vg24iE0zi6b5J11v1L_VQ9U1hs15J1sr4Nr6hu6cg414aFiJiIwDSuo1uussa76crQ1DDFo7if11224rgrssJf1r224SaraAaf1r232cr94er9iDD13Si2ssiO51N695N4ur2upZ2t1aMt2G2_04vh6ov2ioe2tzOXeBv2tD1H31v83Wsu51Nu2vi8qJOOiDiY0GPxwGQXasut15OSuFcoqShfrF6fpqQO8rOIsQMU73Py5teuZaC6hawEwmw55e9Co_Z55ufaSuwP5tZ65e9Cye5q6FQ1tFJrt_ZaH4_5BnDqyqMmSufmSlre5clCfe5qye5qye5qyaXIpGO15e9CcJsM5iw5cJrrHiq85iw5cJarH45J1rg82rg42Jgz9xgSu4l15J5AuFgFiclAuziv6Hgs61gz9xlE9G972Hgs61lWuziG6caa2Jl62caa6HgFizgFizgFicaa2vlR93lE5wr2uzlAuwrR2vl5v7UE_K2fURQcoGc15J5ZC15rP9vx03Tnnusn1rh-rFQY42yBxSo3l1Qe1kjViGDVd-B-ivQv7X9--wNwwceUUTtj_PSjsKVdMgOe2sHG1U1452WZ_KjCozOT7HX2_15p1sIktH1m931V8D5UtJaJ8cN_pgFGpcrBosrq63LykL9x81lihDNO1r0cfr5Jlv6271tGxeXEs09111i1a_-E2WN72v1o12a1ur4jr65i82Ok4vJy03rl11rFiGO5iFrD11J7039r21XapGDpu2O14WJf1r627Fr14vgruG9Eu1gZiwrp7Frn11Xp64vn7rTXoa1Y1qEr7r5hpFgMjcvIwc4DfaZmfmwP5uwM5wQC5wQC14_aBe4mSyDeywQqyaXI1e5qye5qyr1e5zQqyglybe45H1ly54JNcJXrtiq84c1NH13J1I13rS6gLr1i_-c16H1euv1T6cgA12vq5zg1p1Dtuv1g3vTApGOIpGOkr25b12198H9v33NqtJ2t16N136Shiw122vl21egFizlA5wr01xgz9vl75er49xgSu4lZ0zar5H9c92lAiF9d6er86car1J9c93l82vaJlV4-MKBTvBoVRgbNuv7n1j0RD_UUE0DWyahnmm8W1s92pC-q7GaCWW81AtVL_KL_f5a5qAGO_L4-AsFMAJ50ctSA1kT2PawBXbBVl_ZmuGahwEdnD16b1eT2uRUsu3rERC4T_U4-VKB9W7ho111410i2ivgm1N91411I14v1wD1R4eD0uJ1O2zihEJ7k73chi1Wh5wmJ9q5gyxQYo2sL2zuL0qOCwQOgpDXrM5ZMSKSyeds5Cv1Kt5DrBmZMSyDr_nD25e9Cyr1e5zQCiw126zlAuFgSu3gz9vl70FgZuziG6Hgs61l70GgK1vg82xix0GgSu4gFicld6GgR0xix2caa6HgFivyCzCHg032zh6P37jSdqSeCEsSzdSGkbs-p35S9d8VihAF4QEMYu1mw7Wuws7P3yW381Tzp3raSoEe0qwrw079Ro60dEhYssri4qgv8lz1NfEptzos59muq5FSTaaDP0J111v1J_X14Qrrd13J1rr28P3S4urNvLJ5g12D14J5gr1TRrHS43eiM6Fi1LJ5g11Q16J5gr1Qm0Di0rJM41eiKfnZPtyDr_wJrt11KHnZPC24P5uwEiw1261gz9xgz2JgR6caa2Jgz9zaR0Jgz9zaDuFgFizlR0ziG6caa2caf6F9AiF94icgFizgSu3ix2xix23ix6erFixr4Qw5W445ih4DR1vgww5N21fgSEFisaFhS1r6b0wg81aOaacqQRvJJ43aHY3749a8--Q0KESJ2l1p40wl91v93pqsB8WCjm8i8f51r2vnfY49W5QQwlvi6_pD9uGsm1vYff1X11v1w_X13NvrW12D1ov2yr3Op1vJ1dcl2159i3v9122l90qcS8xJi3v9121aUi3QYo35x52T653OKgaJgpDXrM5ZmH24st5C6hawEwmge6FQ1oMwASuwu6FWypF5J1egf6cgs61gz9xlE0GgR0zaDuFgZuzgFicgs61l75F9AuwrR0xix23ix6erFixr2pzcqgavA02Jlp9uQfaH6fd-kyHXQuHCvxxmiuHWtqKBwqE-ka15x1EgYsEa-0qaX6eA0jqrluF9cofdxiwlW9cCE_7aV9FTr31eff1v111919_-11K95hr1g13Q1wa1U21O347Jf112241O51vrw93uS7qlo01J51vil53TIpqQO82DW03OUhQJgpDXrM4HuSwHyeds5CQDrSc5fye5C13_aMPwu6FWypF5J1er82va79G9EuwrZ1qgR0zaDuziG6Hgf6viGuzaD0Ggz9vrz9caaiF9Q1L1WB_BN82QQuql2c6E4T4vQ0eBQLwPc0DJZ7aMp_PupkCPr1q93WGrzZjlqyqrT8v5TyZUfyxrA9KMv8KF3yxiV51v5sSJ9111219f_GJqa2k91a145r1TfpGiX3wz11J56Lt_1r7rr5zg6y11Ly11XyQh13S5m510J3NNf1WOos3ubuW2pjJPv9ANAg5T9tJl_3F1zi3ho3Drz2E2p1elk5LNAX5T3uUXV0x2pIQg84r277Fvv5zvu94TurQg-yxXX54Trev9Vy5he5ukPfnDrH245H24u5yDrBe1N5irrC2455ySm5e9ClsSmfr1_S24QoNwPBe4ApZ8PBlrMoHxJ1I13rS6gr1Qfi21aux5m421riH1FpSQHi15S0xlx0GgSu4iG6J9Su4gFicld6Hgf6FgwuzlAiF9d6er82FlG6erz9vg82vls6ziGuziG6caa2JgR6erd6erz9zaD0zaS0xlE0GgFicgFiv9_84NcKQCay4_Muq5U7SiTu5uBvY5nu2vF9zsRvEMwaGy99qh9o5JwqHizoaiHHrWqaJh9ypT21EQetrPy1zDQp7ra35Py2v7G5q9Hpg2tjEZtEv5JiEgAoGimLnQuaSra1qCxov9oixu34JO9GHSI86ea8ZNbP1l21WYr21111r1d_ET5RrrU14a1s51vk1D2jJO2fG12iqDz941R1ql74Hih3v5191gJ2W171JjX_N214H1wq1gK8QiF2FgW2c571J1KtFNrMyZ51qNIflZuH4omFe4aflZuHiSmiw2mfra42xix0zaDuFgZuFgZuzlAiF9s61l72J9s62ld6ziGuHiAuFgFicaa2Jl42vl79G9R2xix0v5-leTB0FPuavTo5cNztqutaxQJ2zO28wJbcYMui4lcaS9PysT652ccwr7pY3Pp7tB2tFrR6MRQyXxPQUpdsDJEmgTn_K7E6c9q5GO2cnngf5QjYuf-a3ShgWM24r111v3C_Ml4ZJg311J10v1Br2O96riu2v1s1Fvb2zvTpqQO7Giq14vzpGmueevIwc4DwbZu5uSyeds5CQZP13_PFr5e5zQ15e9Ciw1262gFizgSu3l82vl71r9R0GgSu4gFicld5H9s61l79G9R0zaDuFg2k8H6v91CWdOVwv66b8PwizgW8eACUoebl-3fl7Aszv6RsXbiF4xxo3m8fJ7j1rWIrxXE04vgWKBm_OzgBCA-bREhSh-g1151obB82k16Fv1M1921eJQi41vxj31Y43rqbel21a5J33Nihel21a59oF1Y91Jq7Gr11FOg7Fm193ri941GuwlBi3NY029i31lay4NYpqJn63O-taTgpDXrM5ZmwQsWeyhuH29fyr1K_mwd7cRmZeza7KZ55uw55e9C5e9C5zQCwxOI124EcJCM5irHi15x2xix0zaDtJ9AuGgR0xlE0GgSu4lAiF95iF9d6erz9xrz2eld6clf6caa2Jg81HgFivrFicgs61gz9xr24esq5xQ-hgU1nj1-ez-kI4Qlt422U1pzU3QZPDI-ZaI-YBeQjG2W9FL9xLIZ_aN2y5XOy4vOPbDI_LvytxvUjYtuOXNVmEEeTQXW0wOv7rXBpEve1kuIPHHf9xlFpd46_IQr44vOpFvc111217R-VJkl2x11r122r2X163XhrFTW3FT35v935ce413Xb7GQO8HOYo2W4ixXKFnDFiF9GbqNKoGNg5uZMizuNoGNg14NKoH4MHik6iw122c5a5caa6caa2xix0GgSu19S54lx4J9W6Hia2Jg86ela2Jgz9xgS5FlAuriR2G9EuwrFicgFivrF2w9d6erz2vTy6e9CpSgi5Hru42lQFbZD4e172J522HeopFQ331gr4h1Iyp1eyvHy1wYt1D5Oy9i6qV4-A0oMPYicc35IuSAwy0i3qY92pjQ52ri0YbFZismvpdYIjHSouxO2w9hsiri4O19XpAv34r9XpAr111510b_d2yg5711L18s1wSQc1agc1wac1eu4751i6Qvg7rH42Ju132h91GOtrSN11r1rrHNboHM_8Jib12Qr7q1hg2WJ7k1hJ2Q87eao3rOKoHJ282Q_54NttJ1_0vg1t-ZPBbZ5fe4QC18dflSm_mSmBlZnpNFP5uaIBw5J16Sm1sD21Jgs6cld6erz9xgSu4lw0ri72Jgz9xgS5Jg79G9EuwrZux5G24iGuziG6er82vrgte9py3Hnag1wrtBptJrj4aDTysYgkcTEt2eg1rYr1ghr995cgDOE1D_-gC0x5qOx9SCFwAEj1jJp_zHMMQDD0JiI1SOC0cOnvvv5fDgs3J111r2r_EJ69rjX13Q1ea1x9hQQuHTu2Haq5Fl813lX6cgUpGQYo2Xi4Fvo3JJIpzSr73Py5trNwe4P5uSyeds5Mc5CoDZMH11K_lw55iZmBnDHi15a1vl72Jgz9xlEuwrFicaa6HgZ6Hge54lq9w9f6caa2xix0xix2caa5vucpvQEy6pzR8sVgAe3yWa6Tq0y1e0adEi_pqPeosCn4r0cuKXFyuenx7WPEf0Hs3DT1v521_N2RC92swP1wGvBhKRVebBP1191hruB1C17QJ1o1351gQ1D5H9q11Dq41276J52rvDq32ai8J99uHar1153tHOl8J9q4rJ44v1w9GQYo1X5y2QI9zYp73Py5teuBmSyeds5CQZmFe9fyr1_SiwMSuwmSyDe5zQe5zQCwxL84RDrH45J1qlE2caa6HgFuzlAuHid2xix0Gl79G9R0zaDucld6Hgf6vp0OQ2I7HNzm5aBX453t3Wb21sBKZ0nsyjhR2MV0cQ6HJr5ma1Ke5X2ld8r_ngJuSMjYCq4mYfQ1v55555g1191p1uN1SD7Yv1u12O1oQ1d3rYk4cr-1HvX8qQYo11ey1lI85M673Py5teuBmSyeds5CQZP13_PStZ5iw1261gz9xlEuwr16Hgf6xax2caa6ziGuFgSu3lE1SZwSpSZjv5gRZG5bKCEwgmMsWD_ywP12awQC9cVzYi22J52v8OPxa6fvWHqgFrPir111r22_Zr8krhn14D1n52teFa2rF52dGD2dqQ2eer21XOd1aidaHg31z1d1egEpFlh5zMJ2X181QN8fJl32FTFuJiptx9l6cNotD18a1mv2N18D1bv2Jg811O-oFly1v1_Be4DFsDrMiZ5H15rZOFMSiSmfe4nFtZlFsSbfsDHi6MmfsSmfelx0zaDuFgW1GgS53aQ9q1f6c5r2Jg892gs61gz9xgz9vgz9xlEuwrZuH9eu3lE9G982caa6Hid6Hgs61l5TqQZa592p01N1wQ29v6a1qYBh6HaLr62IzlUyylV8ZOni3lWgXGFqQAO_-I_uZJ60eHh_T-it3Yo625c1d3GGv60NuVJQtBs_KovFmTxa3TB5raSiw9Snjl21180Is2eYIkDIh_-GJDMoHWK55511J24_NN81rrs11g1yJ2u1pe1hrlDeFvf5FMpt4rZ6Gr39rsQ6J11rqrc2r9513OXicO-14M45Jh8rJOGpGg-ivmy1xrf2q5buFHirH1Z94lJuJiZ6HmywHNroz1Lr3CroE1L2qC4y2NttJMt4SNtkJN64GPyqwOgpDXrM6SuBmSmH25qyq_mfbZ55e9Cye9Cyr1rMtZa5uwDt_ZaBe455e9fyaXI1e5qye9C125qye5qywQHi15x1GaAuGg22vl79G9R0zaDuFgFicld6FgZuziG6Hgs61l72JadiF9ZuzgFicgs61l79G9R6cld9G9R0viR0xix2Jgs62ldiF9AuGgS51a0MaN20pSQsKA3pQcituEpcIyKBdno91lXh6CQT7E8mq-c_T0JZW6gjs1c9FnNEgzTjJa6265S6vDveciVRR0OsWPNrZ5L6vuc_Td6aWer_uaT8G3wzMKIUUlH3Ahqi3DSeY6EaG6iPjlk97OS9Zetr85ai3Qj4JiM9Jn7bV6-hEOFiZXU1eQ11J1S_Na52vrd11v15v1Z15M1iwr213J55Gvx3JQj23rf4wvv1Fchiv5G3Hioy3a791gT2FvL5wvda2HJ891lQ2J584vrS6Z5_mwPH11_tH4QM6ZP5yDe5clC5e9fyw5J1r5diF9ZuzlA1wg20xlE2Jgs61ix0zlAuFgZ0xlEuFgFiclZuziG6caa2Jg86vl72Jgz9xl72Jg3__CIrWhTqSa62bXhbv5niSxwaapk7xX21S5045l62Rxi-YHx56Tf73ef23221JuHvuyzmHr4tvpd_zW1w6dyvKBJzr6pyv52zf7eqKCx9clFqJvinjwxIiPH5EvE72eR2qqiPPVmORad26r11191ut-X1N56Hv1b13J1sQ1K7Jgn2ggf11628cO72rrt0XDv6vNiuHgk7rgn31a4pdDz1GXYpqJq34vhpGS3t2vIwc4DwnZmwQsWeyhuSuwM5wQeywQqyr1K_lrrZnDe6FWypF5J1w9d6er82Jgs62ldiF9AiF9d6er82xix14aDuFgQuFgwicgs61l79G9Su4lA1T9YtT4KvdSYmz_36GQBEgWjGbVXfzv2iwJzfGH89qaVg2Tv25Q-paeWPdMlm70bva9YwDC61wR9QR65ADaY1fDBpFXGy8gZowr11191nt--1aJ7er1y12J1ua1g3raqneQ44eXYpqJd4Jaomr514GOmraOgpDXrM5ZattDN5uSyeds5Cv1KwmZdBr5rHz5JuH5DiF9s62gs619s63ix1FrAiF9f6caa2xix0GhVdsQ526Wh1zQW0GQEyqrRpqlf26cjdxxzp08MKh6h2xXQuwrHpqrDu4511r1J1tv4QJoc12T1ya1j7ev83wXt5ca483QYo2Q62Xr172QopHPtyHvIwc4DwmZaHtZ7wc26hawE13MuZmwa_lr25igHi15a2xixuqlR23ixuwrZuziG04iGuziG6cad2Jy0o3Sh1r8-x0pkuHueev5keHeq660q1va2aqJPdfuD6WH251a92qNKpAX11151iK-B2oi7fv1R15M1pGro8H686J52rrO8025w8JlE02Nw6v1w13rp02Ne3Jr5pqQYo2v5pGctaevIwc4DwmSyeds5Cc9fyr1_tFMu5iDrSiDe5zQe5zWypF5J2qgR0zaDuziG6Hgf5FgZ5FgZuziGuziG6er82xix0vl71Jg42Jgz9v5kqS0itqW87q5Gn55miq5I84NXXzcTyxur8ZJv0a5RYQXkrz9bykpEqqTAa7Hl1dktT15vIAW53Ee46JDi1g4-WMI-7b08118_EbVf28O77r1K16m1ixm48rY45eNm2ai17ais8eD712a18qlkpvTe2Hic6GTwrHO8rGTya1uv1Z14v1yr1Ja4oSZ5ZnZaBe4aH25qywQe5zQC14NKtGNrBe4P5ifaBe4Piw149xgSu4lAuFgZ5Jgz9zaDuFlquFgcicaa9G982vlAiF9s63ix0xi81Jg82vl72Jgi0FepTaQV0S6A860TO6SwWr50nYjcgFlZTxL9TJNV4gS9pwTLmdn24tVfyqc763YxwBi2RJW9f2lu1sU0-5hXJ7RW3DYZ1vI-Qyp6kaM781i11v2B1tg5PrqK1351rJ1Kr2g9Q2a26r1h2rNxyF5Zpx9RiqDo84C55ukaZlr1oMZaHiDrH24dFlwmFsZ5iw12iclf6clduziG6caa2Jgz9xlE0Ggz9vl79G9EuwrZuzlA5F9f6Hgf6zgFicgf61l79G9R0xlE9G982xix0zaDuFgZuv9DaQeTtQrRqwOQiQHtjdWfiQiD66uT83XxuvTGaA9taDuYtQrRqwOQir6iwAWYsF04ueeqj2JL9zgpiWux2pM4bDg71-TK08Sch5lYdDxDi41z5csJqSz-1Du_eJa4VxNQbd6QeGWkeBiJi39w6f2od1111v2x_Bv7rrh_12X1pJ30r6M39J53639Q9Wrx1Gl41rNx1aDxdG0P9viJ0D1RY3l48H1t4Dc_9PNx1xOxtq93Y3o59Prx1Zrx1sQx1qrx1q9b33Sc0J6r0J5Rr2mr6J9fo3m44GHm9EDx1cNx1q91111_oSSm5uwM1e4dflSmfe4dFeRufsSmfr2mfr5Ifw5J16SH1sSmfSD2iclf5H9f6caa9G9R0Ggz9vrz9vgz9zaD7J9AuFg21vi21vi42vlWicld1SXMu5o_QSP4EDeTI7e_qKBjqxUUpW6-R-OcwFQ3gSGx_Lx0b7C5uv8VIZco2RMWRKZr_IzJO4hA3H9921C8o15p1s93qEt1ntR-1r52fv0a_Y4-AKN1EE5541O11v1w1pJ5yrrW12D1yJ1Xr2X18cXE6Fa90WXN9Fvny5NLfGCKoviLy1167v1X54JrSKZaH24-fbZaH11rMOwmH29C7qNNiw126cld6caa2xix0GgR0xlEuwrZuzlAuziG6caa2Jgf6cld6caa2xix0GgR0xlEuwrZuzlAuziG6caa2Jg2pzcqgavA02Jlp9uQfaH6fd-kyHXQuHCv-Fcqg5vA02Olp9eQfaP5fE-jt2XQuHMv1EgYsEa-0qaX6eA0jqrluF9cofdxiwlW9cCEDGWshwNW04Qs8gYY9HDAiG5Omj9Gy3rx8Ag11v1w1pJ5yrrW12D1yJ1Xr2X18cXE6Fa90WXN9Fvny51La3CvoviLy1167v1X54DrSKZaH24-fbZaH11rMOwmH29C7qNNiw122vl72caa6ziGuFgZuzlAuwrR0xlE0xix2caa6Hg82vl72caa6ziGuFgZuzlAuwrR0xlE0xix2caa6Hg49zcqgalA02Olp9uWf5H6fd-kyHXQuHMb-FcegavA02Olp9eQfaP5fE-jt2XQuHMv1EgYsEa-0qaX6eA0jqrluF9cofdxiwlW9cCEDGWshwNW04Qs8gYY9HDAiG5Omj9Gy3rx8Ag11J3G_BD5Av3c11J16v1v14e17e0k4rWD12JZ6G9YpqJofrrs52NhpG6uqHvIwc4DwmZdZmkMwQsWeyg1oDZPSyZaBw5J2q9R0zaDuzlAiF9s63axuwaDiF9s6er69zaSu4iG6eaa27OW8q9r1rWfgKZngd6v_bPcgd5B5caz4F5oeDGr1DY2qQY2qvPpy5Poy5T1__N1v__x2av9qr9E13r1115815i33v8i11-ZwFpbiv0r0J52fw51fw11__N1v__x2jl8Sr9E13r111581uv2fJ8412H161NF8F9KiWNGRF9614iriS1Fg4i51sDH16DJ__N1mt_42vJ8SJ9E149111581uv2hr8612c151Nv8G1K96NvRG1655i_rJ92fw51fw111v33_Br0bvhl11N1d14er0ea3v5h12g9pr1E34Q1uvvJ44h7r1HY17g93HC4l3y19C1zT3i59HP4wGa20qaapJ24exP4uJc4tR1Zv4nruV1ZO4b1uJgZtvPh6c1awsut65ueev0var6e1WNcfFuvsf2sv6a62vrd22Qi0vrY41ssiG5Wpqm442gk7aiBqr1i1rJ5rJ23559vrz23l5p1rY232D0h5uhm_mhmHlfMHlrr_lw5Siw5fsD1tZ5_5ySMHlf65if7724DH85rBe4P5yDe5zQKfbSMZsDgBsSmiw129vl75erf6ziGuFgeu3lE0q9R0xix2Hgd6er80wgFicgs61l82rgs62ldiF9AiF9AiF9s61l79q1R0xl723iv0Gge52iq9w9d6GgSu4iG6FgFicld6er82vypMjUmzXRpNCVujAg5RJXeUhVQX1a5517AJ3DOySKK_z9992n6tKT-65XwjShn_Oz-NWHY67K-BUb-COwrFna2sY_Ka1czpHZJL_yqrHTm2eBDXtBGJfWGMmO25nMcfwO6i4Dcu2yiNxQay3Mj42rIzABl0HJ847ma5eiAtNEfEpED1eJ2dv5k1wY6ewDzn2C2yHP5p2Nx11i1wb_62Jg56r1E13D1yJ2Jr4X18zvii3lfpHrRh2l1155I0Hla241npwXyi4lHuJTny3a-7wvZ1xOR6Hr55xNKt4DqtqQYo35Dy1lIt4Se73Py5teuBmSyeds5CQZ55e9CoH9fyr1K_mwP5uwaBnZaBe5q6FWypJ1e5zQe5zQHi3a79G9R0xlEuFgFiclAiF9f6caa2Jg82egFizlAuziG6caa2Jgz915E9G940wg25xlE2Jgs62ldiF9ZuvuOvnETngl82Rxi-PPQxKUEjg6HiUo-vR4nesSAe3lzuByhQbBp1vHdE_er1wyS_sDyZCuerQM3ddcoshRab9IYXUFoAy1XeTCQaxeiPjlj9dOS9AMre1i_atV6QWz-Bv741r7ulh7eaauis11213J391iN1Kl16r1Pr2a4uJQiuJ2k52106GQYo1gwpHhtyevIwc4DwmSyeds5Cv1Kt5Dr_nDrBw5J1w9diF9d6er79G9E9G982xix0zaDuv7uyuDZpFvXpFbmy9eY3rvIypr3MH5XpGOX51N2y3Sy011215i39rjO1LJ16r1Cr2Oyj1T4221612r5RJT1uH1p6GQYo1vqpHh0t2vIwc4DwmSyeds5Cv1KwmwP5tZ55wie5zQrCz5J1w95iFlZ6F9s63ix0xix23ixuwrZuv78nv8YnLIuysxL7ZOkHKFTHEhvproI4rg91sPK2vszfrg41191eJe21YJ7wJ1y12X1no514Bv26a2w71l3bJW_48NjbHGt8u1l2vJJ3r6b1EN3bJpt1YN3IJ971vQ5_HJ2ZHJ281Ne1nNe_H53fH6K5fNezH7b5jNeKH585eT_6aNsl2d16h1sT2a76eNrSWZubmemlf9gZsSHZOSMS6SH7uSm14NN_wJHi15x0J9Su4gFiclf6caa2xax0GgR0zaDuziG8J9a2v9_rHsUy3m85wOPu_Vht2vypxOC0D1siGDC25641sgl0F0pKXDn0zr4yx3qWcaEiDpGTqgS111317v4Cvof2xJ14v1m183F6vlt1ov26a2o2J0J5R1a1R14l1a362Qqa2Hv881lv2Gr8p1lO2F181vl7rur4d1ul1A14h1uT1AJ4l1u31D6i1Yb3ENpbJUt3YNpIJU_3ONp3rTb5uemFfZa76ZmZRZa76Zu5iSmfr1__wJrt45J1q9EuwrwuziG6ca82vl79q9EuwrwuziG6ca82vl71cXTuE5dr3lCyHlu3KCgp4hc6Q1RywOf4rT4CziTl15Ze4rEZ6mQswiTl15Ze4rEZ6mQsr1215D5ev5k2zi13J2JLr111es1sJg3bJc_3TN9zJT531rp4J9b1xN3tJ0t1vd_1ON3ZJoK1KN32sN3kJ0_1TN3RJpK1vg3a1ev2815v1qr2p152vN58JrK24N5wJr621Nu8JDK4wNuwJD6422mSWSmS6SmllDrFsD1t-DHi2ix0GgSu4iG6Hgs6ico4x0qw1Dz25hW-3WRf_aGhJ1214Q5ev5d2z114r2qLr111es1t1l3T1a2l10J2g13v1dr1Y162v0r471il1G1401iT1J741sb3ENpbJUt3YNpIJT73vNt8JNK4FNtwJN64H2mZWZuS6ZufsD1t_DHi2ix0GgZuFgFicgs6vl7xQD41evE4zXQor9Z71e7f3eOIDNA0swlfJ111J1J1oO4QreD12Q19r1P15m101HT32T-8v1f1FN964Xy0wXI9QrT95rl83XKpqQO2e1IoQNB73Py5teuZaC6hawA5wQKwnZaBr1K_mkPStDNHukP5ygHi15GuziG6er79G9E9G959G9Su4lAiF9AiF9d1F9s63ixuwrwu4gFicgs61gz9xg3lHeq6prG01JJ4sF-QsGkiHhqyLTB447xdsPj5FrW0wrD0qaD1PJ6fxaZ31SltH184ra2E6WhdsRNT3aSuqaQuwa11191tt-L2hg7gJ1013r1iD1m31id3vrl15ir2Qil52Jr81g122g4rJTW3159rHgKBsZmBe9fyr1KoH4P5yDq6FQHi3awuzlE1Gl81egW61l71rgz9xl10GgSu4l15FgFicld6Hgf6Hg3_usMwo45kA8-FuQ4EGAf_O0lu3XQ_UbKovX20ylDyq5byWmcalU8Fv5AOSLT1rjkc_X5KbXApXF-5Y1J1myC049j719o1qe39Q2SvWBlW_____FMKrr12dr10v2l11122v3yYJ118Q1d4GvtoxNToGX54GvtozNTtGCtp5NL2v6mir2mit__12Z_Lvw02GO30v1N11122J3y16a2HJ1ar1D31qvMsr9213M27xcdpFrDpFr11r1j_NT7rvjQ1351yQ1c2q1y6Aaf1r222elv4v1v3x1f4va51GiYpqJw1GOxhQagpDXrM5ZmwQsWeygq6FQ1tFNqywQIiw1f9xgSu4N3uzlA5H9ZuFgFicgs61l72Jg81rg82vl72Jh_p4DzDlMVfTt7DR66pGQYtJXjtQJa_OGJRw_lPdTcuzXY03wwCTmfnv501emHsziVp2QkoFCu7bCCSCOM_iCd7J12_Mt_Zvwb2xN1s13mPx2i1eSi1rLX_Bc1sJP01rO2gxl2e3l2zJr26crbkH1251H4qD9AeFJAaDN7911213Jj8Du1uWaiqFXaT592rQ1-ucg-l2N2fHMK8J9b13WJpg1Y1GQzuF9osfN51rrpuS6u1v1_HtZ5fe4D_lemSWSmBmfMZsZ1_l125uk6_lZlF6DGiz9rZl1rSmfMFsDqywQHi12mfsD2fqPmfr5a2Jgz9xlE0Ggz9vi6icgs61gz9rg82w9d6er79G9W6cldiF9ZuzlAiF9d6er82vl79G9R0za72Jgz9zaDuFgZuzl79G9EuwrZuziq9w9fuziG6Hg5ZHQlowNc8cTswNxA1kNRiz9R_biW2v6x0ziF0xK-LrlCrhsna2YgyxvYt3hBwAApCg6X4FiT7sHh6RDu7ov30w0W7ufU1f0vt3iCeHg02e1L8G0oe1Xi_IO2ixlEiAJ-249R0F95U5Sdic2iiQ1YpGeJpFUjQyN21Juhq2951Wsa24rEq2551vTwiZiF1151jv431OT50r1m14M19JT3412j6J51rvJp1v156Jvi3v9121ar8GQYo2T653OnyzOgpDXrM5ZuZaC6hawE5e9fyr1KwlDfyaXIiw126cld6caa2xix0GgR0xlEuwrZuzlAuziG6caa2Jg2vwcqg5vA02Olp9uWfaP5fE-jt2XQuHMv1EgYsEa-0qaX6eA0jqrluF9cofdxiwlW9cCE111217T1Jvop23a18r1Ir29151af31aj8GQYo21jpHXVyHvIwc4Dwmsyeds5CQDrH11KHv5e5zQHi1572Jg76erdiF9ZuzlAuFgSu3lE0GgE9G976erf6v7Fy60ceFgQ7HJTvAsmqDsmkCOB8xrZ8SN3hxWdhwXW0wvs8gWY02JZix5Pmj9HuGax8Eg11191q_Mv2ig7tJ1o15Q1dQ1P14v7r4vNuxNX8zc47Fc62xgo5vPpt11-8viX3rJs7HvX4DliqFh4y2XXiGMp5ukuBnZ55uhMHirg_fZ5H2vrbmrgBe4514NrCnr_BfZs7yZPH24Po-DHi15x0zaDuziG6caa2via6caa2xix0zaD0zaDuFlR9va862gs61l79G9EuwrZuza45rgz9zaDuFlAuFgZuziG6erz9vi804iG6er3265JeQgJi5s61JlAo3OZ2JloqFB-Frv96c6ipwT36ruM9ddKg1ii7WhTZg-3NcD41dcxIHr5NQrJi5e5i425_urNBFJOy4vOtyNNdEAX1czQtKvMKEYruqv949ph1e529vYcgJa4y74njfMcgtVJtcWLfKBR111215k_g1wd2W51rv2mr3Xxy3Qry1vyy1Th3FJorJ9XovT7ov1i53gxtv1XyzrXe1vXpq9s5c1X6wvqy3045ukPBbSMHirg5uwW5thMH2zMblrg5iDrH11_tH4P5ywQ5ySMSezPbmrgBw5J1qgz91l72Jg8uziG6erR0Jl76erd6er82xix0zaDuFgS0Gl79G9Su4lZ5FgZuxaA6HgFicaa1ca461l79G9Su29S5JreoJf-VsT-5va4UzpbRQAh1Jvd5aJYyv9s2ruM9ddKg2rkhXT2h2QDycuz3vN93Wcx6va6YvsxrMvAnJHQhva43FXFtKvMKEYruqv949phS-Qpgdi61J5oV7334r5527qn_EEn_vMtEdeEnr8Wnr6s111214I_i1qu2U51r12zr4904eTs4wvsy15x14vzy4OSpxDxow5eozvD64vy6wvu9zv28q9Rorg-9FvPy1XDurD213MMHiw5HiggBnZuH24u5iDrBe4P5yDrBr1KoGNK5iw5HyZP5ifPBe2MH2vrH45J1ei89xlEuwrAiF9diFlwu4gFicgs1HgFizgFicgs61l79Gl4icld6er79G9R0H5a2xix0zae0xix2Jgz9xgSu4i2ScppQx6HuGTbvx7w2wvIo4l6hwgWQGrYuZQGxjOqD7eluGTFhhvXo3OX0eSdqJNopwkV1YQ2S1575S9IyJO31rQOy4vO_K965FJUaev02tXI3vYgpFQ62bZ6pFvXpJ021c14tqWF1t__19N3a1781Dv12J1e1113Ir12168_tv7d1y114v1hr1D12vNuFJZb4riu1vQr5uwuH6D1oNDHi2lxuwrZuziG6caa2Jg82UPjsWQV04c7q1apJWC2bXrA03eqsxms1113168_tvoC1y114v1m13S17JN16rgt4rNlFJZt8uNuZHJ71vD05eJ1715g8H4aflwmZOwufr1KtuDNiw1f9zaDuFgFicgs61l72Jgc9zaDuFgFicgs61l72JjIdWhhyxrXeQv63v5sdWhhyxrXeQv63O0nrf-5uxrQaWgRssC2bXrA03eqsxms111810t_XvW32ET14J1m14T1qr2f17g1m13qr71fvx11g13r11i159991EmpvE24yACLvWvBag9B8vPg3FOomf73a7r2h7L38SJ2f6q3a5l2eDV3tANUbGUtyhNC23TJyqNczG539rrkvxNikJGt40Ni21Javx15v1r328arSWZPZsZP5uemFmZufmZPZsZPSWZPZsZP124QCyrrBe1N_wJrZwFMt4_PZsZPiw129xlEuwrZuziG6Hgs61l71G982caa6ziGuFgSu3g49xgSu4lAuH9Z1wgZuzgFicgs61l72Jl41Jg82xax0GgSu4lAiF9f6caa2vix2Jgs62gFizgSu3lE1q9R0zaDuFgFicld6er71G982caa6ziGuzaD0Gg2LXPew7sxh06saAelb3DTo561u3OSqcNxu1gHk9aQ1rXk4HOM9q9S5xrIeNkv8Dgm1Px0dWSadh70hR45EDQY06mfa5M1uvpBxsYmaSEqx7hJH0YppqegsS2tr4g55d6kzd0gsE2lQZWoev7H8q1Ia65d842aa_Tvi39y5XIf1rWa1Wc28zm3iG9a8zSxTKCf_xcuWzaoaWq9W70Rwsd5ElJ2XFlGw5u5fSNN02B-960scCschDSsc0Ri1nrXiQH4e6Mbt3rb__N1v__x2av9pv9E13r111581ul2rJ7r12e13FND1eND1s1DbFr31sSHir2mit__19F_RrqM3u530v1T11122J4f1p53uJ1Qr2Jtaq2er66vaf2ev67Jal2eD68vab2e3V2eO6531sDH16DJ__N1v__x2av9t19E13r1115819D3lJ7B12Y15vNB8FPtySNBbFLbyJg1pxNB1v6mir2mit__19F_RrqM2CJ30v1T11122J3y1oX3y11yr1Q_qwMsg5Wvsrr2fw8__J3i_CD5KrxA1xg1p1111rl1rJ6V1zQ12B9veJ51fw11__N1q__l23r9sJ9E13J1115819D1Z18d12Y15vM3tD0trvitrcM3wD0brYM32r2mi16mib__15K_Z1rQ39530v1O11122J4f__12CJ10P1M68Da316DJ1t__15K_Z1rQ2FT30v1O11122J3y1192Sv1ar1D31qM8sr9214Wo0vudpFrDpFw__J2o_MJ501cH1xg1o1111rl1rJ3H1br15Q1iRDr24Drbe5M5fDr516Smit__18w_JJgi35i30v1G11122J3u1YQ2Jv1rr1Otp2NTwGcbp0NT2r2mit__18w_JJgi36J30v1G11122J4f1gg2Jv1qr1TtocNL1xNLtGX31sDH16DJ__N1mt_42vJ9aJ9E1491115815i3c18d12e14JNK8GNvoDNKfGMKoCNK2J2mit__10K_A1sP35Q30v1X11122J3u1lN2G11lr2rtueNSwFsburrbuqNSwFsbudNS2r6mir2mit__10K_A1sP37930v1X11122J4f1yr2G11ar1JtieNH1xNSwFsruri2fw51fw4__J3k_Mv6krc61xg1y1111rl1rJ6n1lv1751r4Gib9DNzfGy_9JdK9BNz1v6mir2mi1121ot_-J7o21116J29r4973Hvq2x1hi2Wr7l1h291hQ2Ev7ris1JNX3wviy2N1KJ13a12_119b7qNhtHW_7rr17e4dfsSHBnZPblw576SH14NrC45J1erd6er79G9EuwrEuwrquwrAiF9d6er31fl8uxJIuJlauGOIuHr2HzFKt3JXy3JNBFHn1eWnowvXosB-CJ111r4329X4-1jj12v1ha25sreW219y41a41c213TU111135193i10v1R13v1pr1U13O1o11P13X1oJ1vO314NwwHi34vJ61vrw7xQYo1lwpHWIa2vIwc4DwmSyeds5Cc9fysD1tSSHwmrj_eI55clCiw2m1w9f6clf6caa2xix0GgR1xix0zaDuFgwuv0yuDDgshNjuGac8W3U_QvQuHXX-eO7EQisdVTn8GrZ8sUU_OvX03inuv5j8J111r3U20N5q1gq13l1ga1JbJsJ7jN6T2E_2k1h2vOhdrN18J1K14N1wJ2b17N12J2F8Jsh5GQYpqJu9xOTs65gpDXrM5ZmwQsWeyg1oDZPStSmBlemO1pJ1Quedoahr21ruvdX_N3G521ApGPhiw12iclf6ziGtJ9AiF9s61l72Jgz9xlE0Ggz9vg82Jgz9xgSu4lAuFg2HErMaGM2yeJL61XLqGOT8wcfvDTktqTD8F5qo2QT8GX485Wy2c9VjzTWd4Omqxesa2XCyesdyelfsqDY8JOihzM311121eg5Tvto2a11611hr1Q7619t42g95earSPZ713_aZfZ5H2vHi15G6ziGuziG6er82Gix0xixuwrZuv7m0CNRpj9TwQ6JEF41iavL71s13reot1D62QJF51Q11151Srqk23i7ur1f14M10sT2jv6_1riq212h42QYpqHJ2v5767XrpJNg8HvK75Ng22cvyevIwc2mM5ZPZsSyeds5Cv1KwbZaH45J1sD294lAiF9d2Jl72Jgz9xlEuwrFicaa6Hg3t15WpH5Z93N31vGQvoyyjACpqDi_2w7vtGTb4YciyE2xzaPowzlD11121wJ5RJ9J2fJ1411gr1Tpm1i12xOunCigpDXrM5Zm13MuBw5J1er79G9EuwrZuziG6v9Je3avjGrc0eMI2tXQyA1b0eDlgr131rl5T1yY2PX14r1l14e17cYh7sQu5WQ912XYpqJ5kcgy3rYL4xOmE6NgpDXrM5ZMH24mBaC6hawE14MuBmkPBw5J1wgZuzaD0Ggz9cld6HgWu4lAiF9f6caa2vl70Gg3aWgTrFgPtPQ51wJN_K6RgV6Mdd7FOXcjdvaS1HaQg4Tc8j1L03eAQsereQSVW0v41QCu11121dB-rJuc18i17v1Er29f3rHh1Jls4X916eQspHPVQHvIwc4DwmDrZnDrH11K_mw5iw1661gz9xlEuwrFicgFuzgSu3lE0GgSu4iG6Hg4gfWCsaHve3ekiF5Jezc6racXkRo5b8DvpQQAir5LowJGp25tyQHbgv131u95RJyS2zO15v1x14617Hi13JOk7JTdRHVK8INnFHBb8van1JXI9A2H73Py5twmwmemS11Kt21Nwe4mt45J1w9d6er82vl72Jgz9xgSu4lZuvaG6caa2Jl79G9EuwrZuFg37HXK63mddqaj92XKmhJj1dXno3dsjqanoe-wk1gBocXh73Mqs3JnoeNWmCQk8GNb8H-ygF1n9eEyhJ111r5U_Uv4ur3U12O1pa1a4SQ532gk3vOh612L5HiapHGfQHvIwc4Dt5DrBe4mH11_FmkaBw5J2erf6ziGuFgFicgs61l79G9R0zaDuziG6caa2v7_7cOzhavd5eNIm60ggQm5QW5bphhu03lI0rJJ8FNc6Sheh6pWocNOqv111r5l20v4Lvhk12g1gD1_bJ1211Js4Uvf11634vJ11JTs5S1pg1T311Tr3x1pi1Y13W1pg1T83TT462rw12ay411552vYpqJ753OflR5gpDXrM5ZmwQsWeygq6FQ1tFHu5uwPfsDqye9fyaXI16DHi15ZuziG6caa2J1z9xN30zaDuziG6Hg3gmJg7eXL7KBzpHNziRswi2NR7356wNaaoHXn7bBD0wV7hGQno3vZ1112_Z__TJe22vg1iv2gr4at11T2l1U13Y1pT1UJ3O1pD1Iv3K1p3rT6y2ioiGJl0v9Yy3iUy391y2T6y3ix7cluu2NfiH47H24758Z6HirgBe4P5yDrBr1_oNDrMtSMS6SH7iDHi1542Jgf6wid0wgFicgs61l72Jgz9xlEuwrZuJgz9xgSu4lZ5FrAiF9d6riAiF9d6er82v6t51J91e4R1hDe4GQXr84JZC2Iozri5fJQp4OPZJvCpxOC2g9OpwvNnroU_I7ps4gf1RD6tGY18zaU0GaUjE3k-SO_pqNcTr0tpFJNp_XBwwNYycXV1112_VR_Zr9H2nN19J1Kr2lb41ao02v13zv16wvk5Fv12Fvk81140e4dblw5H2zP5yDrBe4P14NrC3_uiw121Hr82xixuwrZuJgz9xgSu4lAuHiwu4gFicgs1FlAiF9d6er2avJ7460b2JYRp3gAudea2riSpqQS2wax9GgN1UK-w52-f72kz-Y4t3gD8zh81aQ2qqQSuqR-pzXcyqh1__N1cK_82qT98v9E14g211581y125r8411C13rNA8FgJuR1A212mit__13K_H1yq2WO30v2d1v122v4vTr115Q1p4FTJyW1V1SNV1r6mir2mit__15w_FrsE38N30v1M11122J4v10O30118OvND1r2mi14__J2V_Bi551hk1xg1fr111rg1X0T112Y15vNKi3MJoJiKoFNKwGMboXNK2r6mir2mi1131ab_S18I2YN14r1n143SQ1a22wvmL15wr25d3HNi115e7Za8mrWS78aa924dBnZPBfZ574J1tH4D_nSmiw121Hg82xixuwrquwrFivia2caa5caa9G9Su19Su4iG1nr41vr5q5l4qDT61JMoqJCeeJha_zciWFSgkr7AkaKBXvDZ4Wz-T6coqSv2g6xm1113_Mw_Rrsv2cr10v2114M19qc465iF3xm47wh411m27r9BrG5F4JTPiJld3xvFrHrpre4dHtZ55iw55irrH24aBr1_5twP5yDKtyZPiw169xlE0GixuwrZuG979G9Su4iG6zi41FrAiF9f6cl56Hge61l72Jg25F9dicgs61gz9xgz1HgFizlAuzaD0GgR0v0Za72UuJYW2JTurepaWe034ra5s3Tgx0Xa1qR2Cs2exCFMNJvIISvXy3OPO3Jyc7_zjd0GcdzpuEih7GWRghzC1AmE1J5B1wJUda0u2AZ4VtBWUCGbfET6lKXo5wlOpFvr_WP9eQovnoAamdvm1191Lb_f1MN71v1u14v1qa1T8Hgs9qDy3c5G7rTXorrX0rOCoer1y3S9odlb1H5Y7G5S14vY34vcyc4n_mwMFe455iem14NK5twP5yDKFe5qywQe5zQCiw1262ldiF9ZuzaD0Jg82ciR0zaDuziG6FgFicgs61N3125a2Jgz9xlEuwrZuzlE0Jl79G9EuwrZuv6Oy4HuQ51JywsTVSMkyFlQthyLr3QS8a6V1rPbl-3fl7AszPaSyZsm7GgZoHT2hDC7qTSTTFEc4q6m1Y2oiGvQypCkuqQz6xaX_RK-V--mKRCCEmqvE3WHf5lAt3lP9eo__J1m_BT5Grxn1xg1t1111rl1zr6U1cD12B0tor51fw111191ht_T1_i7511o13J1uD1k81OP3Fvy1Fvd4cgY1vlX5cvR02Nu115gy2NP5ukMblw6He45H2vrZnD1tGNK5yDrBe4Qiw121HgFizlAuwrR0xiR6wlA6Hgs61l79G9R1Hr79G9Eue5D5H9ZuwrZucld6er2rG6R7UcFbRcKv03RWU8rKpzO0d53u3lTu29a1vJswaN5QbAA5ssnRf2eqOTs31mQv-zXQXir_INTuFlT1qjw1rO29fApgGSu1r6M81111v2J_kO4N1fd1311ov22r3rYy11ooG5X7rgh5J1Py61m1eDf0ql34J9X11Tr3x1pi1T53xNrS6ZPblrg58Z5HiagZsZP14NKoH4P5twPiw169xl461gz9xgS5H5E0J9eu4lAiF9d6riAiF9f6caa2Jg49vl72Hgs6ziGuFgS519Dh8v3uGOIuJi442gj8zQEurpOQNSbqZeBx6Hpus5ukdSMrzQz9tXxo4vXo17r1g_kP16y1rm9iwOZptXkmIjrBmxiW1uzpeSuX_TUfs721dO11r1J1x94Qroc12Q1751p62lo6Dry2eOr7c475ig1o-Z55irHi15GuziG6er79G9E9G959G9Su4lAiF9AiF9d1RiaacqQiqaii1Sl_Y6lEFisaFIIyvJH1PJ6fxaZ31SltH184ra11r7q1Xl4KvjN1311i51l1vri5j12T2Y_415i2R1dbHA16TNm22D26c7v1q_MFe4aflr1oSDKBnDrZlrHi15F5rgz9zaDuFgZuziG6Hgs5wlA6Hgs61gz9q9EuwrZuv97sQgGq4vjf65korO4os5etxOv_Evbpxvp21O2HqP5yerprzTU45oMHJ531vQP93NP8GJp1v111r6M1Xl4A1ka13D1u51v8xa1T1JhT3ail3Uvoo1O1Hjv33vcbJ3r1p11O115125KFsZ5ZlwPfr1Ko-DrBe4uiw126HlGuziG6caa9q9E9G9R0zaDuFlAuwrE9G982Jgz9xgSu4lAiF9d6er82vl71xmas3728HNY_Krxcq9S0qHUH7Yi8QaRi2QE8GCRf7WnRagWmZ15919363Xbf1rf84p5fTs7qcS9paXYpeMvrFAwdT6ypQW51152Rvuf1Bi7Yr1U14m18VNaLHqD71iuToN71rglT8NW1qa79rvq6HUvpepv119KFySMS2zPFe4aH11KoSZP56ZMfw5J1egs61l79G9Su4gFicgFizlAuwrR0GgSu4gSu3ix2xixuwrZuziG6Hgs61uafZ2lblJO8vYg94gDqQ2Aru7h4zvttF9IuZPwg1axej0GtFuc8GNh4HlTheQy3wDXuFCs5wOD8cTAr8sk11i1TKVj2oO7K11v14r1gv3or6NhaGWwysuoaXYbEWN7uV2_rTM3RDpKrIM32a0wwU2jovri5r7v7q5T9j1Lt5Lv4SD_faMmbSArfjMm2WDEsRNS1wa_eQM71QgJl2j16Y1dT2AJ6vad5eDeT15J0ErJgH475igrStZa5uem5uemH6Z55uhmBlg1o-Z55uk-tuFi5uB-FuSmBsDHi15F5rgz9zaDuFgZuziG6Hgs5wlA6Hgs61gz9q9EuwrZuci6ucld6erz0Ggz9vgz9zaDiF9A5HlfizgFicgs635x0xix0GgSu4lZuzaD0xix2Jl79G9EuwrZuziG6caa2Jg82v97sQgGq4vjf65kovT4os5etxOv_Evbpxvpyr8rydC8wNFaFGAAoaPookhfs6rcveNbpbBD9ggxuqaOjOeUw2C60F1h0x1PhSHYfYS70fmJ21O2HqP5yerprzTP3QzMFv531vQP93NP8GJp1KBj4v5p4wSo3JO7qDO7_5X31crL8SJ56HJGc6V6eQTmq3WupxQbg5rNQSU2wxY0e1151po-UvqB2IJ1911D14T1dv33r6q_uv5AswaNqQe821J25j1h9w2s1sacT3QJeD28a5nveB282alYg4v2y12u1aSpT4JST5aJwa2ua5Sv6I2u2aDdbHAt8hNmIHA_8ram5j12i3hli6OrHc475uwPH6Z5H6ZmBlwP56Zufr1KoSDrBlhm5ukStuFi5uZ5FlDrFsDHi15F5rgz9zaDuFgZuziG6Hgs5wlA6Hgs61gz9q9EuwrZuci6ucld6erz0Ggz9vgz9zaDiF9A5Fl72FgF1eiZucaa9G9R0Hla9G9SuJaxuwrZuzlAuFgFicgs61g32Wh7iQvX7WHe7GDo1GSe5wXI9tCT8GTT3zQ2D4WLeD_iSiNPPxSoqGAADr0AacNY1rT5yfM26GrV1QPo1bVMwGP4kZaV0zvni2Q53J86pDrC61Y3yxTirKZ81r933qDvoGDbo1T3_PTy1rTutaOo3JhoqJkMon70sJi28tBm1r6pi1r8IaPoUH2uoGH4cC1Np3On6s5111r1TKVU2oO7Yr1U14N1er2W19M1dRghccEd7j1gT2Q6Keq_rr9lT3ayToN71rh2g62deD2di6u1aS2wT6yJaJsw2xPvpV1AaFhvrJ5s9r64da3va5lJdr6hsU2teJ68iq597U1Y5U3v1v53idlBhc475ukafnZa_mF55uem_lSm5iwP5iSmfr1KoH4PHc4756ZmZlrrH24u56ZPZnSmiw11fr5d6er82xixuwrAiF9diF9ZuzaD0GlEuwrAuwrz9vgz9zaDuFgFicld6er2ivad6Hgs63iR0xix2xixuwrFizgwuJg8uzi25FlA6erz9xlE0Hla9G9SuJaxuwrZuzlZuziG6caa2vuafZ2lblJO8vYg94gDqQ2Aru7h4zvttF9IuZPwgtCKG159ydC8wNFTLGAAoaPookke1Rhq8xT23vrJx55d0qJy1QPo1bVMwGPehjOxt2XJ7raxej0GtFuc8GNh4HlTheQy3wDXuFCs5wOD8cTAr8sk_ggy1rv9rQOo3JhoqJkMon70sJi28tBm1r6pi1r71jSoqVOrwwiTqRFrp3Tb4S51_____tAM2117vr9E16J1115719SB111gr21t95Nv1xNvfG2K98NvzG161sDH16DJ1151rJ4v1Si4_11G14018ar3e2s50y1Q21J17qr553Tx321x55111rrP5HNF5uk5FlSm13NK5irrH29fysDHi15d6Hgs61l79G9R0xl72Jgz9xgSu4lAuFgZ0xlE0GgSu4gFiclAuFgZuziG6caa2Jg82v0heauj6cQEqs9nrQci7agUyzuq1c1xeG5Nuz1Bp5wjwWla035Up4M6uzgz1RXFqd9Zp2Nxc45Odd68uqQVyWD57Fh88zlQ945YtMcmrJNc0FDTiwOOo3r11151kJ8u1Kg3mJ1i13u14JQ7vJ9ypqQO3JrI4wTN73Py5teuZaC6hawE13Mu_lrHi1579q9Su4iG04iG6er3YXz-Y6eawJ5NwSQ2AJCywvCyeb__1pZ_WvnT2xa10v1Y11112J2s22911t__15__LJso2_l30v1U11122J4j1oX2Jv1dr1Xbrr523D6s1r22rwi7sxODpJ2mit__14IMF1rz2za30v2p11122v4j1111751roDutrJ938Qus1v24rHXnsxODpJ2mit__15K_Z1rQ2FX30v1O11122J4k18v2Jv1rr1O2oFYs1r1Vyxg4sxODpJ1219f-rJaY2kO1ev48r9uz9156er5YtwQM1xQJ1rTO7xJ35xa23el2EvnU2Jp02J6V2J6Y2J6k2J5C1v6Ip16lp16tp15Up4QT1xgx1eXhtDih4GXKoENL1GX142i72zNErANA1wg1q3vU1au4i3YrpE1U1GTUyHaXyDiG1E1l1eJxrHay325o215B21556eaoeJ1rC245ff8dFlrr_lHmt_Z55e9CoSZPfr5rZOemBe5CoMZi5uhmHyDrFr2mfsSmfr5Hi12mfsSmfsSmfsSmfsD2fr5a2Jg86caa9G9R0zaDiF9diFgSu3lE0GgR0zgFicld6HgFizlAuwrR0xlE0GgSu4lAiF9f6caa9G9E2Jg82caa6Hgf6cld2qEbxPgZNWsig5rQdFuczVYSzvi2yGOH0wiTsjpkcjUtnkpnkXBpJlCcnU0jpiQAR7SJW4nnCg6A1kB9cZaWqDBC93Y0uz52dSOB5DewvxTSy5Jky5udEfC0tJa7tS7fOYyo9qP4d3O21QPukWix4rOebZr11r1Y_Qi4Q1eA15l1RQ2YswD2yFD2yqg2fGa2Ucg2xejh6v0U6RTd1WOd1wJq1wir1wJ01wXC1qQS1sN8kJl37G9s5rl1iDieqaNE1r1E1qgorF1Br4O3yDvoywa4oJN48JiK1Ji42D9793W1pr9YoFvw8elv02io14_sSOZ55tZ5fw_mFsDq6FQ25uhmBlemfe4nBmwu5uwmF12mfsDHi6SmfsSmfsSmfsSm1er79G9R0xl72Jg86cld6Hgs61ad6erz9xlEuwrFicgFuzaD0GrSu4gFicld6HgFizlAuwrR0xlE0GgSu4lA04lAiF9d6erd1C1ZpFld4JPoRp528cZElpt-SwwGsaHve3ekiA7e_PO_p2NH76e4oWe1fkXesXaXalaN1rvCpw1IuHQ4hGDX0eYq5Fu1fvO6pacYH_gXqaKC93Y0uz52dSJVoh9Tt41f4JJa8w-9i1rw8qlXlm6h7DOj5zvP8f11__N1dK_T2oi9rJ9E13g1115819D2Iv8312C16gNJRF4bi1uti1529F2s1r1Ji3izsxODpJ2mlw4__J2Y_N54Grj21xg1ev111rl1zr4q11116Q1ywGO21qgIsr51pGO936gIu3O1fw4__J2j_-v5OJvm1xg10v111rl1X14q1l912Ii29FYsp___17R_Jrt02WO10v2711122v4v11112Ii2340spJ1317b_Dvw62zT1ir1N17S1r6NN1aDN1aXS1sJS1aaXswv30G1j4w04oJv124Csy15XrH9MpJ1K03nn1cJdu2Yjuv5ArHg8ivSsyJ5BrJNo3Jl1tF_Pfmfut-SmSlDrZzFMHia_1e4dBsDrZOF5HtDGSlF6fw5J16D2fsSm1erR1car6Hgs61gz9xl79G91uwrZuziG6Hgfuzlc9xgSu4lAiF9diFgZuziG6er8iFg20ciE9G1e62gFivw6x3ab1zgRtcArYMf-NT3oNENLyzT62bBh8GQL755TRGQp1ch9dJaJwKVb1v0iOtVJP8VI2t2t1bXogtVMP1X00FsjjJ5nSKEzOeQTp9YLix1F51Q0QvSQgahg1bKQoJ6TTKCHbID11151kbCK1NN5pv1G18013egu1eXl7Jr93kz_J51V7x093ai112l2X2bJ6J9fT2925vP4bHdt6hNs1G1sg2a36qNkrGTz0zrk6HQZ2v1H3FiKorOF91gt2v1_tH4DHe4DHlFMHOg25uB7HtZ6ZWSmBleHSWSHHbDISODrSOaHi8566cld6erz9zlw0zaDuFgFicgs61gs52ldiF9Z1GgZuziG6vl462lf62gs61gz9xl79G92ov9i3AhR2rJn8vMrpFTmo5rNcYa41caosxOV1c921rlCpDDsbjuE4Ghns42VYr8LXBj6OSlZpFo9i_VFQ3aI1gZ8O6JZp_V73l_g6WTdpFmbrb__158_m1mP2WX32v3b114__J2x_Bv7rrh_1vg1U111__N1kJ8u1Kg3mJ9712111t___MD7YJaI2Ai32J231119111219N3a1781Dv13J1gr1Ht2WN7kJg42v1u3ri1oND25ukufw5J1er79G9EuwrAiF9d1gm0iFe9q4rFqroiiDW0iFu0qr4__J34_-96wJbZ1xg101111rl1Av5O1l91551o1cvGsr91iz9g76gIu3K__J1F_BX4MrgS1xg1e1111rg1AIT112213J9ytSa314N_4vCdpFrI1191v_VT2xi6Hv1N1591ZD3uqxg2yeN2dHD2kcO2jFN2fwN2t4N2g552u552h4N2prJ24H1b53NrkH1537X1ixOk7eD46Bgb1d1b1eNbQ4NMtJYW0r6a0r640r5D0r5W0h1rre9itFNq3Y1Ie2p512lr6G1f1Hm426QAovY2Q21LtJ5_9wAt43NrwH2b57Nr22Qr8rJc51Jr42rc1crp14N_5zQCoGNe5zQeysDrBe9Cfe4PtMkP1e4dfnDrZLDeywDKye9CynQgoSSmfsDe5zQrVqMmfe9fye4lFyD1fr6mfsSmiw11fsSm1sSmfsD661l79G9R0zaDuGg42vl72Jg82xix0zaD5GgSu4lA5H9Ficld6H9w6cld6er79G9R2caa6HgFizlAiF9d1qg42viA2xuDaWcxeDeriwhEYlc3iRQvuGv_WH6xlUBPyQNm63P1sr5X8wXT521s7cOzhavd5eNI_jNkuEyBnn5_9emdadegsf52y1XQpJG4_4vVpF12teTxaebd1eg2nACJXtB3_Tl7E65kpFT86x1Q0GOW4414Eg521hb-GcN11v1F_Uv68vra1491rr2Zr5Hp2v5h2xQ7yrg43vg2o4ONyJ0Wt15Zuaim3vcL13vFrA1W1qak8HD2ZHZ_8r9mrFH4129r5R1q1H03i1eho3louFQX6rgFy1J-y1Xo14_PSnD__lg_SLZ51e4nfnDrZWSHHOemBmwi_lar_lsmiw11fr6mfsD661l79G9R0zaDuGgR2xix0Ggeu11Ficld6er82vi76Hgf6cld6er82Hrf6ziGuFgFicg21zaDuGgz9vgs54iGuFg68Reqd708e1Dp2O6xVEPW1aZRsAG962r31e9purlr2QJ27eJzhavd5eNI_lTv6QObE-8Tg5iQXwNc6Sheh4TG3JWYc8J21t92d3DXwHOswbBHb5vOc29z4vui4vDQ0GOW4412Uv50c6hF0bAW_Ivz5___1ob_Rrsv32D30v1R11122J4v14J2Jv17OJ9ay6aI__N1h__q2ni7rJ1E15l111581gg4xt-E11jF1cC1sGK____a_CD6g1ga1vg1V1111151GtCx2tQ7er2m19219s111eOy8rH4aaW3oFT_pr5Y141s1eamrDWntzlFoe9Z6Bz_J51T52u96JC4wHO27HO99wm5orPb24mlr29lq6HjsvTZd51r8Qcg34mj1v1_BmaIBlarSqKP5trNBe5CoSZPS3KP5uk5Fr5rSKZifmFafmwaFe4aBe5CysDHi15a2Jgz9xlE9G986caa2FgWuziG6caa2Jg82va76erf6ziGuziGuziG6er82vl76erf6ziGuFgFicgs61l79G9R0zaDuGiQ0Ggeu4lEuwrZ5zaD0zaDiF9fuziG6Hg5-eTmpJXeUhAQX1Qeav6QJqJOt6HrRYI-F1Qv79a--wNawcuUsscX52Tk9As96c5bpZeqd708e1lY_OWfg1Oo5Hrah3TnBBFFQai6UGvb9vaJta5Rx_i60erXoSOo2JXq79MLZqll2JSTs25e1crl03lI0rJJ8FNc6Sheh2lh1W6h1a2_Oelj9cO29gTWzGsZ8a1V7J111v2f_T15yJrs14a1tr3or6cEyv5S0r5Q0r6i9v5U6FTfqcl4h4g2jcD2swUSyv9Dyv5Wyv6do166o16ayErV1WTY1e577eQOuQiR14NVo79btErV1wgYyxJ5y4iLrHOs3vrk2FXXrGi714_P5tksSODr_lrq6FWm1e4d_larHPFP5zQKZlJ1fsD2fsSmfsDHi12mfr6mfsSmfqaa2Jg82caa6HgFizlAiF9d6er82xix0GgSu4lE0GgS54lAiF9f6caa2Jg82egFizlAuziG6v5E9G94uzlA24PUdghu7cOzhavd5eNIm60ggQm55iPCcfV0CjhYvf5GTKV3luC6ffh50GiZ_KWdE_erjNxSSse5yeNEu3rRpGaii2N_9emdadrx0H6JnM522o41y5jyh69QwodR7x6Iur9hatV6iE2g__N1zt-m2oD9yJ9E13v111581y11z18v11jF1wMesqK__J2f_M95yJhk1xg1q1111rg1X11111jF1vvGsqK__J2W_Vi5rrc41xg1oJ111rl1zr3-1l916D1t1q2M931y4E1213iz6chdpFr1pH5S1t__1pB_Srph38a30v2t11122J3u1112M117OJ5t66aI__N1hb-z25572v1E13N111181gg2uKMv__N1IK_s1HQ7qr1E15N111581gg1KK-E11jF1e5xsGK__J2W_Vi5rrg713g1oJ1111l22J9E114__J3L_Ma4pJh013g1wJ111rl22J7Q11112Ii25eYfp___18K_Orgo35i10v1H11122J3u1jr2Jv1pPv51yDgxisgIut__18F_LrtL2T530v2e11122J3u1or1111dr1Cty152o4cs1r1BexTHsxODpJ2mit__18K_Orgo32D30v1H11112J4v1yg2JK__18F_LrtL2WO30v2e11122v4v11113Ig21503pv0dpFw__J2D_Ni741bM1xg1iv111rl1Zv831l91651u1J99ySa41v1Ltvv9sxODu3OD__N1wb_61-l7yJ9E169111571uXG111ar1D41vvCsri313JN31cdpFrDpFw__J2S_MD5F1cS1xg1ur111rl1zr4l1br16Q1ywFD21cQMsr91r5OsysgIu3O1fw4__J3o_BD4Wvj21xg1sr111rl1zr3d1111551o1eTbsr519xDr16gIu3K__J2S_MD5F1vm1xg1ur111rl1Xt_O1l91551o1cW8sr91eDlsysgIu3K__J3o_BD4Wvhk1xg1sr111rg1X0J112213J5jpsa213QY5r2dpFrI__N1cb_82qQ9rJ9E14g1115819D2Q18312h14QNA1r5huWa214gA7eWdpFrI16DJ__N1pb_51C17vr9E16g1115819D1G11112u141NVwFT31r1Mq1vZsxOD16DJ1t__18wMvrdZ2nX30v1Z11122J771rzXA11pPv51eDlr56gIut__158Mvryp2fa30v2f11122J77124XA11pPv51tFNp3WgIut__18w_-1dZ35N30v1Z11122J4v1p12M11rr1O2oa2s1r21r2D6sxODp___158_J1wk2fa10v2f11112J771T4-St__10K_A1sP3p130v1X11122J4l10g2Jv1ar1D31rJNsr9214JN4cmdpFrDpFw__J2P_B14FJkn1xg1d1111rg1Z0J112e14r926Dcs1v51q5vm0sgIu4rIut__10K_A1sP2_D30v1X11112J4n1wg2JK__17Z_O1r62zO30v2g11122v4na1113krKtqM61v6mir4__J25_ND6hvcS1xg1tr111rl1zr6T1br18Q1d4FTbyQNVfFUbyva2owYs1r1ZrcNEsxODpJ2mit__18I_OJrr2T530v2m11122J3u1uJ1111uPaNG1aNG1r6mir2mi14__J25_ND6hvl-1xg1tr111rl1AJ5A1l91551o1qDZsr51uFlPosgIu3K__J2V_Bi551sN1xg1fr111rl1AJ3-1111551o1qvGsr51iz9Tp6gIu3O11r3A__v5YrfI13O1tQ1r13Da4D1Q0Dvtr21aq1M56Bz_J51q4qW96JvZ8e5oo1iZpq19uGr314_PHuwP5yr2SLZap-DIpNrrHz5J1er79G9R0vlz6ciq6erd6erz9xgSu4gSu3gSu19Su4gFicaa6Fid6HgFicg5YwTIe-kcw6a472gykqT-3JC3yxSko4e9ByerpFT6sqOB41O2xKBp_PVb9XXQPFTU4FJtilrGR10LR3XV5Ja21rOpt11418w_JJgi2nO14J1b13J1xQ2k02X29cT26eT2qcg2teg2pHg2evX2u1X2qrT221T24192l3g2bGO2bGv2eeHW819D816p67Ta1x1rrJ1L0cc433DIjG9TjD1Ql3r303ra84l5r25Wq1rP64li1v1_Be4ap-DeyqMmBmfP1e4d_lgrZKZ716SmfsSm1sDHi12mfsSmfsSmfsSmfr5r1J9c93lE5e1w5x5v6Hg4u3lE9G982c5a6HgFizlA0Hr82x5xuwrFixrFivgiKuz-UKBEHu4uCr6d1aEvYNHIhKtSUYAtxlIFRTAVwXz-Y6eawJ5NwSQ4lbVE_LI-JUED1eJ2dv5k1wUaEKVDBA6mMy4-NO6ClKfkEDa04QCy4v111J2k_MJ5-1fd1551wJ2k1pm1jdug1qes1ssg1why1aP51eQb1rTb1wg21q6xRSg2sW9L0Ser0eDj92rJ651a1HequDT1fc23l5p1rY23250iq4D91z2pr5T3qQYmf41A1wg-s4NWq5iMyDiRuF93w5i3a5il7Qie279o311_BmwMZLZsBw_P_mZPSnD2oNHm5e9CoSZ5Fiw7HPCmBe4NF6Z5Hiw7Huwu5uCmBw5J16SmfsSmfr6mfr5r2rg8uziG6er79G979G979G9EuwrFizlAuFgZ2JgR0zaDuFgZuzlx2Jgz9xgSu4lAiG1f6caa2xix0Jg8iFgf6vlD0Ggz9xi76erfuzlA2r9su4l55erf6ziG2tz-5J96vaHzyqTEWxgDGwrIydrj0w5i2vipUTARQ9wm1JrmrzDxpFWv9g929huhyGH2bJ944jLqEk0WfA1o41l7RFYz_bDo3tByndey2rim_TA1t495aGON2qaBpSr93J9Jyr53a6-nVYVqiGXF21iZo69s2HlyfqOF4x5b1fV3U6Syqjpk8NNAoaKy1rJoxhMz_P01i3v11191i_--21Q5rv1Q14r1dQ1XiGO29qO2hqD2iGlq2qsS6Z1b1eNAoayt4hNuIJD44a1i4DvuuwuJ2qM93rOS6rgRtc9Ytc171Jv1tF_PSnD_5twPSnD25ugIfnDrZWZ5_lf6HOhmiw2mfqaa2xix0Jg82xix0GgSu11FiclAuziG6er82vl72Jgs62ld6Hg2u3lE9G982cariF9ZuzlA21QZ0cSfodScat2IfJ60VAcO45Dcwe9t53i91rT6o3R-CHaFu0CGkycdoGP28HTEuRDH9cVin_RP1sDI8FYv8q9m8sqC0tu09e0aw19pzTvjvZVc_Ivw5zIX111315Z_HrtO2nN1pJ1C1i2146QX1qiJiF13pxT23Bz_L52r45Wh1v6Wy16po15vp16W215t42Ni1vH141M942rOrGNn1eX1yS1Tg3v3p3Na1ee6iv5GrZ191rvVh4g2uzl5r29Wq1r8yxvc0Qgd1xXZ41g1t-D__lk65trIBsD25uhmBsZaflsm5uB5fnDeyqPm16D2fsAJ1I13rS6gPJS14vXA4rJTLt_vOJNtuxxX_N3F4vXApoz_Xo9i4wg1pGOI5igIdw5J16D2fqPmfsD261l79G9R0xlEuFgZ0xlE0GgR0zaDiF9AiFiG6Hgs61gR0xiz9xi79Hgf5viq0Gg82caa6HgFizlA1NWFvuqTngl82EWVAvsaiwOIwx0zoMQX56zzs49OZWir3JDy3T36YBTyZCuqraM3ddcosr8GZ0-Gb9IYDjb47vhSeqQneqaWqJau26rEuv9i1d_x_Lt-Nr741r7ulh7eaauisr1210F_F1yy22J1iv2wr3XA55gr1c91u35kgQN9fJv331TYgvgF8Hlzorv96G1J1w1PrJi8iGNa1erfrJX714_MH6DrMtZ5fe9CtqNqye9C1evrSLZaFsZMF24nH45J16DW61gz9xgSu4lEuwrZuziG6Hgs63ix0xix2Jgs62ld6Hgs61l79G982caa6HgFizgFicg4zLPMIPGfmf0ImTsQkWvnvWNYywC1yFH1uHYouxgxaQ05tBDa04qtrT7YcNHzkE6FdWaFy6muf3iE0zXU8cNziwQe355XyzJQ8ENC1191wb_626D54r1x1411da1im3l2qqmh0J0g515PLt_Tr3lo4QvW71Otq7vp1rrc9Dic2z9YrZ1y1rXHowlp3F551Qim7qaZ5vg1t-ZaHtZ65twP1e4dfnDrZOwP5wQ1fqOIiw2mfr6m1rgz9xld2Jg82xix0GgR0zlAiF9fuziG6ziGuFgFicld6er25xlE2Jgs62ldiF9Zuvre9F9m9S141Z71DVcCcJl7n9FVp3aA9xy40xad31vR7ek-OvBbQS63wD0hj5Ps1Sg61YtyZYAGb9IYXUFo31g91J5l7xei_WD2vJ52zf7eQs64w6r11151rb_11XT59r1W15h13fNf1elw4c6n3kz_J51loz093f111r1J2D181vl80JOo0v986eiZ9cTm2v1_HiwMHmf75yr25zQKflSmHqKMHikifw5J1erz9xgz9vlq6erz9xgSu4gSu1iE0GgSu4gFicgFizgZuziG6Hg4xRluurJflehUp4O765UadwaI9XJzP3u0uGsp9w14Ldi34_ZHOOvD0Gjg0RT2Fviy4WaUt25431gt6J111v2G_R15nrr813D1yJ3br36Yo17Y5J6poWTLjxX414nJoO1LD3X4i3CJoI1L1GXC6eEX_N3F42297kz_L51-3DQh5au_8J5b0zlC3JNcuFQ724evyr5CywJMsq52ex529wW44Jv53FJGrNNfZHbK6Jifq2e06D1u5Dvfpvg1tNrIpSZP5twuHbZ6fsD25e9CoZ85Slar_mf55tZdfnZ5pGOG5uhmlnSmiw11fr6m1er82vla2Jgz9xgSu4lAuqreu4lAuFgFicaa2Jg82caa6GgSu3gSu4lAiF9f6vlD0Ggz9caa6caa6FgA28E9mBrq3DJQuJ5e_WXQ8qiRwa1v6crqXvQ5ow-bKA0pOxlSfsJ83fjt1gt3mdvyET2ioGl938yqiJ7Km9cKrDPiiQODvZc6JxbnqccN9Bmnv_3FXg3yHylIv1P2BJL51t___MZMZJaI_Nl30v2317r22J23114_y117OJ1b1SaI__N1nt--1Jr7er1E11r1111811r2L1111151JJic1Ag7tJ1J13c15HDvbxvd2rmn13XG1Hvuq3vEpv91tNw6_mF51e4dHtZ6ZOwMH45J1er79G9R0zaDuzaD0xix2Jg82caa6caa9G9Su3gSu29Su3gSu4gFiclAiF9f6caa6vuEixup3ev5aquio3vz31mas1lr249zqJWfhVa-uev4m3rKwmq64DOt8FODoRxvpH625sea5a5eyr5Pye685qrLfs6mwNiLMr111J2Q_N109Jgz14T1xJ3k1p01f7O01aLi1sXUkxT3wGT2z70sa8r2m8cyaDy7qwP47rP4oxh45rm5127mdSAdvEYmfEyqrAUlE5uhdh2v3GT8839Z6aPv3CHsaD64cvub2AN81vlSbRcAcvjrrZ1314_PtNw6Hmwsflar_lrN5tw5StZ55zQC5e9Co-D25ukPSyDrBe5C5ukaBe4MZyZ5SOF6HbZ7HmemHnD1fsD2fw5J16D261gz9xlE0Jg82vld6Hgf6caa2Jgz9xlEuwrAiF9f6cldiF9ZuzaD0GgR0xlEuwrZuxrZuziG6caa6xaa2xix0xix2H9s62ld6egz9xgSu4gSu1iE0Jg82xix0Jge61gz9xgS5wrw5zlDuwrZuclAiF9f6caa2Hgfu3gSu4gFicld6er82caAiF9f6xaD0Ggz9vl72Jg46xiGuFg09FlIuHgt3DLlTr5n8nhJTXSSOXuZEzNT8F5gs5iLs52mKc6fcwceHwJ234QYi3OZ7bDzuGOsyeaT9ei21rePp4O76530w0doTeHn34rRp4rq619i6DP1IonvO1iQg1QVpWTt1J92o3uT94ZNN8cKv6QJ1r545RJyU8u-1AlPy3ajaciFr6Xo2qW9jlnzaDrOy7rTt41f4JJa8w-9i1rw8qlXlm6h7DOj5zvP8f1So4Q54_XHv1Xn9H4ku3lEE3hV1lX44T09rJAf_TgTuFlT1qjw1rO29fDOfEiPd1JabgI38cX63wyI0xTZQGaD3z1Q7c1p66mJaaT9tfL2_KiussZ__J2o_Xv9J1fI13g1o11111l1oryJ114__J3F_jO4W1fj13g1w1111rl1wr5511115Q1u4GDtiHNP8FiKoqNF2v6mib__14R_LrqA2z110v3Z11122J2e1iv1111jr29t12N1oJ1_11r13c1p91TJ3vr2fw51fw4__J1C25g26vgJ1vg1PJ11__N1yre71ET7i11E1ol111181ol2s11111r1wK_x2QQ7rJ1b13X1q12a17VAqHO2gJJ24oz_X51d3JC97J1RfRMe1s60fx2d425X53N2oBz_J51c52e9oFCnl4q1u19DsqP9wsu99JOy3Ss6iwC3yzXA1cD314N__mBPH24QMtZnBr5rSWZMZ3PHHirG5ukMZWZPH49IfsDHi15a2Jg82vl71Jg42vl79G9EuwrZuzlquFgwuzlAiF9d1er79G9R0zaDuFgFicld1erz9xgS535G6erz9vl76erf6ziGuziG6Hg2u3lE9G982caaiF95C29WpzJoe90oWeM783NcurgHkg5RfI1AoeNc9za2hlqhx6Yns6xqx7hH_4ZkWNg2HsYjzwPoo42t8SQf9ela1HO-uQu9pqdLRJfL6cJNgXDszbBQRbB6whgSoGit5Tbj1r6lHv7qcw5xi_P3ElHesgxagdcisr8xlldj1f2hdq1Um5lHueQm7KSAyxabuz0ucJ111v1a_Ml4r1hT13v1ir20r3ljrGQK12JcrH5ul1x13199ic5toDi93cJloqgzuJroivNp8qDZ6v91t-DKF49rMtZ55zQK5zRP5wQ25uhmFwFMSiJNZyDHi3aa2Jgz9xlE5Jgz9xgSu4lAuFa3uH9Ficld6e166ers2cariF9AiF9d1FrR0xix1FgA1D27y5ZBdwv2aHlIrwXIkr9xrP38aQz-lv886aOs0w806eTOhvmkkd2802Bjxv5R8GXcqHDwixJ2yhv2o8hYzbVLVwT90G9s_RDvy1eAu49__v5ALJ121m55brov2n515r1rPrQ15Jgt111_Fr5rSODHi15a2Jg82xix0zaDuFgZuziG6vovuxlR83gbpxJR5HOJ0wQ6xeMwy4vUieNrfSacoFi1__N1v__x2av81v9E13r111581uQ2s18312u14e1G949JiW1G219giWaI1sDH1t__14t_KvtS2a130v2511122v4hB1112Ii34zMsp___16I_V1qA36J30v1E11122J4f1oX2Jv1rr1O29D2s1r1-txizsxODp___17R_JrtX2zg30v2711122v4f10J1551o1rc3sr51uzg936gIu3K__J2j_-v5OJl-1xg10v111rl1AJ7Q1l91551o1qiFsr51iFiz9SgIu3K__J2Y_N54GrsN1xg1ev111rl1AJ3U11116Q1yoGO21rvIsr51pGO936gIu3O1fw4__J3i_CD5Krmq1xg1p1111rl1Ar3d1c91551o1wMwsr51d5N_tSgIu3K__J2f_M95yJs11xg1q1111rg1AnJ112213J99u6a314rD31cdpFrI__N1zt-m2oD9pr9E13v111581uT1z18D12213J5_aSa216mttFMdpFrI__N1s__q24O7ur9E15v111571uIy111dr1Ctu15334es1v1Xi1v9sxODpJ2mit__19F_RrqM2Z130v1T11122J4k1sX2M11rr1O2tDYs1r2pqzN_sxODp___16b_DvrB2fJ30v2911122v4kn111551o1vvIsr91pGO936gIu3K__J2t_BO6qJcl1xg1pv111rl1SJ4E1l916Q1y8Dr21rP5sr51rDio3SgIu3O1fw4__J1V_lJ541jj1xg1qv111rg1SHr112213J9neSa315T-7xudpFrI__N1w_-B2aO8tv9E13T111581uO2Ev8312h14cNX1r5oy6a214vX3J6dpFrI16DJ__N1yKZi1_96b19E15T111581uO1-v1112h14xNV1r9nyWa314TV8cCdpFrI16DJ1151w_C42aO79J2619C18fN_zFN3ux120312TFv2Qzv2vFv2T112t51p5avDLt_Tr4Qi4DvVo6TOjxJ44ca731vJlzv2y5rE1108zFN2tF248ah4rFJ3l4x1y19Xu4l751Tw2vP7pqH49v91t_Z55twaFlrr_mCmHlwP1e4d_lCm5uk6HySm5wQKHmZi16DIpJ6mfsSmiw11fsSm1er81vl72Hgs63ix0GgSu4iG6ziGuwrR0xlE0Gge529ZuziG6Hgs61gz9xgz9vl35erf6ziGuFgZ21l79G9EuwrWuziG6vsouFdbIbOYNWsig5rcgw2cixQA8wzJNN0_Q7qsIwDY4PWhkVwRua3PHgcViKBBScQapzT2subFpFT3LQ5l_KUGJG63r_QvpQQAisJHoqaw32hB1fO2219xUZ5_qsiUtZkl_OI-RIm0dghXGvCm3D1UbzTQyJ4__J1V_lJ4Nvjm1xg1qv111rg2cAX112m14J9BxFOB8cCv1v1VycXnsxOD13Oeur4__J3g_VD6Lrcl1xg1pJ111rl1SJ4E1l91551o1qCwsr51sQTIrsgIu3K__J3e_N95l1cl1xg1qJ111rl1SJ2X1l91651u1aSur1QuuW2uwqrQg11IpH5S11o_Zb-P2Ql75v2t16O1n51GdW1_5JXerDT311smsW9C7cm4oGOT93ul3JPm8rPlrJ0qrS24qzNCoGc41QiMu10jrHyX_N214JQtq2udrJNf1em13JM96J1KpSZWSxKPtMFPBlw5HOwPBwNrC24Q1e4dHiwiHbZ5Hiw65uBiHiwMHif5HiaHi15a2Jg36erq6er79G9Euwr3uwrZ2vl72Hr36er79G9EuwrquwrEuwrZ9G9Su4lA6FgSu4gFicgs61ld6HgFizlAuFgFicgs61l72FgF2ziG2q162caa6FgZ04lA2Qnx1q9duGQTy2g6U_FqDxrZpqQZ9Jv4lAhciS56uGQYuJswBicA0kD37q9C0zJ04v5w1viNdtVh_ItMXJr7SMg21k192oPY2E8-ndei_P2upwvXpaD2i5H0qJiJpqWj_IskpwQCpdT2YdTZZzvSrAum2vr2dQ1Uy4vUrsT22va7a5cQuGTt7xm51r861DaXhhvTpw13kv111b_D_N95uvh315T1R51eeQa265a2iQa29aa2jc121JdX_N3A5HC92rH41oz_J52852C915e8h5n5eJu8w555uv5Aie9-rGTQs352W37Q9r9c6vO43DLk5v6P5v53fH925WP21ee20553raiHtxc99wXyuDi7oJ11tF_PZOfPBe46fsDGfsMmfe4QC18dff8uHbDNHlSmHc4nflrI_laIiw11fSSmfr6mfqaa2xix0GgR0zaDuzaD9G982vlq2Jgz9xgSu4lAuFreu4lz2zaDuFgFiziE6wrAiF9suziFicaa2xix0xix2Jgs6FgFicld6H9f6vrAtqW672Qq5rsnbArFdr5c8wTYtvQ91JQbEFidac1r54TUl5QGjjrG01JJ4w7N317QDUg-o1giivrxpwmia0EugeYU7IHFyVk-vDg-y3vo9ePZ1J0AoLQ2fwNr2VDdpzbK26XWuJv9LQ2AAAPiPbVyVHo__J2o_MJ501ba1xg1o1111rl1At-J1l91551o1qMpsr51aDrIiSgIu3K___M3__O3X1gq1xg1Sv111rl1AtVg1111551o1e9Isr51yxai16gIu3K__J2o_MJ501l31xg1o1111rl1Ab_51l91551o1qM4sr51q4NQ2sgIu3K___-L__O3gJs11xg1Sv111rl1AbVg1111551o1e9Qsr51pq1i16gIu3K__J2o_MJ501bZ1xg1o1111rl1AK-J1l91551o1qM4sr51eFJQ2sgIu3K___-2__O3FJgS1xg1Sv111rl1AKVO1111551o1e9Qsr51p2Ni16gIu3K__J2o_Uv501fd1xg1o1111rg1ZF9111EDtD0trv92fw51__N1itVT1zO6Av9E15J111581u__2v1112213QNKQ3-voJutoJ52fsDH__N1fK-92e19f19E13D111581ul1T18312213J5Irsa215rX81sdpFrI11o_GtAI1KX7Ev1h14D1e51Qseg24118yQiDrHTR0G9Jy2T_a20v5v9qfrl22Ji0uJgWpFln13_MF4_nHuSmFsD25uBMF40MoHvr_nZdFlDHi12m1er79G9R0xl39G9EuwrZuciAiF9f6cld6Hg461l79G940zaDuziG6Hgf6ziGuFgZuFg41zaDuziG6cld5H93_zlW9eCrUKC904lnytQk9zmu76aAjeYLaSU2SC5itGvBr21T0FiO8Hv61r5z9zQO9Qr342ak2r1QuHSjUKB9y3rz8zg27cM46sOXlcBV1XPHnJ6o7HaTyT9xr403iz52mr8x1lMgiQXG7Of-cbXa__N1SKC42uO6-J9E13X111171uSr1t__1pt-rJrD2Qr30v2y11112v4m11111r2M_Ml54vqi13N1WD2zw1l2kvO213J2N3J2gqJ2frQ2o1QokGa20j1U1qUa2r6P2r6l2r542rr11dr1m13D1ir1S116a1121v11511v1511211H3G5u85iq12gr6x1d1HgJo1O09q5R51O43F5R2cQ714N_5ywQ5wQKiFiF1e4dflwMH4F65uhmfSSmlw0bfsSmH6DGfe5CysSmff5Hi12m1sDW61gz9xlE0GgR2vl76er79G9Su29S5wrAiF9d6er76erfuzlAuFgFicgs615d6Hg54Q1Tu35ZjXTxyRTouGPW6FgOo4g31R39mfaz03v-_IeUjCXCp4TVgC3ViGCwECiOygcw1aPw1m5OywQOooiPiX2dcRsA9zXYqtBrQh4j1151hbC425572v1G17e14rJw2ca52vgk14rWrH-X_N217HgOq2NIuHOF4vve6Ha56GNZ1192X1oJ1v931Iz_J51o3eh91xOZ6JOF9v91tH4DBmaIfSSHBe9Cye4dFlr25ukOSxKP5igeyq_sFe4mF45J0er82vld6erz9xlEuwrFicgFuzaD0Jgz9xlEuerw5c5DuziG6car1Jg82cl50wgFicld2561fO1XNWsig5rQdFucgh6khqJN62TCpxOC7J5i31922r7t5rNI8eE8r2XO0QHt-q1UqwgH1sP9uHibpR191si2Gv9LpFJNp_Zo_z5lb6u11ZX69cN11151IKC41Ui7qr1U14M10crY1rgY1rgu912J1011T13J11a10Did84lvuHgI319o0HropHX314NrMiZdFlr25ukMBe4MSsZmF45JfsD663ix0GgSu4iG6ziAuwrR0xlR2xixuwrquwrquwrFicaa1caa1Jg86cld1UtGsaHve3ekiA67uDg662Px6vYxgJTt1ruGdA45-q1UqwgH1sONixlq1rYEnr8WnhX2WCCQh0B-jhCM_TJNmc0hfr4__J2B_Qi73Jgt1xg1ir1111l1Zr3U114__J2N_Qi4Bve51xg1ar1111g1ZlX11151n_ZG2vO74J281pW1oGQX1aP5dDeIe1u564Y411ir1G141Ju075iH0eH4pDv06vlZ535oq5g374r3yQia13_PtND_5twdBr5KF24dBlwaBe4dfbZ6H13J1I13rS6gr1OV92gduWOVjFT37oz_Xold6zhk77Qg1WDIfqOkr3doyv6Eyv5o718I7tOg1Rrgc2v376vy4Dcu7153tcv2pHv282v2fsSmfSDIfsSHfsSh1sDHi12m1er36e182x5xuwrAiF9f6ziGuFgS0xl11rg82caa5car9G9R0zaDuzaDuzaD1zaD0zaDuziG6H9f5v5A0GgS51iE0GgSu4iG2vO7t6b--m1BprDyo3d30crr5tCY_b5221i8j4lv8rD92cctizsy-lbP1eO41Jix22lajUX4md_-eA_-vhfglGlM1JSJyUii4J721PgFO0H9a_VDstBF9HNIpUTUtKl-rv5orz_CtGCimtVoM_Bk_KaIs7De1kl222Yte3hD111218FMUJtX25r1ev2dr4rHtJ5ztJ5QyFrBh4O4fHX2w2X23v2465ijrD69yGC4pDiW9QiDiqvoeFOluFD7uJgu54l513_MF4N_BlDrC18nHtZ5BnZ55uBP_nZiiw11fsSmfsD661l79G9R0xlEuwrAiF9diF9ZuzaD1zaDuzaD9G982vl76erd6er79G9EuwrEuwrquwrEuwrAiF9f6clAiF9f6caa2caa5vtXasU4vaJNuJJ_pwmWq3Jc84r8a8WFgHlt44gOo4gu8rlCpQNq1JqTOjr_o19SZTWHbarAc2Dwp4I0ewTHlv88lx2-9uxzzgmfk2CX8xJCyqJnn2Cv1fHb98Xvpzcl59KvWEzi8EvslbXM__N1mt_42vJ81v9E149111581uQ2j18312213J99o6a3145T61HdpFrI__N1wb_61NJ6r19E169111571uRg111rr1O333Ys1v1K0vrisxODp___18w_JJgi2_l30v1G11122J4j1g12Jv1rr1O333Hs1v1Oo1v9sxODp___15Z_Hrrt2za30v2q11122v4jB111551o1vvUsr91pxT936gIu3K__J2S_Qi5F1g61xg1ur1111g1Zr111151y_C41Cg58v1F14s17Jh414ah92iJ4Qi10J5Ru2an01OD21TG2z1O2v1_Hw_mFe4DSOD25uCm_wFlZlJrZLDHi15a2Jgz9zaD0GgR2vl72H5d6Hgs63ix0GgSu4iG6ziAuwrR2xixue5DuzaDiF9f6caAiF94Wv58fsg41v7nfSQBg5u8NWsig5rQdFucvcrhd1sgtcioJt7c1GQD5RSz5FiX82u7rgt-6xsys6RC93Y0uz52dSaB3Ea3Kx759daC8DVC__N1cb_82qQ9f19E14g111581ul1Uv8312213J5heWa214S06eSdpFrI__N1pb_51C17Ev9E16g111581ub_bv1112213J5HqWa215c9pzedpFrI1151pK_X2dD6VJ2517C13xNWiq1w3rlgrG3X_N21iH1Eq31H91X24z11r13r1p11O11611m4uxOHiagj3Da42Fl_yw5Zt19T0wlK5eiZ3JQPoJ1KHmf7_lar_lr_Blw5_lrrC15qyq_iFbZuflHm5urIBe5Cye5qywQHi15a2xix01lz6cidiF9d6er79G9R6caa6caa9G9EuwrAuwrEuwrR9vgz9xgSu4lAiGg42JgR0zaDuziG6ziGuziG24iG6vsPyxP9_PWosrismzvIy4vIy7lp4EDUtvOy2Gpi9xOXlw3341MkZfPeyxDSSFgMNFSi1w2ipFT6sqOB6J7i_LX0y3OIy1nvnGyy0olVpvNN4F85iWPJ54TIaelpcv5i1r9x6DJLycX66zJ11151rb_11XT6mr1_17C1ts1z1f11D113411VrGgGoGgw5aiU0qim71c42Di10v5E0Q5s3D1v8wlW4H5Z0rT90qvEuGN32FlNyzaPoJg1tNkuHlwMHc4MHmBsHc4MHe4MH24Q1e9CoSZPBlw5Fiku_larSlrr_lZifsDHi15a9G9E9G986Hgf6caa2xix0Hgs63ix0zaDuzaD0Jg79G9EuwrZ0GgR0zaDuzix6FrEuwrAiF9s61gsuziG6Hg4xRluurJflrm7eQXXpFgC2ATTyJg666gdpFzk2DUadwaI3mO0yxYP28XVqx5J1BWz1v-c2vawwqOX2P39G4rR0YvEhXi24zTIkJyd1JXusxTN5qLLpGTZXHHg4e1t6J4__J3k_Mv6krba1xg1y1111rl1A13U1l91551o1rJAsr51ew198sgIu3K__J2j_B14-1gq1xg1d1111rg1Ao1112213J5IrWa2166r5S2dpFrI__N1E__g2dD81v9E14v111581uQ1G18312213J5koSa214rI32MdpFrI__N1kb-J1NN6r19E16v111571uRw111rr1O2pFPs1r21uHaLsxODp___10K_A1sP2_l30v1X11122J4j1oX2Jv1rr1O27GMs1r1FpJvmsxODp___17Z_O1tw2za30v2g11122v4jO111551o1qOBsr51tFgwoWgIu3K__J3k_Qr6krfb1xg1y11111l1ZJ5O_CF__J2P_Qr5grrU1xg1d11111l1ZJ5O_CF__J3o_V19i1cl1xg1yv111rl1SJ8-1l91551o1qYasr51aW9UpWgIu3K__J2i_VX6rvjj1xg1dv111rg1SAX112213J5ke6a215037GMdpFrI__N18b-V2iQ9f19E14J111581ul1118312213J5jtsa2151D7xcdpFrI_____tAM2117Ev9E16J111571unl111rr1O27F2s1r1Loc9ksxODpJ121el5Ur9S2U515r2nr57S4r8i3r7Y3kQ01vQg4c09yJWo3roo4r5_1v56r2ihq1s142692q111r3K1v533H912H1891nJ2N182rn_1v534J1KZsZufr5rSOsmZsZ5pGO1fw5Jfr6mpSSmfr5a2Hrd6erz9xlEuwrZuziG6v9Sv3s8tqil8xmsu617p7Xno7iswSW7wAh7fQl11r6f2pQ3dJjm12919D102vXi12qJ2155Lt_1PrQiq1ri5r1KZlDIfr5rSPZst45J1er82xixuwrZuzlAuGgSu4gFiv0kiFPteHla61N0sDQZc1fVgd-2qeJz8eJg8wutuQg11152sJqY1WO7Rr1q13c16JLb1pN11v1e2ei11H1491i41F1e1e5013_mflSm1e4dFmSmt45J1er79G9Su4lAiF9s61l72Jg86v0kqwn5izHteHla6219sJaQuQdxgE-2qcOz8eJg8wi11r5V_A14Irg_12X18Q1y3rg146Xw7e1o8J048r91t-DrC18dHtZiHirHi15a9G982caa1caa5caa2Jgz9xgSu4gSu29Su4lAiF94Igpoq4Ne31Qds3vB6JWKnMUt2mCvhWxqatV-aat-MQymiTJSp4opiXJ3iXFvzYT1__N1v__x2av9FJ9E13r1111R1uJ2lJ3z1rl2er8f1LX1hQ1x1411u21J54r51411u5NJwFeri61Dg42vu8NJbFqJio1D416mfw51O1pJ1Quedo55qkz_VQ1yqaQXy7141xgq0xgg771I5waSpH5S7D1ebF12bFr2l5E1qh20T5EJqrsmlR9Jdb__15o_Kvr52Ma30v254J110J4l124_y1181aa1eJ8D__N1oK-Y3pv9mr9E1011115819D5O18D12c155MdbSg31cWdsr91ddr18sgIu3O1fw4__J2w_Vg7fJc41xg1Qr111rl1zr8i1l916Q1ywFg21G9Asri1yara3WgIu3O1fw4__J1S_Na52vj21xg1Tr111rl1zr4q11116Q1ywFv21G1Xsri1yDge2SgIu3O1fw4__J3t1W12cJu911l15r111UZ__J3o_V19i1v_1xg1yv111rl1rJ0A1l91551o1qY8sr51wQrmysgIu3K__J2i_VX6rvhM1xg1dv111rl1rJ6p1111551o1qaZsr51tzrgiWgIu3K__J3o_V19i1c41xg1yv111rl1zror1l91551o1qY5sr51eS9M7sgIu3K__J2i_VX6rvj21xg1dv111rl1zr6n1111551o1eODsr51uD9giWgIu3K__J3o_V19i1lE1xg1yv111rl1zv8-1l91651u1v5UqWa31r27d3TUsxODu3OD__N1wt-L2a96h19E16T1115719CX111ar1D31qs5sr9214h90qsdpFrDpFw__J1m_BT5Grv_1xg1t11111l1rJ551lo____N_kD511hM1xg1f11111g1rS11118_hvdq2qa7dv1e12yZ12i05viZ3J11t-D25irrH45J1erz9q9E9G9EuwrF2w95iF9d2qdW_61JIF1bt8122qQ4WxvQtJg2kJs38A921Fi11r2a_AT6O1hp18r1ca2i9D5Frr9srr6Itv5vuJ6Hgv2AaSs4jsSWrHsouDun9G5s0F1h4r1s1esSlAS427Y43vlomwY1rFi3gFCfhwCs9aa-aGX-9G5f6wXl9r1KHtZ65uBPSnDrSnZsBw_MF24DFyZl_lJ25uCmHiZaF29CybZiF24MFlaqywQrZLSmiw2mfsDW61l79q9Q9G979G9EuwrZuzlAuwrR2xixuwrAiF9diF9Z0xl79G9Su4iG6HgFuGgSu11Ficld6er79G9R0xlE9G976erfuziG6Hgs61gz9xgz9vld6FgFicgFicgs61gz9xgzi1ld6er8iFg5iF9ZuzlAiF96O2ht_I0a_OSwroir9FaGr2OH1SgpQF9W4zau9Hrt5FNEQZ1i7Hvu8v92wbjvcp9X03Xcoq00QpIj1YrcmGPYiGgnmcXbnc9rI1llkHDEiFiE8dNlR1iT7Sr2o6pYuc9a4amjGFv_VRhauqikualJdRrb0Jhm0wa51d2y26Sg1r5282KA1s05s09Qizmi7wbEUJDR41vsq3gF41YefrJiiGgEiJJpoqeBk10XeccUeJ1314Z_B1rR25i16r1l16e1u6ak1aJa1dOr1rmK38N91vvdmr1n81754cD1KqNltHHK81il82Q12H181vl5KrTo8eEM5vg1t-DrMtZ7fe9CoSZP1e4d_larZLZ7fw9Hi12mfsD29e5diF9AuHl79q9R0zaruFgFicld2H5E9G985rrR_upfRWBNp3-z_KfexCxcQifVxA-ZnipCvJ9h_TSBdz1SW9Uf_v50T9_6RTi27gVy_Ll111a1TKCV2oO7K11c14l1wr2d1711HQ32s5cQq106q16Yer6pesY61EO-1sT-1aO-1aCLrDJ2yQJ2w5M0ZDQ3qaY21a64kWumowMLfsmL9W1XT4v3i4x1y01XT4z1y1aXfd111r1mkc98i1D24sSmgd0iraH216a2shPhfCONds7keGxK4v5ykH2_5pNrKH1552vu8hO5iWQT13_MZKDNZmSmHsDrZKZlZyDrBsDCywDKoJ5e5zQgoMemFlFMFsDrZ6SHHyDr_lrrSyDGfmHmiWSmBw5JfsSmfsSmfr5a2xic9xgSu4lAiF9H5rgz9zaDuFgZuziG6Hgs5wlA6Hgw63ix0Ggz9vgz9zaDiF9AiF96ucld1Hr82xix0zaDuGgSu4lAiF9s61g86xlD0xix6erfuciD0Jg82caaiF94KxOv_EvbpxvprWh7iQvX7WHe7GDo1GSe5wBMwJt0SiNPPxSoqGAAogQ2eFWLe_HnaRGoWdHeeQYN-4rzcoJJyZPOnxydw2TYQYi4Sx1KoeNO3v92HqP5yerprzTU45oMHJ531vR-vaOo3JhoqJgy1rTu_pSZrFU1khC5r76YeQKLuSTiqLlBoZaB82z-DA9L9evRrZ1111a1TKCV2oO7Yr1I1551sJ2v17T2453XgWg2gSa2aWa2cs92mW92hs92s692es92kaO2fQO2waO2qQcjq7Y91Jyepv53xcv2bev26Dvaqsa31ri592rvs31492WLp13Gpv53T3T2pchK2RN7KJg42c2L16cLc6g2msg2e6g2sxHtaMMw1WumKDO2EDO2xQO2nDO2qFmukWSRgdXrrx23T594i5p1rY23T5o1rL23N598rQWLhAmIk7EkePMb1sMzdCPeicXkdqra3rHh24Hhiv1K_mBMHuBl_lrrZKZlFsZlBr5e5zQKBmHmlnDrStZ5iSSmfsDrZ6Z5iSSmfnZa_lHmZiSmfSDrStZifw5JfSDIfsSbfsMmfsSmfsSmfsSmfsD261l79G9Su4gFicgFizlAuwrR0xlEuwrAuwrz9vgz9zaDuFgFicld6er86v5a9G9R0xix2xixuwrFizgFivaA6Hg461l79G9EuwrZ0zaDuFgFicaa2vld0FrE9G9s62lA5FrR2vl76erFivyYl6HMF3Jn3Wvvuzepr4OBru7h4zvttF9IuZPwg4Yb1e0t1NRaFGAAoaPookgPxr68ydC8_6Cqb9Lsk667qRFXu3y5K41BnAHV9Chi7xEqQJrBlzNFgeNK7rNfp7ah2Jl0twvZtWaeyFrn7zh1msOMebARqJOo2QPo2vX23vZNIfm4yT2PRQe1gdW7q-XZdvHpCFOKmwOl7tBwgxXc73m4l1112r3x_RT5LJjF14J1av2T1851nJ5Pr5P1hJ65hv74gJ6yf16idr7W6r6D6grs1UTt1kDy1fsz1duz1aezs7i3jWv2swO21Scf1dCLKsJ21YSlIsJ3xSJ2nWJ2f6HOf10lq6VX_N215eahq6CXjdV5hJ6ShJ6vhJ6RLt-Xr6iyqdlth18KhtMQ1EewuG1jtJm_2XN8RJl52H2LtqD1lEXJaX2wQ6yvaN2w2sujkRcXbfHVESmJEZeOEA04pONxZG939zaC6D104Qvf60OZJ4Q2ykz_Jolo4DvCJ1T23Iz_J51p41M93vAk1DShrJ1K_mBMH3PmZ3PmHbZ5pH4nZ6Z55ukMZyZlBr5e5zQKBmHmBmw5HtZafmw5He4aff5GpSSmfnDrS3K5iSSmfsSbfnD1fw5JfSSmfsSm1sSmfsSmfsSmfr5a2xix0GgSu4gFicgFizgSu3lE9G979G9EuwrAuwrEuwrZ2ziGuziGuziG6caa2Jgz9vl79Jg8uziG6Hgw63ix0Ggz9vgz9zaDiF9AiF96ucld1Hr82xix0zaDuGgSu4lAiF9s61g86xlD0xix6erfuciD0Jg82caaiF94AlqjI5DyoHDnaDYdhx5Wr6sJ0HDO82iV4EgKKGNop1TmoWOibq1-we944amKvQS0XQN4GmwtokgPqDOPPxA01alCkQbNfW0NxCsOaahpbtvD9XqNi4PBk8TzWQJjphpw2pngLRaa5HDTd7YstGJHb3vmiOOD43Xupvg31vQY84Di1v53q5NBaaBMfDOo3JhoqJgy1rTu_pSZrFU1khC5r76YeQKLuSTiqLlBoZaB82z-DA9L9evRrZ1111a1TKCV2oO7IJ1b14a1qJ2a16X1LD2BPWQ2LWg2h5g2aQg2eag2jai2dDi2qai2xwJ2t2vu55vY2r57491g1evq911J1191w7XBqv6pwDbbeJ08adX_rqOMkWPskx1vuz1Aa4jvuvrJuT1AQ4jvuO1A2whkdSMvqzMptSyksSAkyWmtEDaE8hPt5RNq1c90i6QE13_MZPSmBe4n_mFlBe4PywQMoGN25e9C73_lff85Be4MHurG_mHmiWZMS6ZmZsZ5iz5JfqPmfsSmfsSmfsD261l72Jg42vgz9xgSu4lAuFgZ9xlx0GgSu4iG24iFicia9G9R0xix2xixuwrFizgFivaA6Hg461l79G9EuwrZ0zaDuFgFicaa2vld0FrE9G9s62lA5FrR2vl76erFivrD9ciccXabpGgmoxrVyQYtujJYaah9e15trA0ucDN4GmwtokgPqDOPPxA01alCkQbNfW0NxCsOaahpbtvD9XqNi4PBk8TzWQJjphpw2RinpHaWWKVnaD9R8cmax9xmfra42zM63tKmqJOo2QPo2vX23vZNIfm4yT2PRQe1gdW7q-XZdvHpCFOKmwOl7tBwgxXc73m4l11418Q5brrb2n51411n13Q1pQ1a0k1b6vD1O1gu4qTI82iTtGiptJ91o-DKBmwu1e5qyq_nBe4mZLDHi15a9G9R0zaDuFgFicgW61l72Jgz9xgSu4lAuFgFicg661l79G9Su4gFivrbzGQv03Dhwx07_O5A0Gll0cNUo3lw7F1WybVoo3vznDOQvJa8f2ag0Daa44MQ8SiXy3TH8H2bsq5KiBOn82WR8wv1__N1v__x2av75J1E13r111581af_y11G11ED13NroJ92fw51__N1zK-m2vX7er1R13v2ar111rl2ebVM14914Q10161ra62rg6151sDH__N1J_-P2Z575J1R13O2L1111rl2ebBG14914Q1015Jrw32il5J51sDH__N1ot_l2m975J1R13J2Iv111rl2ebCk14914Q10551vr5M1l5151sDH__N1f__42UJ75J1R1491T1111rl2ebVy14913kr1pe1Y1v6mir4__J1P_BT7vrgw13l1t17X11122J66_WJ1iv1oPc1A94htuvi2fw51__N1rbMD2X57fv1E10Na11581af-l11G11ED55mteJ92fw51____Q__B1FQ6Xr9E1ug111581hB_7v1112c14Ji31e9Isri31r1IpH9qsxODu4rIu4w__J34_-96q1f71vg10111__N1K__r2ov79J9713a11t__19F_RrqM2Qa32v1T114__J25_ND6hvfW1vg1tr11__N1Et-P2kQ75v9713O11t__15K_Z1rQ2mg32v1O114__J4d_C95AJfB1vg1ov1111515t-J2gO7611Q10Y13EQh1sTh1dTf1rAX_-c101Jtq4T8qvl3prl28HN07HO03rN6y211r12r11i10vNXQ2i25Bz_J51u3rC95Ga43Gge3Gam1v1_O1pJ1Qued51s3q1q7wg0521euvW14vNA3rvu4wg0blDIpGOI72LZtJWb3dN01JRufsQrC24Q1e4npSZP5uemBe5CtqNFoH5FoF5JfsDIfsSm0er79G9R0vi30Jg41vl72Jgz9zaDuFgw5zlAuFgFicld6Hgw5vdoeqH49sq3caH3WmNd3diQrA1_Q0yswHlJ8QY30clJulBaqxDVeIg2dv6RUif-VtCbocpcysDBgmD2pv5KB5-mfsrNmZFMBtZn1t__184_Irk42bX32v1J114__J2B_B573Jgt1vg1ir1111i1sK_v2gT6Xv1h13N1qv1Cr2Xj142i0vDNqGiZpaiOuG1v2QaZuzQZtDiA3rgZ5J91t-D__nDrBe5Co-ZMBr5rSPw55uBaH45J1er79G959G5x0xix0zaDuziG6zicixrFicg461gz9vgz9vrz9xgSu4gFixrFiF9d5Hr79G9Q9G959G9EuwrAiF9ZuzlAiF95iF9d2aQXpD_-HQB-deHG83OXy3OllcJ2YDX2yQNIy0JXpFzvy5K-DDOIywQIgJ7ogN9IyuDCpDf-BDsX_cMXpFQCpAyHJsy3ta521D5Iyrs_pFv72zvIpFv72zzMhqOX225CpGOX6wRM8qOX431XpGOX4vN31JDC1t__18w_JJgi2nO32v1G11111r2Y_MO7Z1gv15g1wD1HwJ2b119122W42vJX5aidy517a1hv2vi7q4XZy2M49sSvir5HpJOt3DlZrHDZ24m41v1_BnZP5ywQ1mCmBbZMFe4nfnZMBe4NZiSmiw1263ix0Jge629s62gs61gz9xlEuwr3ue1Z9Hg82xiv0H9s61l72Jgf6caa9G9R0zaDuFgZuzaD1G982xix0zaDiF95iJaG6vklc1s04caqyqPw4Hia4v5sf47l_LBV8rg81r931Em05Jv31rl78eaFocTIyp2m1fem1D5IyrdOh1yv_PcI_WmI9grcpzcmmWsI1jWI1qEY1rv43bX6JF6fgqvGaEvmRFXjfVeq0E2sifg3wr52y3PT4J9X__N1ht_T1-D79J9714i1111218K_CrsL2b51ur2Ar56v0r5n14mP5v6y5WXq1zTq1qJq1eDq1e9qpJHs0r5W0erigz52iw5iuxQWow5q5z5WrHvkrG247194uFu4iai72r1_BbZPt_ZP5yDeywDK5zQqyr5g5igGtqMm7245izDKfevrHw9MoSSmfsSm724dH45Jfqaa2xix03ix2xix0zaDuFgH5zl1uwrZuziG24iG6caa9G9Q9G1H6v5d6Hgs61l72Jg8235G6vsLixjv_fVv5Qlq05YjnPUw_naSpFEs1Wds047lrtB-rbBy9v5qiAibu86DxQ528r9jiD9-0zim44QQ0d331qnQ1bYUu2Df4waWjrNc_PQFhG9bpGmdTO615FX1__N1mt_X2kl6Bv9714l11t__12Z_Lvw02b532v1N114__J25_VJ6bvfH1vg1yJ111151eK_E2wi73J1V10S13Hvc1eJa1rv31riSLt-9r6QuqsiD1r9Y9r5I616U5J5I5J6w1v661v5V9J5V5QTq1v1X94a214svur9SiDiz0FvIrGifrHJz25iq13uJ9V1z1Gizt1OoyFv3pr9h1vgF1wiZhrr223iZ5v1KBmsmBsD_tFNrC15qyqMmSnDrZLDr_nDr_mCmlnD1fsDHi6SmfsSmfsMmpJ6bfsSm1e181va72F1e61gz9xgS5wrAuqrR0c5Su4iG6caa2caa6Hgfuc5DuFgFicaa2caa6caa2Greu4gFicg6iAn6_IN52zvIpFv9_LuXgAlUyvgCrlgp5rMqhe93316gy3OIyrdj_TKg_Lmi0QB-SxOCyqO2iH644eUZEr5UNVgApFttutejj2WI1fb0f6mviNDD0YTRjAcT1RDIywR__J2o_MJ501lV1xg1o1111rl1zv131mg1651u1v5KeSa31r1CqGg4sxODu3OD__N18b-V2iQ8pJ9E14J1115819X1sr8812e14r92p4Ss1v51oD5jp6gIu4rIut__14t_Kvr02n530v5D11122v66iv11551o1c1Bsr91tzar56gIu3K__J3l_NJ4zvfc1xg2uv111rg2elX112213J5yysa214JF4vCdpFrI__N1btV_2196Xr9E1li111571afA111rr1O2oD2s1r24yxNKsxODp___15I_Jvrb2n530v8u11122v7n1111751t1J924zcs1J9215rI72cdpFrDu3ODu11317_-kre82lv1911Z16C1ySiA1qaAuwh6uvuj9J5E7wghecQ43wluizvrrHiXoW1mg2D38qlUrHOcy11C8aiW0qJDtvO33FQOuHl114_P5twiBe5Co-D25uBPStZaFsZnBbZPSyDHi12mfsSm1e1c9xlf6vl76erz9zaDuzaD5zaDuFgFicld6er86cld2FrR0xixuwrAuwrz9car1Jgs635GuFg5e_ZKWsX21rr5lWJx8a6eRX2mhqAWf6o8y56CbDYVkHl31rq9aQO2F_ZZpq5by4JjP7h2_z-x1TxxI8puw62MhZNTWXnDv6WYgqqJuXwT_LB-g3D0P7mb1151tKVG1NT5911R16c1oA1m1e9m1f1z1fNk1eOd5c1X34vq9J158HN5rH9qp3Wc8J54aHN21cNy5xvW2cQ714N_5ukuHsMmfSD25e9CbqNgBwQMoHvrZlDr_nDrZlSmfw5J16Sm1er41vl72Jgs62gs61gz9zaDuGgR1zaDuziG6Hgf6clA5FgZuziG6vtpYge01ra654JTlJYlf0T_p4Tlr5vByDML7wJcuGv_1BvT_RI-GU1hrwTc5Daep4F4w8fJN17w63QVtgzqOo7T1qcuWa1V111217R-grtX2vD1yJ2Jr4Pk016E2J66p16W4r634r5D4r5E4r5l3r6Q115g8QiefGYKpv9U125MivPx0zJt9cs47zJZrF24pzlV1v1_BbZP5ukPZOAJ1I13rS6gP1Ni62aApSQ25ukPH24nSiSm5tZifw5J16SmfsSmfr6mfr5a2xix2Jg82vl76erf6cld6er82xix0zaDuFgZuzaD0GgR03lEue1wuv572Jgz9xlEuwrFicgFixrFivtXy3S9WAYuswmaTYnfTCcLYqTCaDCus2TrutBTf9EIa15q8AWyyZQTddlQqGeT1fCTerdBoQpxlAMBmBjoOD1UpQ3HzzNLyqY65JQ044rL5rT0i5uz_v511reX1w945rJp7sms3qa11151btV_2195e11C19e1yraH6w53H1X2TrX2vJX2s1X25vX21JX29F52hqD203D2qrX2tvX21JaX14vpy4iB94vagxDXm3i29Bz_J51j3rH99HTo1FTiuGN7ke12dH12we121c1Pprg1tMZufSSmfw_P5iFQ1mgIfnZMBe4n_bZPiw11fSSmfsSm1sSmfsSmfsD661gz9xl3uwrAuwrz9vl72Jg82caa6caa2xix0zaD0zaD5zaD0zaDuziG6HrfuziG6Hgf6vl76erq219CpSgotvmrl7hlu1982vJZpGJA4eD8yqYl3ryTOj1_pJr21r5_ZxJZfv9Nm2G78ux6nkQRyF9K8RvnowvXoeCX8El2kdlvbx1IuX98kL3ufIvTts1ua_Z_11i1tb_h20O75J1u12l19r3er1W498iv1x5v1eAX_Bc1s1P0pc923e92dc52grN2s1N2aJD2gJJ2u1O2nJQ20rr2t1i2yv529J5262X2jc12de12pc127e1271C413il64l79cJZ6QiyuHvg52C41vOx55ip1v1_Be4DBe5Co-ZMBr5rSKZ65uBMHr2mfsSmfw5JfsSmfsSmfsSmfsSmfqPmfr5r9q140c5ruFgc92ld2J9c9vl72FgZuvaQ2Jg85x5GuFg5E_Z9_O-ojTUx1eQ22Cu_Geo-JkYPa1Twoj52BbXbEcOD0J5XS6JL1SINbJ5dS16h1qtf_n43_J8vKgLK21gtGrit21k-2t0C__N1O__B1gO511971ug1111218K_SJri23J1ov3Ar2uQor67or6I015I2J51pJ6vpJ5ILt-Xr1Qyqa1I1wT61qpX_Nc1uclfuE1x1qO03Getpr5Y2q111r11511v1511a12J11g1i1Ony2vqy1Sx92v212vr731g1HvKpBz_N51o6HlApJQEqJO23GpX__214Hlfux9x7H1o1JOK0vgk2v1_tH4QC25CoGKufe5CyqO25uhmlbZP5tZ55uhmlwo5fw9eywQ1fqO2fsDIff5Hi6SmfsDW61gz9xlE0GgR2vl76er79G9Su29Su4gSu4gFicgs61gf6wg2uziG6caa2egf6vrir3vD9wmIxx9VnvOZpAaf3zlOpFli1g12p3iQp4B-BEYURFQTyzYzQoTFoWykQGJCx6i2qSi-MzDOywQOiP5S0A920qi_p4BBQh4j1151tK_T1NT6sv1c10m1j5an1a9u1wru1qao1ego1aO81qT81sDo1sT81sN0kJQ3m1a2k1a2dJa22r11r13r1p11X1161oXn3rQngROuxJD3gvD2s1D24rNqwHpb5UNqBH965IX1601aT2r462rz4JO43G9a3eXh13_mHlarCyr25zQKfnSmiWSmfnDCtqNg5ySmiWSmfr2miw2mfr6mfsSmfsSm0er79G9R0xlE1Jg82vl79G9Euwr2u4rsu4iG6Hgs6egw5vtptGvS9GNSiZOVyQW294gTtJ60lQ9w3QA1Ys1TyQ2fQ0T2ikpGAZJMyGvl1AOgFJdxucPeXpR-D_CB__N1tK_g1NT5919716Q1111217R-gryr2zv1yJ2DOA5X1eAX_Vc1tH20qcr2ezcdy19Sy15-u16u0WDE1EaE1rlurJ1MuQist36L715go3h482vgi5u1pv5UpzTQuHX3yQit25i04J1KZLDrBw_P5wQKfnDCtqN273_MZismH24dBe4n_lHmiw11fsSmfr6mpSD661l79G9EuwrZuzlAuwrR0xlQ0GgSu29Z0xlEue1cicgs61gz92aa6Hgf6caa2Jgz9vl72Jgs62ld6Hg4Q0cLYqTCaDCus2TrutBTf9EQn6m4q101o4vXotVohA6vj2Qj0wmuhs0yTYnfTVqytGXCpQaw3rQiu3Xe3vQJrAt-xJ5bqeh3qsa2LFvIpFzRaeri42cj0cJb72V6bd-Fr3TUr14__J2u_Na4F1ru1vg1av1111918_Cx1NQ54r1j13g1nD2es3a2eqa2z2N2dHN2w2N2yHN2pcN2xcQ2g2Q2hev2bedu6hDs1SJs1ru06r7i6153ncr2mv92hqi27Di1p1gcy2ity1Y45GlzuJro0HS46Jgi13N_Be4DBr5rSKZP5tZ65uBP16DHi6SmfSSmfSSmfsSmfsSmfsSmfr5a2Jgz9xl72Jg82xix0zaDuH9eu4lAiF9f6vlr9G982vl3iF9Zuvt0lf_fx7X01JQq65DUyJ9GvXBRJAmaLmpuaQa32yV9q4X2_L3xPSjt0deus4gU31T2f17gBjdFIY4x1sd2khk-Df2n1151jbCc1Bg50J1O17W173gIuxO3yxl2pGl2jxi2hrX2mrJ2hvJ24oz_L51Y4QW2415W44ai1xJ9t1v33vv26HS4121L3QiWoee47rCx9rOP1Jh4prg1t_Z55tkPZLD25ukP5uB5_lrHi12mfsSmpSSmfsSmfsD261gz9xgz9vl76erf6cld6er82xix0zaDuFgZuzaD0GgR03lEuwrZuziG6Hg4Pz9W50SJjduhTYnfTCcPYxOXaDCus2Tei_BPgXn7WISWnYa4jqgBgBLRmku2pqY1OgX_ozvIeei03rDFoe9o33YphKIpAt5Jyv1215I_JvtW24g1012dr4Em7r6B7gOh1WDh1qOhyHQ3qrg2kJa2wra2fri2eri2Ev92xr928ai10crXl1v233aguJro0q174vg1tFNrMyD25uhmBe4nBw5JfsSmfsSmfsSmfsD251l39G1R0c5D5zaDuziG6caa1caa6HgF925D0zaDuziG6crd1-shnbK-NACw6zvOpFvf94xJ1ra3y3OOy1i3HtBvFKBOGCQ2pQ521a5Iy4vIrbB_rmWdEr0VpT1qo4vXsjv111519tVi24N5ir1G1ih1cJQP1rTQ1eQe1aJ81saH1sJI1div1sJd1qDdteg3k1J21STp1dJ61r0Qor6O5J6L016p015QpaXw1aaP1qDx3ei58JsI2r5614eQ8J5bg2YJ7v9jh1J2425F0vhz9v6e9v649v5H9v5Q9v5z5Fiw1WD0krQ3w1Q2trQ2oJQ23qDw9vry8rg44v1KH4Nq6FWmfsSmfsSmfsSmtJ5rSz0mH6DGfe4niWDe5clCfsZ5iWSmfsDHi12bfsSbfsSmfsSm1sSmfsD261gz9xlE0GgR2Jg82xix0zaD1qlE0GgR0zaDuziG6Hld6FgZuziG6caa2Jg26cld6Hg5tD1ToxrHgzSVnQLk0xDTr17O4znR0aiitGQH07u4b5LskGQYtrrd_UWoWwsx5tBKp4OHwCSzHjmGZF9Vp4J3qecx-4eU6HTTyznjfNePAj5Zpe1yq_XzbLYtTcN11r21_El5l1e41511za2lLwl2k4g2ke52gJi2Qwl2azl294lJuJpa1v6c1v6w1v5CrF11J11314aX03W4i5iQ64c_9161915v01Sx2zvr93r2l3qr0p1Q1GrQra9SrGe43vrr3D5N2xD77vg1tFN_5tk6FnZP1e5qyqMmlwFMBe4nfsZP5tFO5tZlfnDHi12mfsSmfsD2fsSmfr5a2J982vl761gz9xgSu4gS0xlEuwrquwrAiF9d6er36erf6clS54lAuFgDuziG6caD2Jge6FgZuciDuziG6crd282WnPT231lXo3OX5ucGhclXpGOC6Fl-m1l21JiXpGJZ2Jl2E4av1zvIpFv51IBBStB-0xmfaWvXy3JOIqTOPj8Wr153rqOXy3P2_KC1cdYXoBv26lTgtqPsy4vI8N_q_Kz3yKVk1s9Iy4csYJ111r1X_Mg6IvrO14i1vD2anqQ2ncD2jeJ2ccO2m2O2seU67v0I3r6W1v6R1r6s815OrJ1S2vgWgv1nr2Vr8U1n22Xg4R1a1ergy1Ni1rH141M944rluJg93FrTuJ9ou4979e1714_5tH4DBe4DFnD25ugIfbZaflDrZWZPywDK724nBr2miw12fsSmfsSmfsSm1e1c9xlE0Jgz93lE5wrZuziG6Hgs61l76erf6ziG5wrAiF9f6cae54iG5FgSu3gSu4gFivdL_QYxwsrdajw-MEs4teC60eNx1FJbuYjHyxJV4JnRQzTx7wJUnJuc_8aJu6UWMj92y5t9gHag9JQpJRI5hjX3W3S5iesp_P4-Tv5iRnrjh2TYuJ4___-7__O3n1sQ1xg1Sv111rl1zKVY1111iQ1Y4Hvto3NgoGJ5wG2to19b92NOoG1Ko4NvtGHt96NvkG2_98NO_G4_o1D2fsDH16DJ__N1qK_31-a6h19E1lD1115719Bx111ar1D31rXSsr9213lC72cdpFrDpFw__J2u_Na4F1fc1xg1av111rg2enr112213J9906a313ln31cdpFrI__N1qK_31-a6Xr9E1lD111571afg111rr1O24xPs1r1L0evgsxODp___14z_SvdL2n530v8r11122J661oX1111rr1O254Ys1r1Mu35csxODp___19F_RrqM2CJ30v1T11122J3y1oX3y11yr1Q_qwMsg5Wvsrr2fw511r1U_LQ7jvfI15r1hQ1A1JO2pJ9281922v92pvNV4J015egZtQiW7FldrGNT1qvW2JDX15gg3DaerD1tuD9-uGs4ir90Lt_vP1Jtq1Q513NFpF_P_mBPSnDrC15rZKZiZiSm_nDr_lDqywQ1fw5JfsSmfr5a2J9z9xgSu4lAuFgS535x2Hgs62gs63ix0zaDuzaD0zaD1J9R2JrSu4gFicgFizgFivrFicgs61gz9xr89Hgfuziv11hUb0wr9zhGb5lM_UujS25ykqT-3JXf71yV_IgBo4kduzZFtaJ2i5JUyFOUebBTeAO44jqj1rD26v8bCKo-XxXztFP1OYnx1dWrXhizzxqZyGQtt1NHH4pt1ri278T21TaPyHX66zJIpzJf1fxMt_Bn__N1PK_X2pa9rJ9E1w51115819D2o18312h14QNO1r5vo6a213NV8r2dpFrI16DJ1151dK_T2oi6NJ1M10S14ZlS1ruCiJ5NiJ53jxJ20kz_V52w3JC963a2hqi2e2N2iHN20eN2dcQ2qeQ2yHQ2yvJ2jJg2dvg2qJg20q52yvT27rT26rv1pzNmrJXZizXrrHlyrGNk1eOk3xlcuGXotvrpuFTXuv91tNZ5_lrrMtZ55zQKfnZsBr5rSLZP5ukaHlr1fsSmiw2mfsSmfsSmfsSmfsDIfsMmfsMm1er82xix0GgR0xix2Jg8uxaAiF9d6er82vl72Jgs62ldiF9ZuzlAiF9d6er82x5x0GgS52iq9w9fuziG6Hg5OHTlowNc8cTwakqnQ23k1w1u3GQZa7qKz9J9aseBhEOAj5JlpwJE__BYFX-pGPO2sd1M9Fc86vT5DqXb9QP34rUYECXfiJiNpQOa7cQa63NKbsCzuHHpy51YpGwURCKe1gr29r5B5FuDi___19f_HJaY2kO32v1A114__J2o_MJ501fd1vg1o111__N1q__l23r8yv9E13J1115819X11v8d12e14r92oDms1v51yaOE1SgIu4rIut__16B_x1ar2nO32v1P11111v1h_-D8LJfS15i1ar2rr3Mpe6Y5jQr4wQuprFS44265y12wixrjy2c4oW0ruJroaGlZ9rPqqzl-q4M175iX1v1_Bq_PSnDrMyDrMyD25uwPBlF55uBMZiwPBnSmiw1261l79G9R0xi79G9Su4lAue582xlE9G986caa1caa2Jgz9xgSu4gFizlAuwrquwrR0zaDuziG6zicicld6e5AiG1f6viD0Ggz9vld6er46ziv2BLGQb9Js6XR5cuO4cedadmJq32551PrsiQIy4vIsxaO3HvtuxOWWqg3p4il76Tx1a7uEOhQaiiGmr9hx4X2kJ88_fcv21a7OenfFpT3dr522va2WO2b_TsbC7uTy3JIy3DScWN2nS_bYcvbpFQp02Nc_xD4hZt-VIs3uvvEoSZ-vri11191it_E2X175r251691jQ24nal2yQl2jQr2s192hr12ev2d119iy5S4qFc2y21Zewv1s35X7DiHy2gX53g20cXoaF5Z6QiruFm0tD5N1xJ3wwN9311_BwN_o-ZsBbZP5yr2SWZPBbZP5uBMZifPBbZPfsDHi6SmfsD261l79G9R0xi79G9Su4lAuGgR0xix2Hr72Jgs61gz9xgSu4lAuzaD1zaDuziG6caa5FgFicldiFgeu4gFicgs51lAiG14u3lE9G982viG6HgF91n1IYkHi6en0H9wk21u4QFiOdm4urrm84vOpFvl8vipy3JIy1vZrAnSGS92yqOIy15Xu10THEesKQmj62gcq5aW1dN2O-sAhvr62I6ZOhya1ra62TymTYPwo4vXo6qlTCSCv17Bv3OXy3O5_cv62rgN1hQIy4vI_zaq1_ZNL5W13oI-xv93111213I_A1gG2nX1wr2fr4eEw166w1574r5wqQiYr5c4peMx74lboJ5Kr3Q2prOX2Fl1wHJo21Py5A0p4Fmiq4lYuFl314_P_mBPSnDrCyr25uBP_mHmFsZMBe4MFe4MHw5JlsSm1e982xix0zaDuFgR0xlE9G982vld6erd6er82xix0zaDuzaD0zaD1J9R2xix0GgSu4lA6Hgf6ziGuziG24iG6caa2xix0Gg89Hgfuziv2xX58rHapwJ27vr47zpRl7eqoJXy6eDBp51o4clg1F5UAZSe7HDK9ZCztzZFtaJ2i5JIyzTIqYUdwQl44YB01ki2NbBBKSaDo1Q0I_f6rfJDpzF8xGqu05rHrzvO4FJtilrGzJ541ecV1q1swxQb9Ji351J66zOOpFOi3J6-KdJ1__N1Tb_J2oJ9rJ9E1nX1115819D1N18312213J5miSa214h293edpFrI__N18b_j2iQ8MJ1E1bl111581uT1118312213J5mt6a214JN8qSdpFrI1151n_BU2dQ7112t1461729X9q5-ezc0gvmetzvGa5D3y102rG5l5v1KFwFPtFN25ukP5ukPBe5Cb3NgBw5J1er82caa5caa6caa9G9R0xlE0Hr862aa6caa2xixuwrAuq9R0xix2xixuwrZuzaDuqgS53l3uwrFiclq5e18ixrFiclDuzaD1zaruFgFicg6jeaQ4Jmc8FQN7GFF1rTNpEO39WProcuu5Agp4v556dem2cQ2e15ur_Vi3HYq8GQTtvdo92PVN9wMM9rsaesC3JO21vao7cvu5Qaepwn-5wT01J98eH5QiSQLf6JL1blV1qNxj74-xtZL_Ols22lII3Pe1a2e1mSh9zB__J34_-96q1f71vg101111191E__G27T6Nv1U14v1ra1Rhr92qxPjpJ9Iy2Xt1151ycu49DiSrF640airyw5Z0quk7v9SuJg914_Pt-DKBr5rSLZPBbZP5uCmHySmiw2m1er82xix0Ggz2xixuwrZuzaD1zaDuFgFixrFiF9d6er79G966clAiG1f6viD0Ggz9vld6er46ziv27URQKDJs6XE5HuI4cia4ecWqJ5KwtJOuFlOe_Z72rSg015FxVK8hW42uR547Tu41dN2H_eXjrr62I5jWixLhr7rh8rluJvZo3OX3pfo1SHG_PVZrzr90GCn_T941t__1o__D1qX2xi32v1W114__J3A__v5YrfI1vg2ir111191dKVG2m972J1V15N1rQ1Whaa204c2iFlMwaiA1FvurFhe5QijeDixa4S4pv9q32l0qDit311_BmZ5tF_O1e4aBmZP5uBMBe4MSyFnBw5Jfqaa2caa6caa2xix0GgSu4lx23i7uer79G9EuwrAuwrEuwrZ5c5D0zaD035GuFgZuziG6caa5caa1Hld1er4ux5x2Hgs61i32HgZuziG6Frq2m9y2zQIecgu3UtMhUi5y3OIy1r8vMif1qT2j31De1Nh9qOC2vJxeKBm2eI-QzAz1w9XsWUzO5DBPvSw0YgE4FXtpFc30svvkJzF7GOXy3OLPGX67rms4v891xvRWq0Q1vi41e5XpAz-fdxY_zOe5Jpq0r9b1rrkh-4-VbByL1572vhK1gR__J3i_CD5Krh61vg1p11111518K_J2Ig71v2d1oP1n7ur1a0raW13wxPnpJ068r543rah2qQ61JaX15C3rFQBrD1Xyqlb1rgb6cN38FvQ7caX5wvRd1M0qGmk0J9N0J5R7zW5s6eah6r4iSr21WrorD1P1qD1yh1C1zQCsSvR0HTZya0as1OZrQ9M5JOc3JiosDT3tr9H1v1_tFNrCywQ5wQKCwQMoHvrSnaCtqN25e9C73MmF6ZMFsMmfe4sFsSmp_ZP5uFPfsDr_nDr_lFmBsDHi6MmfsSm0er79G9R0vi30F1R61l76er82xixuwrquwrR9G941vl79G9Euwr1uGgR0xixuwrZuziG6Hgf6cldiJ9Su4iG6caa5F9ZuzlAuFgFicld6erz9vl72Hg12IgMpaak0VG_qDv21rgraEri1ampJpJT7DrUt16JnZPtgdTSiGvUT7aa5HNDeZlihGOX3Zm8ux5d6EjbpxvFudYca8PN1f2apwmemv5y1qO31dhUQwBL96Ycqv5PqZHT_Pt-NfheuGE91zQZwOoPwxrd5yQVySaPtr5lc0XXpF8-aFTOswX-V21s05BPJQXZ_ll11r23_Mg5grfQ14X1L510a4Svtr05t15OLt-XOvM0ooz_L51l4QWj0ATR1ETe1sDe1s5i1flScFa3C1O2gvO2tkz_Toig7wgMLt_1OHrfuzAX__219e1wux1Mr4SJtriM8qaXyJ1riG1F1zit2xN71vgwy121tkz_V51g52iAtwDbrHlfpr101rQtuJ9otGNYuFl314_MH24D_lem5zQKBwQMoGO2724n_mHmH6DrStZlFsDIpGO1iw2mfsD2fsSmfqOIfsD2535x0GgSu4gFicld6HgFizlAuwrR0xix2xix0zaDuFgZuzlAuwrR0xix2Jg82xix0GgSu4lAiF9f6caa2Hg5gbAGxTVCyGP0pGgRyA_3d7ChafguivDYySlso7MadSuotZmsozXL7GOx0hyiS0S-xpq-1k8-0wm7mxQX0q9c0w01TRe7r1rGp6Tq1JaurDcmrFOA8e1E8eQk0EaMyEhKYmu-x112198_F1sO2vJ1e12FPDg_1d5B1r9BLt_rOHihq4LX_-3F5e69yBz_J51F3JC96Gvd7acb6ANfx2l4wcl2tHl2oel24Fv0rFNfy1u78wP4ywvRewOc3JJoeem41z1314N_Fe4QMiD25ukPBw9rZKDG_nD1fsSmfqOIpGPbfw5Jfr5a1caa1caa1caa2xix0zaD5zaDuFgSurg82vl71Jg82xix0zlZ5zar0GgR0zaDuziG6caa6Hgf6caa2H92uzlAuFgFivsO3vrty3OIyrN41zW_xwdfP40W0xNIrJ929JO22rrXpGOX2ra22vBA1d9Dqsgc562W2jP1_KH1qKBjqW_-vd1Iy4vIgr75gaEhzsgmwX30eio-_DUeu4vY4J0lev5wVc03u31Iy4vI8F5_5gFrB-a2kr6wiAuD0QJ1__N1vb_i2dJ8MJ9E1nJ111581uT1z18312213J64asa2166eor2dpFrI1151Tb_J2oJ71v1G17s1yA9L1drO1wD81qO81dO61qT614rkrG2472aX5wvgi1OXv2xr7p1g1HvFi41xrJOo8eio1JOFo4lE1cD314N_Ce4QC25Co-aCtqN2724dfbSMHevr_nDr_nDrSOf5iw2mfsSmfqaa2xix0GgR1xix0Hr82caa2Jgz9zaD5zaD1zaDiF9d6erw92iAiF9f6caa9G982vld11qNtqW67G-bH8DTq1522c2qh1JahGOX3J53IZhCpxvFudYcdjAt1hcapwmeznv2816xfT1_Bx2jgaT2oaLy1zjuRzvIabCw1sbT52aQwLZhuwfMHr1212R_VvaZ2ba1uJ1-r3gn5QiRy5Nf1fNfRHl3r2mr6J9f45iS15i7y4aC4wlH1x247JT33v1_t-D_Br5rZKZP5tZnfsSH_nZiiw1W63ix0GgSu29Su19S2G9Q9G986caa1caa2Jgz9xgSu4lAuFgSu29Su3lEuwrAiF9diG5G6caa5vaZlD5s41gpn5f-B5aWtH1oeSwqpzW6lrM63HvtuGTWWqg3n3TM5pZ4txuefr6Dfda2Qdi23v7fKS_-cs_hgRrCpDXy6vTKT6N2nS_bYcQnpzTpyxIt_iw__J2J_VD7JJf-1vg1i111__N1Et-P2kQ75v9713O11t__18w_JJgi2nO32v1G114__J2Y_MO7Z1gv1vg2OJ11__N1ht_T1-D79J9714i11t__16I_V1qF2bi32v1E114__J2D__v6PJfL1vg1uJ1111518b_j2iQ6Nr1K18h1rDOgdHcI71ik5qOe1Qa71d9W1wTd1s1e1w5e1d1R1qlq3GO1ifNb1eNj3F1v0F1Rr3l45ql20Diq5xDurJvoi3D38r91tFNrMyDeyq_PfsD25ikdHsDrSOaeywQ1fk13O104asxGkGl2fsQHi6SmfsD2fsSm1er82vl31J9c9xgSu4lAuFgZuGgR0xlE0GgSu4gFicld6Hgf6cld6FgwuzlAiF9d2iQKrJtyEYK-nqJXq66ek4ChIwOLjX9Q4FXYoGikudQxqxJQjaGh0QgbtxTM2gJPsfQ8_ck-R_Vky3Ho5rDu97UfZXSLTi0582TYtqNYaCXCnEWgxBT2m5jte4I__J2k_MJ5-1fd1vg2iJ11__N1et-O2fX6Nr9714O1111218K-A1g12v11rr1Gr2J1rJQTrG1B1wP49Fvgrz938r9zuJXpyDiTtJJp14_PBw_PtFN25ukP5uHmBmfPiw1661gz9xlEuwrR2G9R035x2xixuwrZuzawu19Su4iG6H9e51lG04iG6FrAuwr3uwrZuziG6caa1car5Hld6Hgs62g714vOw25625s2nKBI_zawweuE3vX387ej3eQ2e15ur_Au3Hrb7QlRu2Tt1dvRo1f6pFc65ADJ015641m84xlAsv0jg16MfAcv_K4McKB86rrfpUDIz10YzdXR9FDYtKBQq_Bo_x5j1q5Whqyo111217R_Xvex2vv1u11Br3068J5Ey1OX3ai1ucm485iby21e1e573FaL1cT30Qio9zlu13_PSna_tH4Q1mhmBbZP5uBPBnSmiw12619s61gz9xgSu4l79G1R0c5DuzaD0zaDuziG6er76erdiF9ZuzlAuwr3uwrAiF9d6ers6vex34vIpFv8lQF-KY3x6vTNpEOdIKNUrFNj2rXXpGJX1rtTE_AwEGOXy3KsMqhGvr5CukNS5Dgqpwk9ul5SSXXj7cEdyWl296lOuFlOaTn81151g__J2Ov7112p15P1oa04yDu89FvPrG1dy20474vyi4vvy4v_eJ61eJ68jaJ_1xl3619SrHS42rT33v1_t-ZPtFN_1e4Aff8MZyZl_bZP5tZP5tZPiw1W63ix03ix2xixuwrZuzawu19Su4iG6Hge51lG24iDuzaD1zaDuFgFicgs619s629s61lG24iDuzaD1zaDuFgFicgs619s52ld6Hg7G7Rk_0wj65JwhvTy1cHQsvDh1s92qWiy629kaGlD7ca4av6uaJOa5cPw0Frj4J5936mR5rm843QVav0jfJ6Mg7cvJtZ2_zDd53EIpCg3sYhn0wa-p5k-CDhJ_zMJqD94pjXIWv0dWWXWuwXTeKBReKZ4SH9I0v111r2z_Pv8mJg116D1da1C2wv1y6lXeG5X0aiRy2S2y4QXoS5XeDi_s5Ma1zMafSe_s1i1s22a1Webwv9A1xi3raiOrJia3vJp14N_FyZPtFN_1e4nfsSH_nZlBnZlBbZP5tZMBw5J2er79G9R0zaD0Jlx0Ggz9xrz9xgz9vgz9zaDuFgS5Fr3uwrFiclq5e18ivrFu4gSu19Su4lAiF9d6er36erq6er8ivrFu4gSu19Su4lAiF9d6er36e1w6egf6caa6vmZy3Pi5ra5eq5Mr2SS_xSDnBMV65JwhvTy1cHQdvQh1dQ28Evy62XkeGlD7ca4j15cjrOa8cP80Frj4AQRo1w6pFc65ADJ01531Jl62Dly0Fhd1WYv1fSbj74-NtA7_Ols53UUpXJ3jgSL0GiMpwB-C5PO_zeJq4X4pUDIz10YzdXR9FDYtKBQq_Bo_x5j1q5Whqyo11910K_G2jv6Br1U14v1t51WqxPjpATI1JH4uaiHrGs4oHP_7J9k53OX14TKrGaguG53uwl73v1_Bw_Po-D25uBMZiHmBnZMBsDHi15a2Jgz9xlE9Jgz9zaDuFgSu3lE0Jg82xix0zaDuziG04iG6erwuziv6Hg4u3lE9G986caa1HgF91dTYC8Miseb0eiwjJXw3JJ37huYrGJZuGHu1w0uf20s0J5GxVF8hW42uZ147T061dX2H_uCjrr62I5mQlqGkO4dd1531FvOpFv7x0R-V1ullKBnPQiD33lLfKV31___10K_Z1vN2nT10v9111122J1O22v1111rr1Tt0_1R1vNrN2131sSmir1310K_NveU2nT18v1O14W19QTbdcMU8JiirGW452u46DiWrHW452NX13XWuHQs1xQZ2vT1t-D_o-D25uBMZyZP_nDr_nSmiw1261l79G9R0xi79G9Su4lAuwr3uwrFicaa5FgF92ld1FrR0xix2Hgs61idiG15jUnq_w2afxgw5AOy5HWQk20g015FxVK8hW42uR547Tu41dN2H_eXjrr62I5jWixLmJ7HmX6OOtBE1SHG_PVZrzr90GCn_T94111216z_NJww2mJ1yv2Ir3J7ur6j5J5b5DiTrD11a11314JF34Oo4Fl53FOJo4lZ1x6485iwuXNTRGv3p11KfnZMBw_MH24D_lr25uk55uCmBbZu1o13O104asvkr251i21J1QTOjxJ3erMs4Aat1SSmfsQ2fw5J16D261l79G1R0zaDuziG6HgFizlAuGgz9xgz9vl79G9EuwrZuziG6ziG6GgR0xix2Jgz9xgSu4lAiG1w6vwwPkBG_PF6owTY8eLwV0y2n26t7Gyq07JZ5H9UuDugzxqq9G1N0f2_JjCm8q1Tt3xqNv61KVJ3YKfhCginixv_5EplQhD42er7tGc472N61NmVxDvdtGvP8Z8_1yQ11v2e_Ni9P1g21411r12Dr1NsyqaCewWsydaC2daM1wAX_-c1y1Quq7TS1wag3vS9yaiYoJQ23w64159fy2640aizy1S48a50uGW44wlW0waMuJro5JP2uwlP1cN314N_Be4QMyDeyq_M_nD25ukPBnZMBe4n_mHmHnD1pSDIfr6miw1251i39q1R0c5S0vl72Hrs61i79G9R0zlquwrw5zaAiF9f6vl71FgZ6zlquFgc92ld1FrR0xix2Jge62ldiF9ZuvxDKmb-UKBEHm24cEo16rhlpHDv22ri61ebpcJv1vTqgIuyEzV-Sv5v1aUvYNHIhKwDUCGtxiKFRTD4lbVE_LI-JUEF1eD71v5y6FaSwbBpfeOnir5JePQ28v8c6d1h8w4T_zir5Jr51qZyCCqj_IwKgsZDXtBGJfWGMmO111917K_k20g72r1T14O1UD2H5F64ir9j5GTw1WNHkF53yz52oz523z52jeO2dHO2pcO2g2i2aei2e2i2t1T2pJT2ewi28Ha_6dNs1Hsg3aWQ6r5p521auETp1sXp1aOp1qQs3Qiz15i7rGS49FDFrH5ht2aspaip3xD43JXotqS48J91t-DrCyreyq_PywDK1evrSOwP5uBP_nDr_lZ616SmfqPm1qPmfw5J16SmfsSmfsSmfsSmfr6mfqaa2xix0zaD0GgZ21579G9EuwrZuxaE0GgS53aAuFgZucld6erq6erq1GgR0zl72Jg82caa6Hgf6x5GuvqdyxOIyra51KCW_YJv0GQM7U92gUCHW17dfTv3BDiE92a7Sr5p319HgC-eRzaJy8N211XBe3JByGJSQ8H9l_Vc94XU0344KwuhlCl2uPlG5r5q2waIyg_MGXSt_Ol375wIGXg5326Ln9ORy49be191__N1i_--1_a5619715r1111315F_Hrr92xJ19v1J18s1wsiK1aaK1diI1sJR1aOR1qTRyxl3kGi26eT2ec12jvJ20rg2eqD2qxa28zv19DiyixW4i1cr37191JcJ6v5diqDZ5vOH24ln919WuJvp13_6Bw_sBe4DBr5rSWZufnDrZLZaBr2mfw5JfsSmfsSmfsSmfsD261l79G982vlAiF9f6caa2Jgz9xlE5e1Z5zlAiFgZuziG6vir9G982caa6HgFizlA21xs6RB5fwi_j0b4hSeHbMbTl6CTvuNUmEJE5zJLe_zqzS67yQ6Kx5QM2jmQorhEypMpIY4eXj7ZHpr2715y_15AyrO24Sud_2l2sgsHE8sqfR2b11i1v__q1BX5711m1411tr2Nr4uU8v5ny2Tgiwv1tJlXt5iCrGaX11Jr419itcTjl3O2pDcJyr6Kyr5Cyq9NrJrotx0461g1t-DrMyDeyq-J1I13rS6gLr1N__e14e1ruzW1521A9vJr54gIpGOkORNx1sShfsZPfwQMoJ5g5uhmBnZMBe4nBmw6BsDHi15a2rgz9xgSuwrwu4aAuFgZuzlAiF9f6caa2Hgf6v5D0Ggz9G982caa6Hg86ziGuFgwu3lE0GgR0xl76eaQ1BB-Coo_0Dlp1rJ96vTPt9GcvCEdw5st_KPaqQ9Yw2O22rr3yqCJiA1_wFS40DHb6rr2Lv56PDJJtxj-1J9siz9M0eJo2vTtwWLfz55cqWr2z4DLprixw2iXoHD74cK-cFgJ0vX91r93e3_45J111r37_M94Urrz13i1oQ1l91211711v115O11213a0rHW44wvw51OQ3wlk2v1_Be4Q1mkM_nDrHWSHiw1261l79G9R0vl86clq6er79G9Euwr40xlEuwrFicgFizgFicg4Us9WjFeBl4Xk3rOty3JIy1X241IRyyiX6SOfpzg4LDOs3rl71r64xtCtI3OXy3LR1k5RdWiLW1O9yv111v1c_KT5zJrR14Q1eJ2er3XVy3C4rwJX9a5Xur24l1Q23q1S1ws06FlytQimq4H40JgmtWOy1Hay3zs2uJQp14_MHw_mH24MHw_P1e4lBmZP5uHmSsZP5tZlBe4MBw5J2er79G9Su4lDuq5x2Jg82cld6er79G9Su4gSu4gfuzlAuwrAiF9diF9AiF9f6caa2caa6Hgsicaa6v570H14uzicu3lEuwrA29NXpAl2_mabywXk1r53y3PT25iJhxrka6XhxqvEWx6y6JJo1vyy2tVL-Q7x7q92R1r340JIypry9cDy2vg28qXC5xJZW3jd0z5Z2Y3AcuSmw1vurxucoIaPwRGR9ArYTJtp21w-WKBg1xLjnQOIIJ4__J2f_M95yJrs1vg1q1111151rK_E2er50r2j1om1mvWw1arD1wlD1qaD1egD1faU1drm1wameeD39HD2jJl2yvmp2J9I2J5VrDiobGv2p4vjrJOerHaXsFv_3J6r3A1o1vOodSHt2r111r2lv3Vvov9L8DuJ016t015QdSlTsGvVuDiZ3HTjtcio9rO43SPo2zX7ivg1tFN_5ywQC25CoFFPBwQCtqNK1evrSWSmBlem5uhmHlre5zQKff8P_nDr_nSm5ufPiw2mfsSmfsSmfsSmfsDW61gz9xlE0GgR9xia2Jgs61l79G9Su4gSu3lz9vl72Jgz9xgSu4lAuGgR0xixuwrZuziG6Hgf6cld6GgSu4iG6caa6FgZuzlAuFgFicld6erz9vl72Jg86cld2erZ0wNf7ZE2pJTa1r554DYk3r5bpg0C7cv_04cSlA5Fq4N-yxJQ9DiP73gfuqex36DRu1hQ0H5-0cvPe39Qo4T-tGT89qWclZs503S2qUAV1qPes3EE6DYqilDJezUVIQY2oxesIUP10p7yecXa5walawWh0JyQsRTK0wtK1xQevW1mue5a8QjyfJJM8Q3UIv111r2U_M547vrK1451fD1ZuqJ20xJ2k292dvsU2r0U916W4r5J8zvL12gE2H1X14iJi2va632J3v5p4ai43F0_9J5z95iU2v1__lem5twMH6Dqyq_uywDK1evrZKZlSirrSyZ616Smiw2mfsSm1er79G9R0zaDuziG6ziGuzaD0GgR0zaDuFgZuzlAuwrz9vgz9xgSu4lAiF9f6caa2Hg47IElbWU4yHOTTwJZgaOjlsXJ6aH08F82odJQ0FPKgQVtl9eJmr5TRIQbod9ktQWcy5QR4cNjpwTs31T96x0emS5G0aaMuQ6ycpSknJ1217t_HveX22T1i14pr40spr5vpr6O5v5C5v6O516j516o4v54y1QX44vLicTX0aixuHXH13sr0r9w0d1WN3a40kz_U51K4QW40r5Q0wrW1xad3JgoirNyfJX3_JX24EvtqrCg4QQm4zOyqJX441X24xO791g1tF_ufsDIpSSH5ywDFsSmpSSH1e4dBtFP5uBP_nAJ1I13rS6gPrXJ5HlA4Iz_Doit4FgWLt_1OHlfuxdX_M3F5HrA0kz_Xole5zgWr1Xtuv1IpGOIpGPhiw11fsSmfsSmfr5a2caa2xix0zaD5zaD0Jg82vl72Jgz9xlEue141caDiF9f6clwuzlA5FgFicgs6295n1vCpxOC42uVuAYRx59SyxJv9JToh6ay1vaiWVrFC4P4pzQ91e5RExlUywQUrr53rfPKP5n9d8u6uHljpJ5m1wa2rrcEg1-A_v-6GFN2oDNXpA_-rr4__J2z_Ng5n1gS13g341111rg1Acr112213J5vtsa214DM93PdpFrI1151vb_E1NQ50r1C19C1fv1A1b1A1rTG1sDT1aJT1wOT1dX71dX61sN61aiG1dJT1w9Toc11i12J11i1yG247Dip4QisrJ1A1q1Ai4h1uY1A24gpy21g92vJ781g22vVuzgxuJTp8e9o1JOVpcD1oGNrCyreyq_PywDK1evrSWZMHsSH_nDr_nDrSWZ5iz0mfw5JfsSmfsSmfsSH0er79G9E0GgR9xia2Jgs61l79G9EuwrAuwr3uwrFicgs62lGiFgZuzlAiF9f6caa9G982vl72Hgf6vt0tGm7ufm_0rYL1r56569UyJvyhGTV2HOLnzgr7QSG03lGe4vNpvab0EeLlaJTiTVYOJ5cs5XTY2meixQKGw2b1fHvvwrTqmX9hqaBT25d05-7dJTC8DnzYJ1212B_Arqb23v1r11_r3iyy4c443Y45WXm0JJ7y12445iBrxu47rO43D5Aoe9_4QiF2v1_BnZ5H24QMya25uBN_yDrZiFMBe4NBw5J0er79G9EuwrR0xlEuerw2xix0Hrd6e182xix0GgSu4gFicgFizlAuwr3uwrAiF9f6zidiF9AiF9s619s62ld6Hg5RFvOpFv62v542504YCD304Z2qFc4oGgaqcu06JJstqDjpFgrkUTWQxhK2ri22vgNpFvXpG5Xr2cebHN2OrQ7pjlU_OeSJeNEexaD8EQNWDX2y5DPuvi52eHvs_VEsZYq7aiV1151ot_72jr5p11N1rC1OZgD1dlJ1daO1hrT1aTE1qOQ1hrvY313jcJ2gcv2h2l2zzr2a3v2e3v2dvO2erO25vQ2vra2c4v29Fv223Xaov0Q0v7Q916E2r7I116Q1159115li15ui15z6J7F3r6D3r6P915v96rl1eJloxh56J5f6F1118r61sa61wr6e1a32rsDy9rX1WgX1wvG3rQs4w1JtwCvi16mi16K6J6K3r5f3w106F14pc5o8vO43FDA2xT714N_5ywQC25fyfDKb3NKfsSmfr5e5zQMoFiFiGNFiSSmiGMmfsDFoH5FoSDFiFiKfwiKfr2mfsSmfr6mfsSmfsSmfsDHi12mfsSmfsSm1sSmfsSmfsSmfsDW61gz9xlE0Gg42vi72Jg82xix0GgR0vi82vl72Jgz9zaDuFgZuzlAuFgFicld6Hgw5ciAuFgFicla6H9q2jrN06gU3caRewsJ7cTb9qs1ueNois647xm833rktWXNd1gh7qgI04aV8q9Eo6C-drJc0DCQ0vDGWH5cpYQUqZO2dTR--D03wF1Aoc77Xv5wj8zFrfDCafyT-HWLkYgJpwa-Kmz--v5p1e9ZjWF81W4-GKCp1151q__o2155aJ1N15H1omrDM4r3o4v9y4T-pQiiy3rh1eQMpzliuJTZo3JD1JOw3FSru153u1g_9J5z2v1_lzMblc4QC25Co-ZMBr5rSWZPBe4nBnD1lw5J0er79G9Euwr40zix2Hr82caa2xix0zaDuzaD0zaDuwgSu4gFicgs62ld6Fg6uwrZuzaDuziG6caa2caa5vr2y3OOy1sp1LFl3vTZo3OX5Jg2y3OOy1941bg26vr5y3JIy1v9tGJZuGHu1qg4uzWKjFDOy4vO08DQtt5Nr8YVr3JZuGH9nXvByrP2t6MRu3OXy3OSGFhP_WN11v26_N95n1r-11D1812er4hs6J6U5J764r574r7h3v6A2v5Y1zQ31caheeWW7rij5aTejc544Qi18cs432DhuJro8e5Z41g1t-DrMyD25ukP5uBP16Smiw2mfsSmfsSm1er82x5x0GgSu4lA9q14u3gz9vl76erf6ziGuFg5n9Uc_KZaW0AfUr541b4rvh-jl7WksXyghSN3j_b0VfA5DKbiCKXPE8pkQB0XqDnkzJ121uw_S1qz22g1ur2rr1JorF243rgX15i0y4yX_N219rNqq4iZ5wvQrHagy2XZ6wcJ9r5c7JO43FgUuJDZ5aiP2v1_BbZP5ywQ1mhm_bZP5tZP5uXI_bZP5tZPiw1W61gz9xgSu19Su2ix0Ggz9vld6Hgs61gs61gz9xgSu4gSu19Su4gFizgFivrFicgs619s6295TFvOpFvj33nYv65zjJ9i3c9Xo3OX5HW6uGqr0sg2dWgTyJTktGOXy3Pe1a2e6v5a1v9yek3jdz41iqOXy3OHJ42m1f6muDls2wOTrbBNrso-K14__J2Z_kO4N1eo1vg1aJ11__N1jb_21NQ50J9715g11112158_J1yp23519r1Cr39b7v5j64v93zvqrH11l1131219i1v331vz41Ox65i7uHD714_PBe4Q1e9CoSZufbZP5tZufw5J1er79G9E9G985caa9G9EuwrAuwr40xix0GgSu4gF9w9f6vypuGOkjHOno2hUp4O7636nsG9_uqO3wQTci1yCo4Q62KZHKivD0Gjg0Tr2Fv9i6QgUt1Nf_____tAM2115519716J1111416fMLJh425O1o11V15J1ID1_kQi2w5i2e4Q2rHX2ueX2kHT2jeg2saQ2dQ52swl2dxMUoJ9Ry324iDiB5zvyy1gXuwvByDaPy811J14v11i1Lt_1r41p4Qv1wQaXi2cJ719K715gwwaZ2zOZ5QQZ61PuuFl53DDFtwlv0GNZ9xQ7rwll2vO1oF_PtNwPSmfMHe4DBe4DBmfPSnD25uhmfnDrSxPmBe5Co-ZMBnDr_bZP16SmfsDHi6SmfsSmfsD261l79G9R2c5a2xix0zaDuFgS2xix0GgSu4lAiF9f6clAiF9d6wr8uziG6Hg853ix2Jg86cadiF9Zuva30GgR0xix2Jgs62ldiF9Zuvh4lRIrh8v3uGOIuJ53hYo8lduYmNJSuz1J4A1RurUOQM6beNqFdDTZa1SPkfH3yKSY1vDGiFDAlFNDozWLQQlq1mfsz0lvxbVIpFQCpA3hHFiGUhtrShEK7cTjQ4vR4dmAK04R1dOY8QFz-xYlas928o5W0qYXgfSCdR045b__14Z_S1e_26532v2k11111r3H_Ja5LrrN14D1aa1Ft5iYy3XXi4mruJ9Z3Fvv1D14a1i41FNdrG0494vJ7R1j1cT-i1gm2cipt39EuJgr3vJp14N_FtZ7H4N_tJ5rSWZP_nJrSWZMSsZP_nDHi3aa2caa2xix0zaDuGix2Jgz9xgz9xgS64lA5wrAiF9d6e146ziGuFgfuFgSu19S54iG6caa2Jgs629s61lA2oQuy3OOuJltq6CzrQ4_r3vB5caZo3OX9aYmifehqJgo3RgYtvge3JY-e3dq0qOXy3Oxd1g73zJT1MBL1lJOuFlO_bf-Dvl61Ji3a80o1qWp1rOXp1NaySc6_LY7nS94111215K_F1td2591or29r3zN7J76416W7r5my1vX2zcJpJ5IoHaXl1D24qXhrJvp3vN43GXE2vN714N_5yreyfDK7iZP1e4dfnDrZWZPBnD1fw5J1sSm0er79G9Euwr42xix1c5DiF9d6er76e1f6ziGuFgZu4gSu3gSu4gFicaa2caa5vtdy3OOy1hVOMqMjxOX2z9Lx4Sdf3152FOUjva7oGJZuGHe1rsf1qr2qjrZo1OI3_BZsS5UozglKcQaa2iUuIlkdvCF_vD11r2I_ND6JJrN15T1wQ1HiFvIrFgA8DgXrFvr1D14g1uJ1Jr4w2u48Dimy31fl2l36DP92xD77vgNrG6451Tu3v1_t-ZPtFN_1e4dfnZMBe4nfnZP5wQK_nDHi15a2caa5caa2caa2Jgz9xrz9xgSu4lA5wrAiF9d6e146ziGuFgfuFgSu19S54iG6caa2caa5caa2cas6ziGuFgfuFgSu19S54iG6vf46JOp7xsXOKDNOxlN5caCpxTC9aYm7QQ-0vgo3RgYtclo3QYk7QQ-0vgo3RgYtvto68DWebBUexp09RTTy2iNp1zwXv8gpzQCpKZA_P5821921W6HqJ5Yqv5oy3vabqs6_LY79TTc2Jl51v53af6o1qWp1rOX1151j_VF2Qa5t12f17e173S40FlXy2M1y5aXwrJXg1uJ1B14J1i51Bz_J51W3vS91SQsrG648Fvv7f1hJ2Q47sc82xN781hwuFC49Diq3vgt3v1_F4_PBnD_tFN25uhmBbZP5ugIfbZsBnDeyq_OBw5J0er76er79G9R0zaDuG979G9Q9G9EuwrZuc5DuziG6car1HgFizlA6FlAuwr3ue1Ficgs61gs629s61gs6egFizlAuwr3ue1Ficgs61gs629s61gs6wiG6vh63wOTp2Jb2cmf7ooMto9Rt29syqTUyq6pfeY0txg73JYApwXf3JYpdZYw3JYApwXf3JTDp4JMiIDZoFah83NRRrXwt3v9D-92A3TCyqIMMKBe2Jr31r0elaO2paT23FvT68DWebBUexpp9rl84aCLqJ5Yqv5oy3vabqs6_LY79TTc2zJ111915b_G2ii5rr1J14D1ra1TwHGb8oNl1JC4yQiq82gXpaiZy1Nq8H935z5X14NZrGDdrG97yQi53v1_Bw_Po-D25uBMZ6ZP_bZu5tZPfw5J1er82xix0xix2Jl79G9Su4lAuwrR0xl79G9R0zaDuziG6ziGuziG6Hgs62lAiF9f6vlD0Ggz9vlf6vldiG15JC6SJx779ra531O6hvOy2JT2mFSIo6lD0Huz8wpdiQlk8JDJ8nWKWN6wugaTe1525S9H1rl2rIedevg21rpp6dy5mDcBQwg73Hm8pwTy32rgeALB1zHqS8vR7rrTt-N311i1vt_w2cD5911K1611fr2Xr5J_7QNj1WNjFHIb7vur116jrFCPsFc3ed0oy50ey4104d91o79w03cx7ciri81JT414i42nfSaZwal7f4lD3xc45Dib2vgZ4aiOrJ9p14_P_nD_BnD_BwNKBr5e5zQKfmBu_lDr_lZMFe4MZtZP5tZMBsSmlw5J0erz9vl79G9EuwrZuzlEuwrZuzlE9G979G9Su4iG6ziGuziG6erz9vl3uerfuziG0er82xix0xix9Jl79G9Su4lAuwr3uwrFicaa6FgFicld2FrR0xix2Hld2HgF91gmzUkr4rORu9DfoJa52r5TorXA4WLu7dgjpUQIfWC00JT6uGAy_fUeml9ccx5621vo2dgo4cuchJDJ8nWKWN6wugaTe1525S9H1rmjdGQ4yxco61i7HHckWiDE21WjfJaufSl7_v1noYO5xBedevg31TOsgTuXw15Pw7YljoT3t68sn3lh23v_BJ911191vt_G1Cl5911n13J1ia1lpaiirGs47aut5J5w8Fvt1151oxu47ea7pai73v1_BwNKBr5rZWZMZ6ZP_bZPiw1261l79G9R0xi79G9Su4lAuwr3uwrFicaa6FgFicld2FrR0xix2Hgs61ldiG14WXYSGqa_qeJr57go4cuchJDH8t6Hzl66y01Rer5qaF122J63O6hp1vr5xcuWcRsr1qsrjWHYLr02aOMJ0G556euiXv911151kt_f1N158v1P1821qQre1wae1sTkjcO34Hl2dcuU5J9E32lwy2OX4J12311K8Hd_6r9srH1hO2Q37wlr7B1k1cP4oHi_5ANw1Hiw8JOtrJrooxibrGT714_MH24D_lrqyqMmBf8MlnSH1e4nfWZP_lZlH6Smfw5J16Sm1er82x5x0GgSu4gFicldiF9ZuzlE9G9Su4iG6GgR0xix2Jgz9xgSu4lAiG1f6vt1bgb-_VuJt4QU5c6mk9udaHkZeWCnwLDaqQq8sAan83TS0Eou1eCAdv8uCgyy0Ha-pai79Qm7nrCbg1VttwQY4w1zpq0fLgJ11191st_32L55gr1H1511mD2oh4N2h4O2swO2e4O2y192pv92nv122wDstr9jur50ur5Cy3J0izv1rcCx9QiTgc644FvdrrW4o5iTrJNt92rorwS421P2uaiJ2x1714N_Be4DBe4Q5wQKBbZP1e4dBnZP_nDrZKZlHnD1fsSmiw2mfsSmfsSm1er82x5x0GgZuqgz9vl72Jgs61gR0zaDuH9SuzlAuwrFicaa2Jg82vlQiF9fuzlAiG14u3gz9vl76erf6ziGuFg7XgUb_K_qQCJ3822kgwn744lQd21m1vv8dsQ73r57415wsH9At9jfGr8IHXycRf6Uf6x6EAWb1EKZGnWMcu5w1e1p6I7vo4121WEADr6_32mttqCkdF61s2mxWxJ4Fgpw_xVlmY-sPfHiqY-e111313o_AJyq22v18J1I1oW1gavU1fgE1diE1ru40v53uxg20qg2sev2rHv2g1O2rrO2sqv2jcg21DDa1r9t616w4r6k9v51rJQX9Qimodau1rDqp5iK67Na1cXa1err6v5do2ra95i03q943GDt3GJxrHT1o-DrC24Q5wQKBwQMoB13O104asxC12w_V51u4JNA3evt54g051XyuxOIpSQ2724dflSmfnZ5iWDrZLZMBr2m1sSmfSSbfsDHi6SmfsSmfsMmfSSmfqaa2xix0zrR0xl72Jg82xix0zaD0qrSu3aAiF9d6erq1J9R2vl72Jg86cld1C9_pGJ-1vi2xRS5Wx9TpD12q_N11w6_CFe85MDo1w9tsE2J1w0JtzNUywWaeA9coWQHvcXBpsV_l0_vQwHouXBMHv5o1fvu1J90rDShgHDr__N1s__q24O6Hr9E15v1115719XLgr1nr2gtpvNNr3Y1t1rtprNNtGQ_t5NUkGT71sDH16DJ118_KbCR1_X7rv2r18H15E1s1s9s1w0urQD39DD255D2wkz_L51Z3aQu6r6b6r5k6r5p6r60eQixtzmxo2m49c5XwJgry5Mq24li7JPe6aWo0QiJrFm4eciZqJgS111_t-ZnBbZP5iDG5ywnBr5rZKZi5tZlBlFMFe4MHv2mfsSHiw1IfsSm1sSm0er82xixuwrAiF9diF9Zuza4u3ix2Jg86e179G9EuwrZuzla5wrZ2vl79G9Su4lAiGgsu4gFicadiF9AiF9s61l72Jgz9xl76HlAiF9f6clq1_CidjzvuqTjdrC00eT3dfMQu6v-yqv_3rv432gGocYveqM-54OYlolu7AOkgeQyufTO2ir01r7zDVgMorgppouBQZDIuHWve6l3dBHFtpaY_Um_y3vp9cMF210MY0r23rc0rHgyE1XUu-T85sTT4rl95vnJhRkkjQAS_Lk__J37_M94Urj21xg32J1111l1zr3311111r2t_NX4TJrd13v1gD1_aH92r292ic929c0x5v0Y2r6p2WT71vu13c0912Oi54v9y35Y4QiprJc4oH1_57Nr1H1r2cvarHDopri7rGa714_MH24D_lrqyqMmBbZP1e4dBbZ6Sir1pSDHi6Sm1sSmfr5a2xix0xix1FgFicaa9G986cldiF9ZuziG6caa9q9R0zaruFgFicld1ViV0c3Jat5HJECnfER597svkAuo6c1RubBrX0xcnT8YgRLw1SaRt7f-CePvfHHIe55k2FJRbgypZr5tTUDDtb__13R_H1yr28g32v2d114__J3F__O2KJfj1vg1w111____cK_B1Rv6h19E1ug1115819B-Ur111401prNg4GJK73NO25NvwGJ38G1bo3NvoGJ_94NOwG2b97NvbG2_otNv_GJu1sSmir2mit___-BMUJpr2mv32v2u11111v1n_MT7BrrB14X1qJ2tr3XigQvX53S46E9v74vTed9CrH1_rJN11r2u9GgZ81PieaiB64lF2cgZi1h9rJlp14_Pt-D_Bq_P5twMH15rZWZMZyZPSyZi_nDr_nDHi15a2Jgz9xgz9vgz9zaDuFgSu3lE0JrR5caa2Jgz9xlEuwrAiF9diF9R0GgR0zaDuziG04iG6Hgs62lAiF9f6vlD0Ggz9vlf61ldiG17BhuZJxp69vad2dJo4Jv01KVPd2gQyUuUwdvJ0HHvw4X41r5u4wvIhr7shaQl9vJU8LYHElPeiXrTtv5qw4921r65Psm72vqy6E72mDcCzF9w1_CCal0lQG9Pfqc4ao1VdlqCgGJN4Hajq7LF1zHqSRiE71rSiyr31191db_U2mX59r1G14N1sD1F479Ny1NWgxS44G9X5wvgyd9b4J5tiDi1reaor39Z125232644FlWyaiPprgn2zH43vlp14NKBwN_o-ZsBbSnfnDrC15rZKZlfnZlBnDr_nDr_nDHi15a2Jgz9xgz9vgz9zaDuzl70eia2xix0zaD1zaDuziG6caw6F9Z0zaDiF9s62lAiF9f6vlD0Ggz9vls6vldiG16ZYuZJxp79rad2dJh1gk-Dr9XpGJX24vOpFv2EVeJ4dhP43OmVZ3hGS1Fcql_1e0iiv521aqSsDg729XSBzJe1_CVpFvXpCi3qCiIy4vI_PJ35kMpkE2ROJ9NaMsF0cv59z_T1v12_BZ_JvrA2Q91wr2Nr5XSq15zq1542Qvdq10w5153re120e126212har2EH3I519rq1M0dvX214v6rJQXqQNBiA05y3JT5Qib6vO43DXre5gFuGJZ9a5yuDg7ir11tF_PZzFPBe4uic4QC18dBlF5BbZu5ukP_nD1fqPmfw5J1sSmfsMmfsMmfqaa2xix0GgR0zaDuzaD9G982vlq2Jgz9xgSu4lAuHreu4l72Jgz9xgSu4lAuGgsu4gFicadiF9AiF9d6er82zix0Jgs6FgFicld6H9f6vrAtqW672vw5rsnbArFdr5c8wTYtvQ91JvdiGXhpwmkp7NryxYJLvTljcOUuSGR1r88317QDUg-o1giivrxpwmiahxugeYU7IHFyVk-c5l-y3vi92PZ210MnCa23rvMpQQh3Jqn63TZVvleyqPg3c98Ia6AAAYuPbVuVco__J32_-g4Grj21xg34v111rl1zr3v1111551o1eDVsr51tavmpWgIu3K____N_kD511gS1xg1f1111rl1AKMU1111551o1e9Osr51o3Jq7SgIu3O11r30_UQ5eJrN14N1tQ1z8zve5qN5y4OX3xiZoDiPy3lSrG1p1rY2trgU2ziZ6HXp5rT1tF_uBwN_1e4nfbZlBbZO5tZP5zQKBw5J1er82caa5caa2caa6caa9F962vl72Jgz9xlEuwrAuqrF9xgS64lA5wrAiF9d6e146ziGuFgfuFgSu19S54iG6ve82c5o3vSU1KBX1Jg43ee4eero3_Bp7qlN5caXpGOX9aYwogHOw1go3RgYtvto4eh2aQf-VQgxxq9qqHus3z2caHvFuHSw6WTf3wJT1mFI1lNIy4vI_bf-Dvl61Ji3a80o1qWp1rOX1151PK_X2pa7Nr1K13C17qHx04l1ieS435iirHTe3F1vrJc4pru40191t-Zu_nDrC18dBbZP5uBMBw5J1er79G9R0vlz6ciq6erd6erz9xgSu4gSu3gSu19Su4gFicld2qgSu4gFicgs62ld2paVpS_9JEsc1Hvd4EDUtvOyrzTParTp1zXey3OOy2Ts2saIyJJo1gR-GbBnRGyy0olVpvNN4F85iYJ3kYJLyci56dPzo4vXo7Et7J1219k_DvyK2wX1ov1Jr2OOrG04141sy1M43Di17H1k1vvk5vOKp1gZ9vg1t-Zu5yr2SWCmBbZP5uBMBw5J1er82vl79G9R0vl86clq6er79G9Euwr40xlEuwrFicgFizlEuwrZuziG6Hgs62g4IJvowG0Qu8PJtcO03JNXo3OX4v5i3LlXXFvr6rNb83vY82Nq1NNf5FJr2Jl71r64xtCtI3OXy3LR1k5RdWiLW1O2LJlK82vg83NDYt__15i39rjO1LJ32v3F1111212B_B59F1gt11N1pr2U18g1XQ2C7SDIfwPm1J0m1roJfr7yfr6Bfr5Dfaem1c1C94QJyriyyr54-FQ2WwQ2c4Q2mzQ2kwQ21zOCqFQ3hDiUy6DXof5X7vcIy12XeQu1y5JCrS04twcimANZ48iZ231Z5vPXa6Svfr9tfr6byr5CfsDCsw5orvPZjr0s1v1_tH4QC25CyfDKb3MmfsDg5twMZKZlBr5rSKZMBe4MBe4d_mF5BmBM_nD1fsMmfsSmfsMHlsSmfsSblf7J1I13rS6gr1Pmr1NtuWDv4vXAykz_Joit4FgCLt_vOvXyuxOIpGPhiw1261l79G9R0zaDuFgFicld1G9R0vl72JgR0zaDuFgZucldiF9f6caa2Jg2619s61l79G9R0xlE1GgR2vl76erq6e1z9xlEuwrAuwrAuwr3uwrEuwrAiF9f6cid6HgfuxlEue140xlEuwrFiv5D0Ggz9caaiF9ZuvxPsEdGK7mkj7GPREcQewUlcDMAg49b7SPxnsppTzTK82Qh8tGB2c1rdFmiWgc0ETCb1rr42AvZ92Du31ggwF9SwEyfcSd6P1931G956HeUIvpaoFhqYNaBow53SCPKvRHOYpMHmfYD_6T41v523rrv8qPj31Q21r938HJYp2Jb1CSK_QmKi82Wq9Z7jr53BX9SETW8a_VDstBF9HNIpUTUtKl-rv5orz_CtGCim0w--LPAKpQUuDvg1kl222Yte3hD_uWitafyHzaC1192k11128l4411411l16D102ri71va3215p14_mZiD2oMZmFw5J9q5e9rie9e55m_FS1JOz_wO44tDf1OkMyv121g91b1yd1Y111J1uOJi21v11oND2oNDHi3ac5q54WKZO1ceN1cr11v6H17T4U1px11i12J1sPJr12v561Jl113_mZiD2oMZlFw5J0q5e9rie9e54UtZ01zlz_vMU1zzMVJ8G_vX11152n12C1Cg3WJ1o11AF11g01J1KFr5KFw5J1er79G9EuwrAiF9d1Cjbl83bRZ2JRJ79l0-bl83bRJ131dg1hJyT1UQ13J1f12dZ411q2vN06ri1oMZlFr5KZmFuiw1261gz9xgSu4gFicg8u3gz9vgs62gFizg4UpWXnpEYn8xY9CsYjhdsjdEs1gcXUjWXnpEYn7EsWdWYWha11191y13D2iN60J1y15N10D1ew2vq2J1Vo11DpeOx21P0taiKHiwmSPZ5H11KFlw55ukmHirHi15GuFgSu3gz9vl76erf6viAuziG6clZuziG6caa2Jg86cgs61g86cld6er79G9R0GgR2vgz9xgR2Jgz9xgSu4lAuGgSu4gZ0GgSu4gFicld1Rm3o3e8eDa-ewQAqqmxyHc1pjL883vBi6pb5e1E0zC8fwNT0G6my3NhtGlKk4AH9qTTtHc6bqgW08utr3vP9ag3qwJGi6uq0qQXsFrG1nDy4cgdjs61p49buWDQsF9Lh4gJqE9Up4Dch4Tv3rTT0NXEt3vv8DEmqWvAg3YVdqOTyGY71t__15t_FJl22T530v3v11122J3u1EJ11110P1MywDX316DJ1t__1p__-J7-2n530v4d11122J66_PX1111wr1Jt8ONn1v518cXq5WgIu12mi1111v1Y1sQ061dM14D1lJ5Pri1Aav5saxsq1veq1rey1aQBdwO3pxgV0v0g9Avz1Qvg1avp1scYj7Q33EQ2pdlChJ0YhAHWy62md7JXhQX2saX26QX2w5CprFCr9sTWjxa3qGa20q6L6v6j6v5T6zvd1ErL1egLi2vg8w2Wyv5YyzQV1vvV74T3yv264v6Oiv6jiv6uiv5YizQG1vXG3vTJ14v7i2DX13529dmYs5mGl562eFcJsWhadSPyw82cy6ea3cvJ1GTq5vr58GTAuxTUl191tFiKiGNrFw9KixNe6FQGo-DeywQGoH9CoH4PixNqye5qywQ2oSZMZuFP5zQhoFQCfsSmfsDqysSmfe5qyqNqywWmfsSm5zWmfevrSOrGZ4QCfsSm_lrG5yDeywWmfsDHi6SmfsSmfsSmfr5a2Jgz9xlE0Gg42vi72Jg82xix0GgR0vi82vi72Jgz9zaDuFgZuc9ZuziG6Hgf6ciquFgZuziG6Hgf6ciq1er79G9R0xlE9G976erf6cld6er82xix0GgSu4gFicld6HgFizlAuwrR0GgR0zaDuFgFicld3erv83efprvfpQ9cc19G9eQOtFab442re2Txw1vQ65snt6v755gP04aV8q9EpS-iqJTz9seQ0v9o4duh-RN-prJv6ehums36y-hJTXSDP90XEzNT8F5gs5iLs52mKEx7uS7ochSGg0T2Yx9d5CQxaXJ2qsw-Hvq1s3i-ocp6Zr5gj7w--wj9ys6HUKvlqr5EiGQStkBd_Kv20_aLlSF84Qew_IB-ZritpwOd4JNLf45L3xW9jlnzaDrOy7rTt41f4JJa8w-ypcln0zcHQEMU9Fv11b_Y1cg6Jro611i15ka12r551J51oND25igrHz5J1q5S9rf2-xv6A19dIJ121RBMQJiP2Dv11J1uOJ911J91oGN2oNDHi15eiH53bU_MQJESMQO11r0-_hi6Jvo611a15Bg22Ja31Ja313_uoJ5KFe47iw126q5e9H56JKSIIJo6I_PM2w91118_VbAw1GJ3Hr1612yA1rg411r4111KFqN2oNDrHz5J1q5S9e5z1RZMk1u4IJ9dI_Iy11121RX36vf32Dv12r1wPva811i11J91oG_u1q_u5igHi15eiH5c6r0-IJps1cg6iKPMIJ111b_Y1cg4o1m911a15Bg22v142r1413_uoJ5KFe47iw129wac5wi4otGM1YqK1cjK29i111510b_k1MO6aJ1n12H13JQp5eQn8cJd3c5113_mFx_uiv5KFmZnFw5J1wiG6Hgf6cgs6qiSu3gR0xiz5er72xix0zaDuziG6J8E0UJZwFJPu7iCy5Wh853lf7S_E8Pyg1sw4crCpYWEhGP5fHQv_oSCcS6Bh7Etov4__J36_g56prdB1xg1uv1111l2cv5k-uz__J1Y_g54Q1eA1xg1sv1111l2cv1U-uz__J2D_Y16PJfL1xg1uJ1111l1Zr3R15Z__J22_E94xvsS1xg1sJ1111g1ZlOb__N1O__B1YQ9719E15J1111819D1117f__N1ht_W28a5Cr971RT1111318R_M1yN2uN19J1L1721oqT68HN12e1691a42raJ1qrQ125r5r9edxSUor00or5P1v90dv2U110011518ov2ma1psqmW0J070J5R3kv2mJ1_iSSmtFumfe9CoFumfr5KfwieiH5FoSDFoH5Fiw126Fiv6caa23iz0JlxuwrZuzaD0GlEuwrAuziF0q5G6er79Gi26vif6zgSu3gz9v6p4Wg2uuI--mJWEwYT41X521vfy49A1rQ23d1FofR-cJggsiEsmoaA22bTAl_0Gvv5TcPAnkTVh6UD7AiP9vcvpFR-wG_-br96kEcSmr4__J3d_MN4Sra91vg3nJ11__N1z__W1_15Bv971YD1111315w-jvwY2t11yJ2o17010r1Ji5O1pc1U1xTUwaiar1H16vii411d52g36WTNjzJ3qwJ2t2-X1fs14GJaess6haa3eQa2ervA1kv2mJ1_F49FfsDeiFi_iSSm1qMmiGNF5wie5zQC5wiKfwiFoFiHi35z2qi86er79G9EuwaDuFgR0zaDuH9eu3lR0zaDuzgFiFlFuziG6cas5Haa1Hld6ca86Haa2xix0zaSu1ic9vls6198izlAiF9f5Fa58AFMTDT3yqQUy1g22reGU1T525E1CYSn3cDdo4Q74e5T8JJ5uGOYtaw-Mxp7gzhYa0iMd75p2RmPaaCwt5YjkcXi3vCi5v6L1hOUi3QY445K21rtuqHP_UOkRbVW32icpipi450rspvh8JeM1WLV_z0F21g51hce1t__17Z_Bvr12y532v0-11111r1a__96Y1wO15l1lD10o3lR1vQ05Fg_Lt_1r3Q045v_tDQltHi25HgNovT1dJ2I110011510s1Lg3X3oxXY2wiFpeNbpkv2mks3rvar51dX1fl1tFiK5wiKtFiK5wiK5e9CoSDFiSSm5wiqywQ2oSDF5wiKpFiqyqNFiGNFiw126rl75xixuwawuqix11l79G9EuwrquGgR0xixuwrAiF9d6Hgd6GgSu4iG6caa5FgAuH9Ficgs63ix2Jg86c9s61gz9xlE13i4yJ931dux33Py_LJh75gUybyeqQcuwFPwo6eHeqWueJPRpFl9e7DQajOZq4Syw4SjR-vB0DvhptBHrv0plAmA_Kcxiv50L_Cia61ApE92RQJGYBYr9GPMYAaH2_M0QzaUgtBz1DeD1rgL8W3VW5sk_R0zpwmybJ761151ob_m1Br5_v1G17C1iHNKoHQH2e5112111v11u3QY2w5adceU6100615a7HO3qqhh0EQE1GhI9v6j9v609v5xoov2mQ1osrCW4v074v5y31pX1fl1tFiFfsD_iSSmfwum5zQKiSSm5zQ2oFiK5wiKfwiqywQFoFiHi15r9q9EuwrAiF9f6HgdiF9AuwrE9Gix0xgSu4lZuzgSu3gz9vl79G9EuwrAiF9d6er86vyD_vxe_zTOr3Q_2aJJPg6AjcJX9GYdusG4mzptjqDdiwBBIC4mnXN2mbCTvWaYyxaA22hRk60O33JQsci73EP6pWP47waWfdU_xVMRm1111r2Q_NN5QJa314T1eD1x5vi4t3D19H1z1xuj5ATw1QQw1saKhqN3exN25GNU2FQCpIv2mk9b8JnX1fv1tFiKtFiK5e9CysSmfsD2oSDF5wiKiF5J1ea81Jgs63ix0zaDuFgSuwrZuFa72Jg72Jl72Jg82xix0zaw53lEuwrAiF9d5e185zlAuFgZuzlAiF95QJvp2E9OuJg01v9OaZpngXlo41Ji949Yrx5r24lPs2O0XyNFuzrO41Qv0Ar5T3ZE_h3cwd1SpD-cQ6MyoFClqzsslOViJJNy4H5Dy3Q3yr5-WqrQpzwf_LR-X7O2fnaJw5JK4JDL1t__17w_FJqw2Hg30v0w11122J4j12r1Xr1hOv68eBv2vD100v6o3aP39v1WpH5S13Oeur111r2M__9511a113X1sa1O9JOm13gr0v9E0z1d1r513H1o1vOz15T1dv2U11i1eHhf6Eld1Hgd5raj7c7B1fg1pr161fl1tFi_iGNe5zQKfwum5zQ2oSDF5wieiGMmiH9Ciw126er72xixuwrZuzaD0GgSu4iG6caa5FgZuziG6caa9G982vld12aa2xix0Gg19J6y349Kg1r531cEpzlpKXWHgwm9taHyyRCV1qXB0Dvh0bBvfv0dzbjTyd0Qs8JMB8wTgY5DpWB-AJKFG3DnaoLiyW4-qEDYuDCM1ha11r1i_-X5hvwc13O1r51fpc1Q1qry2wNd1ehW516756gr1c1o3GjX1fm13ET21aQ2dr531e-X1fa1tFumfwNFoFumfr5KfwiFoSDFiw129Glz6ca44viz9xgSu4l-1zaS5FrR0zaDuziF6G5G6caw63ixuwawurywznYG3vv44z-5hGDXq4DS9JQw4zlI7Xr303lB4ECv21ra2SL8_E-dk805yqPu3JDts5cy1gndbe5Qp4v9yGbN0B3zfJ5nE14__J2j_BT6Ivaq1vg3cv11__N1m__h2ui64v971T511t__16z_GJah2r932vp9114__J2Z_MD5nvwV1vg3Uv11__N1n__k1Xa5-1971TQ11t__15o_B1tX2rv32v0N114__J1a__T5zrwJ1vg3zr111151yb_b24i5ZJ1I15W10351129712Dr8r9m8qDE2Waqhe93ec925v10hqv2excdp19T9BO2mJ1j11Q2mr1_iFNFfsDqywWmfr5KiH5FoSDqywQeiF5J1qgR0xlEuwrAiF9d6Hgf6cld6HiAuFgZuFgFicgs61l71J9c9xgSu4lZuzl33EEu8xdgyGvWpalW8HXulWj2tHX83eNvyxTVpf8HxtVZows6x5gM1h74N49ZAwaRtqmLyqOO6OHA1r-6ec9qtzNZpGPpFbZh_ODVpsrp61Yc1t__14__PveC2r132vpK114__J1K_Nl5TvwA1vg3Qr111151gtCM2rJ5Vr2315h16vl113D1ye1Cr4Q4ywW59H1j1eTGicVX1fs14wJTsqcWp107p15T1JAX1fl1tNJFfsDeiFNFoJ5KfwieiGMmiFiKiF5J1er79G9E0zaSu3l89xlQ9Gi89zaDuFgS5FrR0zaDiF9d6c9e5wiGuFlA6FaZ1GgSu4gFicgs61l76erw6egd6eaa6JaiuqORorX3peq9_Q3n65Hz2vD33vSzpqNi5zNWi7o-bJgp24W1p4ri3JMxuJo-SGaSt6V8pHQq21v92QJy6F2p1lm0TCsgh3c8_TR-HKBN1v966zxo1mdudE68t3vDn6SwNbVr31sqe3Nxyr111r2y_-a4PvwG14i1yQ1j3xTU111S8xNe1e6j47Ti1QQi1rJz9JaKoHUV1fa12r6Z14N_iGNqyqNFfsD2oSDF5wiKiH5Fiw121Jgd2xix0zaDuJgz93rSu4lAuwrR0zaDuziG6er82caa6ziGuFgSuwrR0zaDuziG6eaf1Bg91r9SpxDZ26QF_KZ-BrQ021rVpEQp3h82d4X32vgZpA931ObMN4szyzQOVfQhHnH2yFON7egd6GJFPw0pqzyyfzQSoHsAeZcpo4evP0111r2y__96Pvwb15T1r51o61TprxaGiQJ1rQnX1fs142J3sr0W1v071v53yoJ2mJ1I1fa14J6S14N_tFumfe5FtJ5KiH5FoFiqyqNFiw1WicldiFrZuzaD1GgSu4gFicgs61l76erf6Hg8iHlFuwrZuwlD0GlEuwrAiF9d6er82car6Hla9Gax2Jl7uwrZuzawu19Su4iG6c920s6Yks972vO6o5TYuvDi3vr81BPHwJ982va7tzOWuJJp422T-Nrw82HZ2vJ36E2u01R62JvQuQ1Ivr6mx5HsaFXEig0GorkEgUeZ1cJt5eHKmBAUx5HTr4NWfshLibZVs7SE4vr336rn5w5_1b1h1eMLh8bMhr1215B-QJh92uN1dr2qr20haW09iqaW54S9q6Oj5212557N1fa1pv6S12g2ma1tqzlZ86alheJ3ecJ286a6L16Z14_iiSSm5wieiFN_tJ5KfwieiGNF5zQKiH5FoFiHi1a80GiW9Gax2Jl7uwrZuzawu3lEuwrFicgq1F9f6ziDuFgSu3lR0zaDuziG6caa2Jgs62lf6vlF6FiSuFrR1FrAiF9d6er82caa5Had6cas62lf6vgz9xgEurd4ogmF_Ybf_Kge82SX31J341HxwHNi1ShQn5a72vr52zXXp4ao41T53rdBhSlo2rXBtxgA41Tijz931v9KuxlK3vJ531r52199s2Qdoai2N3dnn7PQQbAG_Oa833rAr3PwW9ItlEJNyxY5fRaB1-PQAzD37VJLLr8ogDaBpaHdl54h_Rv92sh1pHXJdd0auSd411917b_D2ia5Zr1W1451f51U0cJ132191vv95xD1921v1x1viH0ji7TJ1QQJ1w1m8ehspEaU1QgU1qTQL16Zr1YU4v604WQy1vXdL16S14NFfsD_iSSm5zQKiSSm1qNeiGMmiH9CoSDFiF5J2rgz9zaDuFgSu3lRuq982JgEuwrAiFiZucgs62lF92gs61rz9Glw6Hg46HgAuwrE9G931vTej1Je2JJPs5SmewaPwKhstvHj1qwY_Kfh0hH31vahaOUamk1X21qx8ZpEzfPgDHi41v9OyqvX2v9HaRALFMR9GJv3kcY7_UX32dCTn89111i1b__D2dD6111h13r1r12gr255931ru3aWrcT1121r519ryIT2mr1P1fm14sTzjxi3qqi29J523ejX1fh13WamheD3ecD28rEX1fl1tFumfwNqyqNFfsD_tJ5KfwiF5wiKiH9CoFiHi15F92gs61rz9Gl89zaDuFgSu3lEuwrFicaa5Hg46HgAuwrE9G9662ld6rla2xixuwlD0GgSu4lquwrFicgs61l71sHg1wfj_Kwg0hvBj1Xu3JYxje1776w0WfqSuvyB21r5e4ul21r7226vrxN93riKZlK0Gvv5TW70x70eJIhvndk4_YiK_RD32dCTmfao7XY9imlSt74EuS2sy41V1eMKYQCrjYGm111318__M1t42r117r1Q15C19q11221591r421rE12Tj121r519rdxuU9J009J5z1r596Iv2mQ1pseSW8r078r5m3ov2mJ1_iSSmtH9CoFumfr5KfwieiH5FoSDFiw12iG1d6er59GiR2G9Su4lAuwrR0zaDiF9s62id1HlduzaD0xix1sHg1wfj_KRm0hvBj1Jt3JYxje1776w0WfqSuviKANZ8F1v5TcPAmkCeJIhvndk4_YiK_RD32dCTmfa11r23__g561wA1491j51J3qQx5J11139r9v9x9zrl83Wj1ET31QQ31r9b415i42Msi7aJ1QgJ1w2fo7lO1xJWL16Zr1OhdcsU6r006r5s8Bv2mr1_iSSmiFNFfwumfe9CoSDFfsD2oFiK5wiKfwieiH5qyw5J1qlz9vl79G9EuwrAiFiG6HlFicl39q982xix0zaDuziv125a13ix0xgSu4gFicldiF9A1DFm7SQT5ciRuXPC02lbuwTi65_-XgY08eXEy_0M1ra2rtB7D08kf4vT7cSNPdRp1cr64JgM0DaJ1v931sJZ6D1Wq7w-k_BjDKV0qaaLpzDwayX11v27_ND8wvwY1391ov2Or2DO12Dr8r9m8w1w1v9K3J5o0cl1sqWWpr07pr5Y9ov2n51pdxuU9J009J5z7Iv2ma1t5J2j17T11QQ11r1s6rvrLv6S11v2mJ1_tH9CoFumfe9CtFumfwNFfsD2oF9GoSDF5wieiGMmiF5J1rg66er32vgz9zawu2iAuziG6riAiF9fuv1F91rs511c9v129v1s62gFic9Su3g3zS8-AHroo3cv4cT404Hx6ISX0qOO1fKd1rT20bVb_LzP_UJ3xNk-_-qhKKpK1mN28avR_PvI9Ea2uNO3oD5SgKX37rwl1s_A_KBu_cO29Jiv_YR3RB92lmVQcJ111v1i_-54Xrw-13g1ir2gr3i1pqQ18r5m8wiL2JXo17O11sJ11aT11r1tir5Hieax31r59Iv2mD1pdxYUpv00pv5U6kv2mv1_iSSmtFieiH5qyqMmiSSmfe9C1qNFiH5FoSDF5wiHi1551rgz9xgSu4gAuGgEuwr1uF9ZuziG6caa6Hld6eaf6vgz9xgSuriD0Ji82vgs62gF1Hw-HtBn8GgYt640xCVL1dAL1z9Hh5QV21r72v9LuxvV3JQ6j8KDSMl2mSZ-CcN-pq0WRaJDKA7B1eaa2JmbpWqqhYR4abPdq4QO9J8RzaD21rv0L6vBb___17Z_Bvr12EX30v0-11122J3y_-D23v1mOJ92rDyX1gu13xg31aaieaObu3aI5waS13Oeuwa111518_Nh2dg61v2619215F5f6HiMpr1Z111w52i35HijrznX_N210vQuq4lZeHYIe16je160e16514e1u19Du1vx6F6Iir6pisTH1z5xL16Sr1HWtJ67tSg_1zNVyvxX1fl1tFiKiSSmtFumfe5F5e9CoSDFfsSm1qNeiGNIiH9CoSDF5e9Cye5FoFiHi15d6erf6caa9G9EuwrZuzaD0GgSu3lE0GivuwrAiF9f6ziWucldiF9d6er79G9R0vlz6FgFicgs619z9xgSu4lAuzar9q93UvX52AOYtrr72vgw51j9_L1ZpGSjgx5215jQvzJRywQRi90MoavonZBWBKEQ9zcTdZ4-Nag3nCUeoGQH0VgB0JNg7H02o5NLluExR8DUyvJu2Jiy3zTUpzOo3JthobbEXbCni3rCyqB-Qr5g1t__19__CrtJ2A930vpm11122J3u1o91Xr1hOv5R0Bv2vD100v5UpxTS6x1WpH5S13Oeur111r23_-J4-1a91411nBac0xg782jX_N21pJQuq2gdiv1i42J13dJ01sO01aT01rQ41HWIov6jov60ov5LdqWYpr9Y9H-X1fs15Agw1aawsei35SathrN3evN24HEX1fl1tFumfwumfwNFiSDFfsSm5zQKiSSmfe9C1qNF5wieiGNI5zQFoFiHi15AuFiG6caa2vl82caa6ziGuFgFicgs61rz9xrS511ciclAiF9d6er79G9R0xgz9vg2tb6A73TSfuzk28MnhdEq9GQ-_IdbTKB_1dX27aDL7FrXowaIt3lwpw37BrpV0elXowrS8cXwod7fqEgBpDbo-iv2qv8V4qsUW3NBw4i9Nt__17k_Arel2ya32vpi114__J1S_-54vrwG1vg3vv11__N1ub_c1X57er9E1T91115819B_c14c12-F1v63rIv2vBiE1v65Lt__P5epowaWpH5Sur1I5waS1t__15k_Ove92tg32vp411111v1r__17brwY14g1rr2GPGrZuFgA64DTLt_1r2N04avTp5iu2eejr7Y11QW11a1W0eMsyEaV1QgV1wTLL16Zr1Yj17T11QQ11r1bL16Sr1Ys57ar1Qgr1e1pL16Z14NFfsD_iSSmtFumfe9CoFumfr5KiFieiGNIiH9CoFieiF5J1qaz6ca44viz9xgSu4gFizgSuwrZuxlEuwrAiFif9w9d6e5F92gs61gz9G9R2G9EuwrZuzaZ6vif6zgSu3gz9vud_Yc13vv44F-7hxJZuGHoi1ap7vXSoeU61n1FiWv28-KMCx9rx5vRyvDqHJljslnabVaZ22D7dX_-kCsLlQiZoqOSdWhyHdoiIH5Qp4v9e2B-OizvHiN81aWf88dUxrJF_T532dCTxd511v2y_-Q7mrap14O1eJ2Vr1QY9q5_uFlwe3AX_N21ivQyq3DPqeD41J1w52i35ST2jv53qr521eMjeEY71QW71agU8GTbpxssrds21Qh21a5GKv6Z13a2mr1g1fg13J6Z14N_tFNFfsDqywQKoH5FfsDeiSSm1qMmiH5F5wiKpFiqyqNFiGNFiw120qg86er82caa2xix0zaDuFgSuriSu4gFicgs62iZiJaF5wrAiF9d6e5F91rs61rz9Gl89zaDuFlAuFgZ2viFiclf24aD9q94stVuhFvk6wQIpFaa8rvXpxOZ2GYZ1aQJyqJUu5Q22v58_Kwwp0QBjrXo1J95H25r8c1fiv68_PQV1WXp1vjui0W-rxJCyqHjk0Uwov8rjqDSuqS1_O53316JpzaSpKVpGPGVGrv5TWqcbq106JG5_Lg31vZyCJ111r1b_MD6iJwG15l1ma1erH1ryr11031Qi3r403rK3v3X_N21o1Quq111qqM44EOy1sTy1aQy1rX1ea26a5svere6ew9hpa6Irr6prsY21Q5GK16S12Q2mJ141fl1tFN_iSSm5wie5zQKfwumfsDqyr5K5wiKpFiqyqMm5zQF5wiHi15a2xix0zaSuFgSu3gE9G986caa6Hgs61gz9xgSu4lAuwrR0zaD0GgR9G982xixuwrF0wgf6ziG6caa2xix0Ggz9Hrfuziv5JaF0DXTyvD96ShrTEgi21lAuqv-2ra72ciw2wTNu4rPEAT31QyRvzTUy4TTff1TgDTonU12nrg2vbjLuqO0kDcVRfY8lCMFoGQH0FCTyGlr6Hgw0DTJwf4hJfD527YQ3r9u3zlPpFTy2dCRqKXq1t__18Z_Nvr12A930v0s11122J3u1pr1Xr1hOv5KoBv2vD100v5G8w9M4GgWpH5S13Oeur4__J1C_MN5iJld1xg3fv111rl1AK_51y517B92y4xX1gyG0v5NLt__P4JF2cDWpH5S13Oeur111r2n_ED5Qrwm15v1ra1r1rTp6xT-tQTc12gr6v9duoT2mr1l1fs146aEhqg3exg20vv14kv2mJ1_iNJFfsD_tJ5KfwieiGNF5zQKiF5J2eaa6Hgs61gz9c5S9GlE2JgSu4lAuwar0GgSu4iG6cgq5e5FizlZuclSuFrR0xlR0zaruziG6caa2Jgs6erw6Hg79G9R0GiR0vpE21rNp7lsn3mdnrvu3vSWpxN95D5Wi78MbJv52ri725sppwDq8JJ62FgLpx622GQY27QLyz1X0z12isX51rg9aH9m0aPH1meVQaeQpQz-jtBA_KJ31vad7pOxi423d3af1qfkr3rb7dt3ua8-IoHUtJOp1v911r3t_-a4Nvfz13J1yQ1b8v1Q53rv051Q23rQov915c1q1c0jpETU1QQU1qTv8oT2mr1p1fl1tF_iiSSm1qMmiH5FoSDFiw1262ld6erf6caa9G9EuwrZuza40xlEuwrAiF9fiJaRu4iG6erf6caa2xiW0xi2kHge2vhSp4J522565eOXoaOorr7n57eQ31W38_BPbSD5584LCY5ktwvvYzlO4eTd4v6ybUbZz3TB5H3AgE05rDJCyzDu2r1317w_CreS2ya18v1U1761ieN4pv117cTO0ri43xarpWQ4jri31J2j17T11QQ11r2n8AXb1QOb1eMrpE1U1xTU5cAN1fl15v6S11l2mJ1_tFNqyqMmysSmiSSm5wum5zQC1qNF5wieiGNF5wiqyw5J1rg82JX39G9Euwrw0zaDuJ1Ficlw5Faf6caa2xix1Jg82vl72FgZuzlZ1DvvUmaQjFak0Q6B3Wr2QsSo8F6BielBo8xK6erkixvM0w9Gy6J2IviEpA4E0zQY015o5q2y6voehKBR_li3vFDbo4O4I39xoQOVjrQ031Oa11i1WK_b1Ma6311g13i1oJ2Qr3D13x5d6xT11J541F5l0xg13c1p1vT106OQjGr3qxr202Jl2WThjcQ3qeQ27eyX1fh13WaRhql3exl20JjX1fl1tFumfwNFfsDqyqNFfsDqyr5KfwieiH5FoSDFiGNF5zQHi15d6caa235x0zaSu2iAuwr-1ziG22aa2v586rldiF9AuwrE1Jgs6w9QuwrE9Gix1PsZxbVT_TOIeHvp4Gqxf0J20SI-pJ9ed2syJOk41Tg28Ie_8FJ3vqEYdCBfrqBKSv57mw3If3rbCpmalv7tq5wb3WmsqY8MP2nVI7WlqdO11151rK_O1_v6311R16yF835c5kz_J51s3rS95e5Y2clQ8EO31sT31aQ31r9jL16Sr2074WgyhvX44Wa0hrQ3evQ23eqX1fl1tFumfwumtFumfsDFiJ5KiH5FoGOFoFiHi15E9G971caa6ziGuzlAiF9d6er59G93ue11iF9fuziG6caa2xix0Gg46HDHeP3IvWPmT2H60GTB_UUaO_12Puu0i3rIyGJHiwTI2vrm3ob-GgPmEA1fywDRqlO23Ba25v9G4qsOQxY1s1N11191Qb_D29l5M11l13O1rQ1jp11g52v372vP911751g32EaQ1agQsxr302LX1fm13WTmjcD3qeD28e7X1fa1tFumfwNFfsD2oSDF5wiKfwiHi4lEuwrZuwlSu3lS0FaRuwrAiF9f6cl512aa135x1Hls6JiF6ziGuzgSu3gEM7i031951QJU6ZaBt1691qF-D_VXcGO51vv3w7j9I8LiH4load3i5V7uy4OcdxEo9qY8iHJsmbVSDib-LJrdxzwU_R5PyIPcklPU111217Z_Bvr12y51t139r5au8FrD7eQ-13lR5c1b1eNc0qsX516h57Qr1Qvr1e15n1r2jrr2d1r2qrr221MU4J6h4J694J5t3JOljzO2qwPhyJ9Bow7X1fs13Ead1agdscg36cGX1fl1tFumfwNFiSSm5zQKiSSmfe9CfsSmfe5FfsSmiH5F1qMmiFiKiH5FoFiK5zQHi15d6er8uzlAuFlAiF9s61l62caa6ziF0w9s61gc93gSu4lEuwrZuzaS0GgSu4iG6FgFicgs61gz9xlE9G92wvryp3vTpBdU7Esd_lv7p7uP1qWTlbBo_KUc3vTy51v9gx5cxPouL4OR3cuNxYi55cTRg0X421r45e2jwvTFiRGxpH2ltxU9-sL362am6OHm4FNA87vd8xso0Fg85v1219f_K1tV2rT1or2jr4i86v1W53av0riW0qN34JN16c1d1cg34sTujvD3qrD24s15g1r321rwdxHUo100o15O8xpV1fg15J6X14N_iFumfe9CoSDFfsDqyr5KfwieiH5FoSDqyw5J1ea8uziG6caa9G9R0xix2Jia2xix0zawuwrRuwrAiF9fuziG6caa2xix0Ggz9v6j1TYsGCczo6md0Ddn2zvPpFQy1zlU9c83vCRZyqlr6dnQlrrzTU1R0s0x2vgP_cizrzvP1CaI7GsOoFTt9STZ0FX80J111r1C_M55mJaR13T1kBaz2rOo7J3X_N21orQiq111o2dt2r56jx12dq12qx12911kqcPj7ATk1HOE0vuI5v6p5WTq1c9y3ov2mQ1ph2v2eecs719g1Bv2n11_iSSmtFiFfsDqyqNFfe5FiSSmfr5KfwieiGNIiFiK5zQHi15713iv5e11iF956er79G9R0xix12aa6ziGuzl72vl79G9EuwrQ9w9d6er5w4o-Inz-dv7iF6v26wTT73j4qWB-GSA5WuTvgS2d62lTy15a1qaPy18XVbB31lD2r100naJIyHey_zzXxfK5xJTgpJS50DCOy3Y11151m__h2ui64v2815Y193O1ywW0p1i15c1q1c9416T1jv13qr1213vbpJ5IpHC1Kr6Z14118v6A11T2n11_tFi_5zQKfwiFfsDeiJ5KfwiF5wiKiFiHi1572Jaa2Jgs61gz9xgSu4lAuwaRuqlSuFrZuzaDuziG6caa2Jgs2Haf0wgFuc5DuziG6caa2cas61l76eaw61gz9xgSu3lEurtRwKb-Oc1tu3TUuvXy21952rvDpxTA31g3216yJCl9tzaTy21e4c9DpxvX21D39r5Or5HVg6iIuFlIw0Ujk4cO6z6rdcNzfW1Uy4vUeETGo4TPK4DRrJ5wgf9ApcYZdeYmEXMWptBipzvVp3e5LFQ11r1S_-54vrwG14O1r51aoeTS4r9r0r5W0AO11aT1dv13143X1fs142N0srWW3r073r505Iv2mJ1_iSSm5wi_iSSmiv5KfwtiiOJGiw121caa6Haf61lFuF9d6er79Gi89G982xix0zaDuziGuFgSu3lEuwrZ2Gi82xgSu4gFivrd6caa2xix0Gg39ei52raBPGDSuqDEScgAl7i_pFlZpFCQ2vg76zDkk3TCgKhL1eY70zgLa89m22_-BjgOyW0EfHX5yxDUy1gr4FQOpFOyr5JCa69BF_J5219MoDgz91NGpGQC61a11151eK-G25v5Mv1O1601911l5c9913ar0r9W0qXi311ajHr2dcr2qer262Np3vabL16Sr1YQ4J664Sat1vN6L16X14NFfsD_5zQK5wumfsDeiJ5KiH5FoSDqyqNCiF5J1eld1v9z9xrSu4iG6erdiF9q5wrR9G9R0GX3uwrF6F9ZuziG6er79G9R9G94prg8pRC-RtBqh7pGaxrA25Dg94c30xx4TGmChzkutqvydxar23WrdtSY_OzUWfmSyRJ2Mr6R9xr31v9iixhW2rl7kGT-41111r3T_B957JwN14a1aD1R0Jvx9v1J5413i41Z6r1132191vvR17J11sO11aT11r1s6riu8HNuL16AOziF1Bv2n11_iGN_iGNe5zQeiSSmfe9C1qMmiF9eiGMmiGNqyw5J1e179G9Euwrw5zaDuziG6caa2Jl76wgZuzlAuFgZuziG6caa1vl72Hgf6Hgf6cld6er79G9R1fa8awl-41DAo3OZ3Jr67ePAiD2W0x9boGQVBlgE0D39Qcgw04HioqS-Mr7j_ILzawpH1g92hlgPt4JPWECpeqlh7dDNwANYo3aBp3Z-Xkgz0D6_ce5r82acreC0Xr111r2i_MJ4Eva512T1y51q11ar2r962eJ1oJD_4aNu1JDwL16Ar1O3sr2W110711513kv2mJ1_iSSmizN2oSDF5wiKfw5J0q1Zucgs61g79G9E0zaw5c5DuziG6car1Jl71rX2bhXDtq_bJCjQrJXfy3vPuHru2Ugs2D5IoqXb2shy1ei2H165pFQCp_CY_Te_yJ1216I_LvdL2e91uJ2br25x3J1113NroF1K1GNKyrOsiIT2n11R1fh18Wrxh393eq92dJPI3J0p3J6k17O11QT11r1o9vi78kO2mv171292n11_iFNq6FWmfsSmfsD_tJ5KiH5FoSDF5e9Ciw121JlS2Jgz9xlR1vi81Jly1xix0zaDuc9Z5FgAiF9d6H9fuciZuziG6clq6Hld6er79G9R0GgR26eqwz66hSQQ75uu3EOw4eNQ8xJA9WQfiq0hiw9MozS7iYQkpWONr2XNr3lmyGPg9HDr6ruj_LBL1U4cEWJ21v6FrtZAc6267zJJqiN2isv22IcFnKZ-WKCN1zcCKTwd_EwbzATzo4L_Qspu1151fK_w2qJ63v1A15GHpFdX_N219rQiq4aSy1O1721g1ccT2J6h2J670SgRhxl42GlG4G9xiIv2mI941J-X1fv1tFiKtFiK5e9CysSmfr5KfwieiGNIiF5J0er79G9E11i86rls6Haa9G9EuwrZuzaS5FaRuwrR0zaDuziG6Hg16FaD0JiE0xlEuwrFivis2Jary4Jzl_XvVJ952ErZt1g831go3QJHiQdp1k4i1vO55rJjjkig2uLudWg32r61uSpNtyuUBQvQ9DrJ0xO22z8C95mrj31UqEwt_n_17rNe1hAhceC2u88MuGZN111316z_GJah2r913J1f15yH5vjX_N216rQiq1g77rJJ1151h1N2erMs4J9t3kv2n51pjHa2qcsj6r9s1Bv2mv1_iSSmtFumfr5Kfw9eiGNIiF5J5H119q115e119q91uHrdiF9quwrE9G91d16B1eQ29J5p_YI-Bbo-UOKlTkBGYk-M_Kr2CJ5P1nB-BKBZ_OF-715HVCnX1fRdKCt-zv111v2B_MO4crwX12T10J2pr3vW12gr6v9d6xQn11113c1p1vYh7dQh1Qvh1eQb8JhU7J607SQk1cOwLv6S11g2mJ1_tFumfe9CoFumfr5KfwieiH5FoSDFiw122caa2vgz9xgSuwrZuzlSu2lAiF956er59G9w2Ha46HgFizgAuwrE1wD724gEpz9y4rhTuTAK1r_-XuvD1r9y82JoqVW9D17AdV760FiApK2PJoVllmaw5-qWHtN3R5ed_UX5253rqACV1191y_Vd2kX61v1d13D1ka1Q6J1v4rre7eQ63H5e9v1o1rOooGQ6r1Jeq1sI0v6p0WTE1xg9L16Ar2Qu13HQo166o6aO1xHq979v1Qav1q1f82r3L16X14_iF4QCfsDFfsDqywQ_iSSm1qNIiH5FoSDFiGNe5zQK5clCiw162xix125r135v125r2elf6caa2xix0J5EuwrAiF9f6clAuwr30xix12aa14iG1M6_WKz-mJ7S1wi2pr62_KVQkq9BpqxW_T70tGaOp62gZ6Rdk-b-G154PwaPir7y1rl2pv7c_Ew-YtBLLCml8w5Ut052qTuro4vPj5G6KTD24C8-FlAn_P511v2g_-i54vw-13l1uv2jr3rm3wic7cTXpJ108r2i16J1k11411NJ1w1J26OTjGv3qxv2p2jX1fh1431QsxeE0108015Q2ov2mJ1_iSSm5wi_iSSm5zQKfwum5zQ2oFiG5wiKiFiqyw5J1eid2xix0zaD0GgSu4lAuegE0GlEuzif211s61g88v9s61gz9xlQ1eld6er82vlFixrSu3gR1q5p1wvPo4l72c981v522vepyiQ23J5qHi7hZ5NVpxgv_J4-Drr551a4uVr23pV-1fb-DqQNyqHGaRC6sXY2T19j7YmeaH1s_L7LnBTiqU6v03TV8tJ48seapaCH03sqhWyH5J1217k_Arel2ya1o131r4Da61v1021Q1xrQoxTU8r1y1rXy8eDb7xr931O6j1O2drO2q1O23HMQ8J6w8J688J5b5sa6hra3eva22r1RL16Xr1Pj7ETj1QQj1eTd5kv2mr1_iFumfwNFiSSm5zWmfsDeiSSmfe5qye5F5e9C5wi2oSDFiGNeiGMmiFiKiw1wicld6ziGuzaD0xlE0zaD04iG6caa9G9R0xix2caa6HX46er59G9QuwrAFqiPiE6BcLoqxpGV1a-HlMml9S06p9ELPIe-vQI-OLdX_KaV1agGqws-kd0R2vdylCRAawhg5JMDsQlq5GucQ6t2NhYApzi11r1a__T5zrwJ13X1u51g1c5e7v1T53v3p3vJ7csI116p16T11v1cLv6S11T2mJ1_tFumfw92oH5FoSDqyqNFiw126cld6eld6er79G9EuwaZuqlD0GgS2Jl70zaDuzifixrFicldiF9d6er79G9E2Jp02JXq2JiBoGa_31Oq6zVaWagSpTAu1rixxw0ghxTXy3UphTQ59NqjN9skpGYyd4vU4wDWFZ_iAE171v000G6421O52FvUowQo2r1218b_Zrqu2tv17v1Sr1J84rDl111s52a36exX1fs13Wa5hrr3evr2223V1fl13v6S14N_iSSmtJ5KfwieiGNFiw125erdiF9q5waDiF9s6e139q9E0v9eu4gFicg2qYGRRh2Fgtf--jZnmeTUrxDV26I-7_fE1h92RhylbNZ-4tXWb_12315HCXct1151lb--2716211z14S15r1k11Or3J9o3Ga17H1k1cOnL16Ar1Px116w116511516oT2n1191fg1tFNFfsSmtJ5Kfe5FoSDqyw5J1eiZuzlZuzgFicgs61l72J582vgz9xg30GlEuwrAiF9f6Hiq1xMlyHJlq2hctqTN645b_LiPiFQk0Dpcr4NHacep636iav5Y1r3feDZotVgNo31nqs4M1EYX0Fa2CbtWOxNMpW3e_LR-Sr111r2H_Na7ZJwV14D1jIr17qaWpBz_J51y3rH9pGO_7r1w52i35FyX1fxG8cXYL16Ar2Mz0r6a0r660r6x7r647sih1WO1jJ13qv1212QW1JOsLv6A11O2mJ1_tH9fysSmfsSmfsD_iGN_1qMmiH5FoGOF5e9Ciw121vl72Hgf6caa2xix0JiE0GlEuwrFicgw5H9ZuzgFicgw5cld6H9ZuziG6er82Ji82vgz9xX30GgR0viE1CcP9Agf1Jr5qGYV2Z5tt6rbh5evfQhTiS2Ou4S293u431zCi3MRh4OKNW5UyGlRteiR31ificr51Xt-zS8Hgrv931OOyZ52Va7KMSOmfuo-xKBk1rEW-jMK_Lw-__On0r0vOOMx7YE0_lK8hzazedNI6ABP1r1O111213__HJqx2tg1r12Er1Tk121riGaV3rQVLt_1r1T04QvVyQ9d6xaZL16Sr2v17H2O516o56Or1c1FaFuziJ06iJ5F5GxN1fa15J6X11J2n11_tFNqysSm5wumfe9CywN2oFiK5wiKpFiK5e9Cye5FiF5J1egf6cld6Hgd6er79G9E0Ji22xix0zaDuFlA1qgR0xlR0xlE0zaDuziG6Hld6Hgf6cld6J5AuziG6caa2Jg82Jg443TPoqTAiWQguGOPt74z_WTmo3Q-7Cam1e9Ui41LgvJTrHOVpaCJ0Jak5rXf6WQx1eNVrH1IycSfadg_1E9_tFN_qFHPpcOIyFS_1az-pq5Vo3QkWHX2rwlDu4j653H70HlItYJC335d6eOfgxD2laQJtGvn9AcSx6r11r1Z_B95iJwD13N1rD1m011h7eNPorg18H1b1cNbirhj17T11QQ11eQ13qUN1fv1816S11Q2mr1_tFNqywWmfr5K5wiKfe9CoH9C5wiFiw120xlE0GgSu4gFiclf6cld6Hgf6clf6cld6HiqiF9d6er82vl42vN32xix0zaDuJ9pQqDHnETBpxXxrev041Da2Jap5aOk46pLjS1RtsiE37Cia79I8FXWtDX2bkhFkkGx83TModiW429s01l55cPZqq6_1j9214vP7pHy6_BGLhAAd51Xoq3a111213__Vrqu2yl1i12Gr1J77caL4vX1oc1L1xVX_N219rJtq3XLicas9a1o4Dvcq3MgoAvK1GNnjcX2qeCh8v9n0Iv2ma1aeHhf6Eld1HgohrO2svO2eJO23HpX1fl1tFumfsDeiSD_iSSm5wum1qNIiGNeiGNIfwiK5e9Cyw5J1rg72J572Jg80qrFicgs61gz0JaxuwrZ1wgZ2vl72G5xuwrAiF9f6ziGuFgFicaa2JyA7u2U_L962vr91q529qpkda5WQtDtlqN2xXyStFONtKCMj5ewaWYdaR6ygWFzhvyO5in6_EJ921ri3vTIt3DJ2vSzr5l35U-k1Ja61ArFirvi2vcvrQl1__N1ht_W28a7Jv9E1RT111581aa1XJ4c12EG1z5HL174r1QE1zwou3Op7xaI5wa1pH5S1t__17Z_Bvr12Pl30v0-11122J6614N1Mv1hOv64rBv2vD100v67fagM8FrWpH5S13Oeur4__J2Z_MQ5DJkI1xg3vr111rl2er3w1rT17k92wQVX1gu13qg2aaueq1DF0qOeur1I5wa1__N1ub_c1X57SJ9E1T9111581af_UJ4A12EG1a03L174r1QE1aaWewJPuqaI5wa1pH5S1t__16z_GJah2LO30vp911122J661pX23v1hOv9n8Iv2vD100v9cqx5g11gWpH5S13Oeur4__J1Z_B95iJk31xg3Qv111rl2er1f1y517k92uzjX1gu13qg2ywlCi1gb0qOeur1I5wa1__N1ib_m2zi7Xr9E1I9111581aa2cr5112EG1a21L174r1QE1ayTrFTZ5qaI5wa1pH5S1t__17w_CreS2ya32v0V114__J3d_MN4Sra91vg3nJ111151z__W1_15Bv1E14yFg3129oz_J51q3rS9931T1c0U016006QQ1xrmLv6S11T2mJ1_tFumfr5KiH5FoGPmiw1262ld6erf6caa9G9EuwrZuza40xlEuwrAiF9fiJaG6caa2xiW0xi2kHge2vhSp4J522565eOXoaOorr8-p4N_ptBSbSD5584LCY5ktwvvYzlO4eTd4v6ybUbZz3TB5HrVpGTV4ra11191aK_h29O5-v1h1491tQ1s91gj12l26HlDpvhk97Ov1QTv1q1eL16Ar1YWov67oWgL1xX3L16Z14NFfsD_iSSm1qNF5wiKfwiqyw5J2qg82xixuwrwuFlAuFgZuzgFicl26Hgs63iR0GgR0xl42vl72Jg82vN3izlAiF9ZiF94vaIFS4_blDuTuF9L959I669c1q9A76Gf2Jaooene62iw62Tb0eemwdezgAm1h2593v5r4EgI1rEfZRhawzA2t74NRX5C9AxG721kjWN2M3iz9G1OqsgzANQp3rT1__N1kb_L2115Xr971RX11t__13__Vrqu2yl32vpw114__J2Z_MQ5DJay1vg3vr1111i1dt_o2eQ61v1o12l10r2bOxiq2Iz_J51E3rH92vgR7vJJ1151jev2q2cg719gwHN28HN44Art1aatsrN34JEX1fc13EOs1aTsdca36ryX1fg1tFumfwNFfsDe5zQKfwumfr5Kfwti5wiKpFtiiw1w511c911e511c9v1Z62gFic9Su3gz9v1f9zaDuziGuFgFicaa2Wv2nJ5h1qi23KVj_LZG_UIoZp7-NUd_KbBDVSrNgZSHp2hgk18R1qD2BKBL_Kb-FtXg1w8IWBv2nmj_Q_VyI5DH8JT4wzOc__N1ub_c1X55Nv971T911t__1pz_Ovrk2tJ32vp511111r1F_BX5uJaa1351ya1y11T17e1hi2Q47eQz3cGX1fc13AJ11sO11aT11r1qLv6A11l2n11_tFumfsD_1qNeiGMm5zQHi1532Jg82Jgz9xgSu4lAuJ5AuziG6c9w6Hgs61gz9xlR1J93nf6o51MrdSQUteaP9J5FqFDUoQ3ia4NHqHPu5q6il1yU_LbroqfoCzDO8HC2driyKDW1_Wk-FLjFozTOa0526J7l__N1dK-V2jX65v971Tg11t__16B_DJaO2rT32vp811111J2U_-J5wvwW12r1p12617e1oeXE8xg75e51rH24i5i4rDu82vgrur5Sjcl2qemh6J9f9x9uhwJ2ezHdt19Niov2mD1ojv52dr52q1521rAX1fa1tFumfsD_iSSm5zQKiSSm1qMmiGNeiGMmiGNqywQKoF5J1rlc0G9EuwrAiF9f6G5Wicgs61g71Gi82vl79G9EuwrAiGaFicgs61gw9xlR0xix2Jrz9xgSu4gFixaAiF9f6ziG6caa2viKjbCjhcNOpG1qoxg2Yv5m93JRtDU4qUTCe7gvo3Jv1lqd8qDIjcgMKGahoa4-J6QbpqOmuv58dzPsppYm8qQY23O324QY0z151vgJ0xiN2bXh1va52z9E0zOqt3gRibAV21O42cXH0GvX8vT55zOR0z11__N1dt_o2eQ61v971Tv1111218b_ZreV2tT1yv1Sr1JZpxTN3r1d52g36zpX1fm13WT4jvi3qri21GpV1fa1516Z14N_iSSmtJ5KfwieiGNFiw122Gi89G9R5cas61gf6Hg79G9EuwaDuFgSu1iL1xlEuzi6icaa2Jgs62ld6eld6er79G9EuwrR0zar1Cro3DoqIArd51r31GONrxO92rD32vi83aH_1UHB2Jl931l9rqJ-ivl923Q31vw-cTJQ5OXVeEcjq7hFsEvTtGJ26ejF4FH2rrcRn80Gwp2lx8c1eeTPtRViODE9n1531t__18K_AJy62tv32vp011111r2S_-a5L1wL14Q1gBgh11144rDELt_1r2N055vE0zO41J1D54r3u4achq52ex6d9r9cpHv111vIL16Zr1J35SQwjei3q2i25JxX1fa1tFumfe9CtH9C5wieiSSm5zQ2oSDFoH5FoGOFoH9C5wiHi15Q0zaDuziG6HgFicgs63ix0Ggz9xlf6Hgs61l72Jg82vld9w9d6er79G9R03ix2Jgz9xgSu4lAuFg3dKB_JslJEL8OzxiKzsH9d5Fz3KcM83SKawY651Zo1miJtzizW_B-BXlw6xrt8Qj2hY5K1YILSGJHivQ7iqux21v5NXib8GvQsfHteH5t4zOJ9wiu41r7ux9Ic7xCtb__12w_-vqu2t132vpu114__J1Z_B95iJwD1vg3Qv1111i1t_-A28Q6111f13a1i139r5D66HlT421r73vT62N13219r1v431vGodNa1ee9pSvIj3O4eHHf87ll1GOl9w2k9dOc1QQc1q566Hl6s42Qi106i15J5rOo5rae2e534IT2n1131fg1tFNqywQKoH5FoH5FfsDeiGNeiSSm5e9CysSm1qMmiH5FoSDF5zQKiFieiH5F5wiHi15DiF9s6egd6er32Haa9G9SuqgQuwr1uHis62lsuzgSu3l82vl71GlSu4lZ2caa6cl31EPvL_8MLAPvTbBU1rjMK1sWbuO31rr5G1v52LcOnvqtlfWa3nZkP_BC8aV4Q4DrBpBu1rQQ_cgwiEWo7UCcNx2iiQT__Kb3uEs3ga_FdTvr1t__13__HJqx2tg32vpe11111r2y_Nl5bJwA13X1f51d11Q002lf4qg1o21O1xJOi2er4r5upkv2ma1q11Yj3ETp1QQp1rTf03rf6JalK16S1212mr161fv1tFN_5zQKiGNeiSSm5wi_1qMmiH5FoSDF5zQKiFiKiF5J1rls61gz9xgSuwlE0c5Su4iG6ea862gfuc5DuziG6rls6Haa2Fgeu4gFicgs5193PvgCoqDN2IfQhEl8kRg7oaeE4v93BwlOpFZE1dYoNxXXy3BVteoD1qF5R7aeViV85xr2wMHJhbYnwSQkpEg2AqO-tqF-TtV51151ib_m2zi6411C17e1o11K4cNK8GNb23re11Or3F1or1O53JOBuGT5oEl11r1v4WayhrX3evX24zrgL16Zr1Yj0ATR1QQR1ql9L16A14NFfsD_iFumfe5FiSDG1qNFF25FoSZiiH9CyqNK5wieiF5J0qX3uwrA04iG22aa1vlv6caa2xix0Ggz9G982JgEuwrZuc9Su3gz9vrs62gf6caa2vg59G9EuwrA1hh6i3L-1sb3Dr5REfJ267NXp3Mnwaib5HTYwDhqWRk6npF-WD2fux5D_Uu30FW7JA0bH7pPBlzk-Uz-TRlDyxrV2vv31vebozMaEv5yUEW_NkuHFfYu93QA6wrVp45S1t__14f_Xry22Qa30vp311122J3y_Xg1Xr1mOJ92rQpX1gu13xg31ar2e5TPuqaI5waS13Oeuwa1__N1u_-G24i7er9E1Y91115819X1114c12AF1v5AuIv2vD1p0v92y35Xtvgb0qOeuwa1pH5Sur4__J2Q_-a5mrmn1xg3nv111rl1rJ531y517k93oxVX1gu13qg3ur5SpJTj0qOeur1I5wa1__N1ht_W28a8gv9E1RT1115819D2nJ4c12EG1xOIL174r1QE1xB7ozQp7xaI5wa1pH5S1t__17w_CreS2FX30v0V11122J4f18a1Y11hOv9ByBv2vD100v9-hzXG3cTWpH5S13Oeur4__J2Q_-a5R1kb1xg3nv111rl1A12a1iD17k93tzVX1gu13qg3wd2uy1Tj0qOeur1I5wa1__N1ht_W28a7er9E1RT1115819X1Qr4c12AF1J9Hikv2vD1p0vi3iZTFyrTj0qOeuwa1pH5Sur4__J2Q_-a5mrju1xg3nv111rl1Z13e_VN14D101J9Cb4W23cTWpH5Sur111v1C_-Q88rwz15v1aJ40r7TcqQTHeJM81qW8paljr5117c1j1cTjsrio4DW03AQJ1avJd413i3PjpATI1QQI1qPh9AQz1Qvz1qiEdQMUwJ00wJ6t8DTm4vug1J5417T11aQ1dr1316c01aWp0QTEqcmsudaS1QgS1ws5L16Zr1Pj8dTm1QQm1eDw6BT2mr191fl1tFNFiSSmtFumfe9CyqNK5wumiSSm5wum5wie5zQCfsDeiSSmiSSm5wumfr5KiH5F5zQeiGMmiGNeywQKoSDeiFiKiF5J1rg82Jg42Jgz9xgSu4g1uFlAuziG6FgF92gs61gz91ld6er80wgFicgs61l82vl72Jl76ziFuFiGuFgZuFgzicaa2xiz9xgSu3lZuzlAuwa72Jg81XMilPigUAvv03aH4J59UO0hPw9W79to1ej1uGF-0f953J5-RHNPyWk2qdsaf196o6v_PFat7vaq6Ja3j7GdIL7QC_X33ras5DDv1vT53cab_K3eowJE73i2zMoAlfrq9c0d0z1k74HdReXtiGHu4H173JQ8dMXc21r21v92d4XCEMcSZH5TswaWrelwwqb__J23_Qi4-1a91xg3b1111rg1ZnN111GZ1qNCoGvf9qaI5wf__J2P_-X511mn1xg3bv111rl1rJ3t1y517B92r53X1gyG0v68Lt_6P5lM8FrWpH5S13Oeur4__J2P_-X511mx1xg3bv111rl1zr3X1y517k92twAX1gu13qg2r4W1qHND0qOeur1I5wa1__N1kb_L2118nJ9E1RX111581ul1114c12EG1aSuL174r1QE1s1Ra5rbu3aI5wa1pH5S1t__17Z_Bvr12Qa30v0-11122J3y_-D1Xr1mOJ92rDyX1gu13xg31aaieaObu3aI5waS13Oeuwa1__N1ub_c1X58qv9E1T91115815i1114u12LG1wN_L174Oxg2eIz_Qke7t3DS0qOeur1I5wa1__N1ub_c1X58gv9E1T91115819D1tr4c12EG1wJNL174r1QE1wNhtDTPuqaI5wa1pH5S1t__14f_Xry22ZO30vp311122J4f_Xg1Xr1hOv6iwov2vD100v6t35M4owaWpH5S13Oeur4__J1S_-54vrh61xg3vv111rl1zK-f1y518ki31a03L174r1TE1v655QepowaWpH5Sur1I5waS1t___M8_M1q82tr32vol114__J2n_Mi6o1kF1xg3cJ111rl1A11M1y517B92qQUX1gyG0v6hLt_HP6W58J1WpH5S13Oeur4__J2g_NO67rmn1xg3x1111rl1rJ4u1y517B937HLX1gyG0v9xLt-2P39g11gWpH5S13Oeur4__J2g_NO67rmx1xg3x1111rl1zr7j1y517k9372xX1gu13qg37CQk0v170qOeur1I5wa1__N1dt_o2eQ8nJ9E1Tv111581ul1br4c12EG1xvTL174r1QE1xOxpHN12xaI5wa1pH5S1t__16z_GJah2Ki30vp911122J4g17g1Xr1hOv9IpBv2vD100v9V0zTW11gWpH5S13Oeur4__J2g_NO67rh61xg3x1111rl1zv3t1y518ki41xvTL174r1TE1J9vo31E11gWpH5Sur1I5waS1114148_L1aB2er18r1W13N1ma1B4vlE8GQn6r191xXi1212521H02O3qesh6dQs1Ha1peX52evgevmd2Ag81Ggb4vl53drI1aaIsqO3pHyX1fc141Q0jG52qx6j9r9c2kv2mv1_iSSmiGN_iSSm5clCfwiK5clCfr5KiFieiGMmiFiq6FQHi4lEue119w9fuziG6caa2Hgs511c9xl82xix0zaDuFl20xix12aa1rN36ziG5zaDO6J2bv5oXh0L8qvXl4R-TbBLHV5Mtx5RuDo71Tu2Ti4_11iaHmKsfZA-VN7eWr5R1b0ll4rE0RSOHKBy_cYGrDrC0cHpCrpO0_CMGwJ2JOZJZFD2nM0a1t__18b_Zrqu2SX30vpy11122J241iQ1Xr1kOv5n8Iv2vB9E1qdX_ByD0eOs43aI5wa1pH5S1t__18b_Zrqu2A930vpy11122J3u1qN1Xr1hOv5k7Bv2vD100v5nh2XY6rJWpH5S13Oeur4__J2Z_MD5zrmB1xg3zv111rl1SJ1W1y517k92pGLX1gu13qg2ov1L9cai0qOeur1I5wa1__N1m__m29D7er9E1TX1115819X1yr4c12AF1v5c9kv2vD1p0v929JDzpeai0qOeuwa1pH5Sur4__J1Z_B95iJmx1xg3Qv111rl1zr4c1y517k92i43X1gu13qg2iAiFtvgb0qOeur1I5wa11191n__41XO68J1n13T1s51P0r1451i31JiO92J9311e52535sT7jvg3qrg22x0jpETU1QQU1qT19v1x11DjLv6A11D2n11_tH9CyqNK5wumfe5FfsD2oSDF5wiF5wiKfwiHi15A22aa13ix0Hry1xix0zaeu4lsuzlSu4gFicaa2Jl46ziGuzaD0FiE9J8uxv5D_PFdyGi33GNvpz9y4vs2ps951cQC8CGEf10mg1q23mjNJbN12W4kp3lApv5gEkN3FgPHcFCS8HpD_zQpEdPqrwI__J1Z_B95iJgH1xg3Qv111rl1zK_P1iD18ki31wgAL174r1TE1v5X4zv-2cNWpH5Sur1I5waS1t__17w_CreS2x530v0V11122J4h14l1Xr1hOv9AuIv2vD100v9NyFJF3cTWpH5S13Oeur4__J2Q_-a5brld1xg3nv111rl1Av2j1y517k93uFnX1gu13qg3ySXBivTj0qOeur1I5wa1__N1htVT2rX5Cr9E1RT111581uN2Ar1111-H1zVX1hGDtzgp7xaI5wa1__N1rK_O22r8gv9E1RJ1115819D2nJ4c12LG1qvTL174Oxg2pBv26krIuclc0qOeur1I5wa1__N1rK_O27a8nJ9E1RJ111581ul1kr4c12EG1wvXL174r1QE1wLPyGNf9qaI5wa1pH5S1t__15o_B1tX2WD30v0N11122J4k1r91Xr1hOv5IpBv2vD100v5LExXT6G5WpH5S13Oeur4__J23_-J521lN1xg3b1111rl1X12p1y517k92izpX1gu13qg2y0vXoclc0qOeur1I5wa1__N1Qb_D29l8t19E1RD111581y11114c12LG1zgAL174Oxg3toz_XorNiv9g0qOeur1I5wa111o_Db_D29l5M11Y15v1lQ1S14a2uwaper1W53a30qsp4xJa64J13c1p1vTpt7ON1aTNdzJ3t3Xw5GXL8Ws2ha53eQ52rqxX1fm13AOU1sTU1aQU1qTnL16S14NFfsSmtFumfe9CoFiK5wumfe5F1qMmiFieiGNeiGMmiH9CoSDHi4lEuwrZuwrZuwrZ9xgEuwrFiF9fuwrRuqlS0FaDuziG6Hgf211s611c9vif6elFicldiF9d6er79G9R0xlz2FidiF9AuzaD0xkDgJQ31WNVu0aj5e53210ipcmSyFJ2q15O_Pt-L9lI21934A0o9xXXuGDgd5XQ21r3w7j9I8LiH4load3i5JX94vv8345Ihv0upGXcdxEo9qY8iHJsmbVSDib-LJrdxzq_3rlZoqJZ31l3M3DVLA6PGAT1__N1kb_L2117lJ9E1RX111581uR_Br5F12EG1ac9L174r1QE1aXRwQabu3aI5wa1pH5S1t__17Z_Bvrr2FN30v0-11122J4j_-D23v1hOv60qkv2vD100v6u0DS58FrWpH5S13Oeur4__J2P_-X511j71xg3bv111rl1AJ3t1rT17k92r53X1gu13qg2rJS4teND0qOeur1I5wa1__N1kbCO23O5Xr9E1RX111581uN1MK_511GZ1s4Ka5vbu3aI5wf__J2P_-X511mW1xg3bv111rl1X1111rT17k92eDnX1gu13qg2wwsurHND0qOeur1I5wa1__N1yb_e28l8nJ9E1T1111581ul1614c12EG1wOBL174r1QE1wXhtz96pqaI5wa1pH5S1t__14R_DreZ2Hg30vp111122J4j1111Xr1hOv5ZuBv2vD100v5B74OG2qQWpH5S13Oeur4__J1C_M55mJj71xg3v1111rl1AJ3X1rT17k92oxVX1gu13qg2ieaHpJaY0qOeur1I5wa1__N1ybA-28l60J9E1T11115825Q25v1111-H1qAX_-UDowi6pqaI5wa1__N1m__h2ui8nJ9E1T5111581ul1hv4c12EG1scgL174r1QE1sOndDNuiGaI5wa1pH5S1113_MZ_SJs92rX1w12g19e17ceuwr9_q5co1v0j7sssp4THiqX1p21T1xc3L16Ar3ah66Tajcr3qer266supJ2edW6Uar00ar6eq45N15D2wwHut31ZK16A1312n11o1fl1tFN_5zQCoGMm5wiFiSSm5wiF5wiFfsDeiFN2oSDFiGNF5wieiH5FoFiFoFieiH5Fiw122vl76erf6caa2xix0zaD0GgSuwl72JlF2Hr82caa2xix0zaDuFgSuqlEuGixuwrAiFgSuwrAiF9d6er8ivrZuzgFicaa2Jg8iF9s61aAuGi62cas6GazuvqV2rOi2c9DpxlC21D3vOnO1U9r4FrUpzgy4vg22aMWqRa3u3TUuvrB1mAr44vxgJr61zed_I132Ko-rvr51s13Tvyoh8-xa31PERaTy4QR0QpZtwXP2xaz8DHVv4aUy4vUwCAgjxA-06mctqQm0egUy4vU9wQy2TiBw2an8HhnfoOpU1rJp5WHtq8__J12_-54RJkF1xg3vv111rl1AtMf1y517B92wD-X1gyG0v6nLt_SP6C0owaWpH5S13Oeur4__J1S_-54vrgc1xg3vv111rl1AbMW1y517B92q5xX1gyG0v6uLt_BP5S5owaWpH5S13Oeur4__J1S_-54WJld1xg3vv111rl1AKMD1y517k92q5xX1gu13qg2w1WirGDS0qOeur1I5wa1__N1ubVT1X55Nv9E1T9111571u_g111iPJ6toaM8owaWpH5S__N1ub_c1X57cv9E1T9111581uO1115p12LG1wN_L174Oxg2rIz_AIe3t3DS0qOeur1I5wa11191yb-X2SJ5Mv1J17Q1UQ1C51Ji8HX28x1Y1qQ612vr719g77O-57ivgJ0zqWOFkSa256a2savHd46TiriHsAPf1sYf1aWf1smnL16Sr1HtyWaVhwT3ezT2yQyX1fm1515gdccU7100715g0rXy3qdX1fs13Arw1saw1agw1ei0L16X14NFfsSmtH9CoH5FfsDeiFNFfsDeiFNFfsSm5wum1qMmfwtiiOHmic9CoSDFFsZufw9KiF5J1qlE2cgs6v939G9QuwrFicaa6ziG5c5D0GiRov9Su4iF6FiGuFgFicaa2xix0GgE2rgs62ls6Haa2F9A6caa2xiz2G982xix0zaDuziGuFgSu3lEuwrZ2JgEuwrAiF956cgs61gz9xlE2TNno1943F6NnCb-S6MxISiKorq4yaizp95jy60rqEvSGwTE6eJ0i_Lr5rr32o0ztwrUyPY2fANSowaSowSR2vg76irWtpGEhJ5Cy2JBpaMH7vrP1r569vsI_w_-XndlldNNbv9u1aOxp1933F5Ehra82R5Purr221A--w277AXmfG17uGNUyrgy4FQUpFQytaDSs69BFtN91zJOde1x6qXWowia214__J27_B95q1mB1xg3vJ111rl1SJ1M1y517k92twAX1gu13qg2r6u1u1vW0qOeur1I5wa1__N1UtA-22O5_19E1Tr1115825Q29r1111-H1wxX__3Dy4X7i3aI5wa1__N1wt_l1CT8gv9E1Ta1115819Z_Br4c12LG1eOkL174Oxg28Iz_OIrnprD60qOeur1I5wa1__N1wtA-1CT6219E1Ta1115825Q1Sr1111GZ1eDq8qiu2qaI5wf__J2i_MJ4Eva51xg3cr111rl5qr7x2d916k529ov2mIl28mNm9JD60qOeur1_ur111v2i_MJ4Eva512T10v29r2TQ8cXu11ar2r962qv1oJD_4aNu1JDk9q505Bv2mQ1o1Wa1hr13ev1211EX1fl1tFumfw9_5zQKiJ5KfwieiGMm5zQKiF5J0q1Zucgs61g79G9E0zaw5c5DuziG6car1Jl71q9EuwrAiF9d6er71rX2bhXDtq_bJCjQrJXfy3vPuHru2v6_iDc8u4e0qUgs2D5IoqXb2shy1ei2H165pFQCp_CY_Te_yJ5_ww1JqDTHiaJ1118_Q__t1CT5Mv1K18s1ecQhoJ1T53v3p3vH5vv99vaKoFNKwGN4oDlWsGa30q0s9Eax1Qgx1q9Oevcd37g91DQndeCY8vi18vvq22hK1v531cgd4qGV1fv14r6S14N_5zQKiGMm5clCfsDeiSSm5wum1qMmiFiFoFieiGMm5zQKiw1w2xix0zaDuFlq5wrAiF9d6er8uFgAiF9d6er82vN42cavuFlA6caa2vrz9xgSd5Nm9zlYU1DXp3DZ2vX9n2JWuwmJse174rg2pyaui505_YFLlal2nwlX03Jmnr5W1rJOywQOPt5p2zNC0w9nu4JuQfNBowD32FNLowOVd611__N1fK_w2qJ8gv9E1Tl1115819D2q14c12EG1wlZL174r1QE1wTVyQab13aI5wa1pH5S1t__16BMKvaO2rT30vp811122Je01ga1111tOr5CLt_JP4Q_8J1WpH5S1t__16B_DJaO2FJ30vp811122J4v14D1Xr1kOv62rkv2vB9E1anX_-qDeFDb13aI5wa1pH5S1112174-gvaf2rT1yv2Jr3rFiH9P13iz13Droq1P1GDPt1g15c1q1c0T1J6h1J54pvQl83UX1fh187aX1agXszv3y46E9r6f9r679r5chv12d11211EX1fv1tFumfw0mfsZiiWSmtFiK5e9CfsD2oSDF5wiKfwieiH5qyqNHi3aE115s2Haw5xix0zaDuFgSuwlS0FaD0GgSu4gFicld12lS0Far0GgSu4iG5ri31vgz9zaDuziF6F9A24Qr_xo-N1r73dNJrrl531g03QJKuQyi1lqD2z5ehV1822VTEoTNp1Hpswgz318D1frIXZ_-B_BntGOJyGDWoPcn-cNSwEvApQcQS_ZnUquF7v8JzFXllbZI_WI-GbB_UdNRyJCY1t__16z_GJah2x530vp911122J4h17v1Xr1hOv9z9Bv2vD100v9Y93Qv11gWpH5S13Oeur4__J2g_NO67rld1xg3x1111rl1Av2E1y517k9303qX1gu13qg3p2XT8J170qOeur1I5wa1__N1dt_o2eQ8819E1Tv111581uX1Mv4c12AF1J9z9Bv2vD1p0vi30T5Eov170qOeuwa1pH5Sur111v2P_NO8Vra314v1qr3Or4N541J0i3gkt4Js9w1J6esoe21c1q6Y416g4160415i26Q5jrr3q1r221P03SQojrO43Jl877TZ1aQZdwl3uGAX1fs14eOE8EP21aY2dQ53rqqX1fh13Ee81as8sal3eHVX1fc13Eaw1agwsci35HxX1fl1tFumfwNFfsD_iSSm5zQCtFumfe9CoFum5zWmfe5FfsSm1qMmiH5FoFiK5e9CoFiF5zQF5wiHi15d6er80wgFicaa2Ja76erdiFiWicaa2x5x0zl72xix14ar135v6FrAiF9fuziG6caa2xix0Ggz9v5R0zlAuwrE9G916erdiF9q2wl54v6gUeHQsKZ02z6jk15Yjf8-GMnZ2wKAQtt-I16C1eT21Au19q9bzu4uL4TT3cuVz08-xJ964JqvGIZ-Mu-nYuN55cTRg0Xb56Yy3ziGbo9k56J-pWdEchQ2o-D2oJ8Onq9L6cXWqGvS2Ho-iJTh9q9cIUw-QLqfL15p__N1dt_z21X8gv9E1TO1115819D1zJ4c12EG1zlZL174r1QE1zTwyQao9qaI5wa1pH5S1t__16zMKvry2tX30vpo11122Je01e91111iPJ9C4FQ_3G5WpH5S__N1dt_z21X8t19E1TO111581y4_IJ4c12LG1Q62L174Oxg3eBz_Voe8trOc0qOeur1I5wa1__N1hK_h26J8gv9E1TJ1115819D28J4c12EG1qDPL174r1QE1w2Si4OU03aI5wa1pH5S1t__17k_Arel2Al30vpi11122J4f12r1Fr1hOv5Mtkv2vD100v61551DpxrWpH5S13Oeur4__J2E_Qi5f1wW1xg3z1111rg1Zr1111GZ1wr7u3DU03aI5wf__J2E_MQ5f1lN1xg3z1111rl1X1111y517k92uFnX1gu13qg2trTMiGTQ0qOeur1I5wa1__N16tC429D5N19E1TD111571uDa111iPJ5ApFgK7xvWpH5S__N16t_V29D8t19E1TD111581y4_A14c12LG1wQCL174Oxg2tBz_NBr_ueTT0qOeur1I5wa111519__V20J5N11M16Y1o11x9cg73JOv6cgYuFl_pev0dvWU3r003r50239x21rt07O11sT11aQ11r1JLv6S11N2mJ1_tFumfsDG5zQKiGNeiSSm5wi2oH5FoH9CoFiF5wieiGNFiw126cldiF9s61gz9xlw61gz9xgSuwlS0FrR9G982xix0zaDiGgS2Jl70zaDuzifixrFicldiF9d6er79G9E2Jpg31vGwA1SpGWp5FNO0wN93vr373XLp3DSBHr-QCs7uqEuz1579gvGd7gUywQUkkma23trhJsvowl7_RmtsFvU4wDWFFSj2vvBpAACl1g31QQR9D553Jr8yqQPyrD81t__18b_Zrqu2Ki30vpy11122J4g1211Xr1hOv5LoIv2vD100v5M2FDT6rJWpH5S13Oeur4__J2Z_MD5zrgc1xg3zv111rl1Ar1y1y517B920xjX1gyG0v5OLt_MP3Jz6rJWpH5S13Oeur4__J2Z_MD5zrl31xg3zv111rl1Av1r1iD17B920GnX1gyG0v5ILt__P3Ox6rJWpH5S13Oeur4__J2Z_MD5zrn_1xg3zv111rl1Z11C1y518ki31wrDL174r1TE1v5Y4GQH6rJWpH5Sur1I5waS1t__18b_Zrqu2HJ30vpy11122J4n19O1Xr1mOJ920xjX1gu13xg31qWipw5s43aI5waS13Oeuwa1__N1m_V129D5-19E1TX111581uN1Z__g11GZ1qVuoxgs43aI5wf__J2H_Na7ZJmB1xg3Q1111rl1SJ6r1y517k92wQVX1gu13qg2arseeeiI0qOeur1I5wa1__N1u_-G24i8nJ9E1Y9111581ub_Br4c12EG1a21L174r1QE1aisrFl78GaI5wa1pH5S1t__13__Vrqu2A930vpw11122J3u1iD1Xr1hOv5Hikv2vD100v5D0zr_6qXWpH5S13Oeur4__J1K_-Q5zrlN1xg3QJ111rl1X1111y517k92yFLX1gu13qg2rrS2uHaL0qOeur1I5wa1__N1o__Y29D7fr9E1Yi111581uO1Y14c12LG1wrDL174Oxg2uBz_-BrZieaL0qOeur1I5wa1__N1ib_m2zi641971I911t__17w_CreS38N30v0V11110v4lbjN22J3u1kv2_v1Zr2i5q129q4DMg1i3pJ1IpH9qg1eoL154r1CosvTj0ri3ydvCrrTj0qOeuwaI5wa1pH5SuqOeur4__J1C_-Q88rmx1xg3LJ111rl1zru_1y517B93s6qX1gyG0v0fL17oP6mx3HTWpH5S13Oeur4__J1H_Bv6yJmx1xg3F1111rl1zr7j1y517k94i43X1gu13qg4iCOFtcOi0qOeur1I5wa1__N1lb_62PN8fv9E1Y11115815i3114c12LG1a62L174Oxg2qoz_Hoe9tciI0qOeur1I5wa1__N1lb_62PN8gv9E1Y11115819D3hv4c12EG1wX-L174r1QE1a6SraJwpGaI5wa1pH5S1t__188_Hrkb2Qa30vpr11122J3y1d11Xr1mOJ92wQVX1gu13xg31agyeQJwpGaI5waS13Oeuwa1__N1u_-G24i8fv9E1Y91115815i1vr4c12LG1wiFL174Oxg2yIz_LorVi1gb0qOeur1I5wa1__N1hKA-26J5Cr9E1TJ1115825Q2iJ1111GZ1qN3oFaU03aI5wf__J1a_kX5zrwJ1xg3zr111rl5qr5I11114ol2irTHuHTT0qOeur1315BMLvbW2k11t12619H1aFr1tqrQtc5tr1gP9Gimoe1m1eST016h0169016Etr6htr5M13r4u7TD1sOD1aTD1wej9ATz1QQz1qitqD2kr7P11D2Rtv5-tvh676aghev4731ULv5_11g2oJ1_tNJGfe9CoSDCfwiFfsDFfsSm5clCfsSmfsD2oSDK5zQK5zQCiFiFic5FywQHi15A5FgZuziG6cld6Hgf6cld6er85c9FizlAiF9d6er79G111Ja72Jg82xix0zaDuFlAuFgZ2JgEuwrA6ziW0qgR2vl72Jg2xAAccwgfwwaL4vgo6vN85S9YxbKn4w1K6GvAg64-GKVtIbXzpd666qN_owlq9GgV5e9tisQPj192cr5I8erfuzin8J9hS157A0WiqZ5Auf3EssiwqGNz_bZ-mrQ9uqJMev6M1Ue_aYuU0s9S0HDnr5h96cT32FJ-0FQ3d645U3hxfxXJ1114_RK_DrqX2xi19r1O14Q1mBg13qvv94g3Lt_1r3X045v31zOQiz9e4HTb7v9j3rDIdGPIpJ0ppJ5I8r1LdGCIov0pov5L02lQ6JamL15Jr1YQiJ66iSaF1zi6L15-14NFfsD_5zQCoGNFfsDqye5FfsDeiJ5KF6DGiH5F5wiKpFiFoFiqyw5J1rrs611c9xgS5wrw5zl722as6Hgs61gz9xgSu3rciv1s61581HlGuzaD0xix5Jlx0Jgs6qrQuwrE0Jyu1qK-aKXPpDXw5Jdh_KTq3Q9DuFX32v88D15-_sv35YmZCN38k80ruwX71d924l6B1O6-LYz-X61I1qux1al2r-QzmFl98c5kpwmWeN4A_LUZ_v8XIKCM4jAfh0FNNvrpbEtt5oiT0dvb11512KZm2rX6M11Y15W17JO522DmpH5t9HNzoGi49AOi1aTidvJ341v3pov2oD1yseT27Ers1aassea36q11oFumfwumtFiFiSSm1qMmiH5FoFiKiF5J1wgFicaa6vgz9xgR0Gg5119s6295iF9AuFgFicgs61rz911eu29104iG21rdiWJ6eq9ToxOwuKBQ_KU6sJ5vbZVNqG1XpwZ-YyR-L_V3mv6g1wypeJdLeEuFnwDUdv97etVM_If1T_VmOEeZuwDHmbT2LJ8yl18q1hMS11oMwt-n2d17Qr1E14l1ja1Gu11c53539q5C4vNg8HvK71igprvcu6vR1ql0q1Q2u1QJ3ArJ1saJ1agJ1w1Q5eas7GqX1wM13WTojvO3qrO23HO1oFumfwNqyqNF5wumfsDe5zQCfe5Ffe5F1qNFF6DG5wiKfwiHi1az9xgSu2iAuriE9G976erf6caa2xix0zaD04iG21r15caa135x0ciq6er82caf6ziGuzgSu3gQ1qlpo4Or2rITLRyto3JZpQ781rjOD16H1cD2dUI-YtCFqMaD2vl86dWASNY-OtBI2zOIer6Dc4v3Wd5ZixQTpcJWyjSwjBW-ZbBA_OxT-KCiuJaC_KBHHkxXy1JNnLc-EtAW118MGb-n2oJ7ev291pc1svTp72c1r5TI4FaKur9S8zJ31zvE0vNnrDmpeSY8jQl4eFJX11iTdGcIp10pp15TtxXG06TujvD3qrD24re026Q5jrr421Hj47Ti1QQi1rJ8ivlG2HO-L15Jr1Jd5Waqhe93ec925cLX1wN1tFumfe5FtH9CyqNK5wumfe9Cfe5FfsDF5wieiSSm5clCiSDeiJ5KiFiKiFieiH4ifw9eiGNFoFiKiw126caa1GaAiF9d6er82rgs62gFixaAiF9s61gc93geu4lEuwrZ5zaD0Jg56erf6caa2xix0zaD03aAiF9fux5v6er79G9R0xix1fi95r7ZL4iPt6FMrJc6mZN274vmjYR-IKB2OrDu6e95xKCDuHDXpahN1rT2FJMe9cnU1e52HzQY42yLWVa6yw9DbtBMpH9Ai6Jpr7UqA5Qq1AWt0Vl2e9Gz7evz7J5vz2in5hc894XcoqgVPS6NS8ur5FjlpwN7oJ12_WF_WvqD2xa1t12Or4T72c1D94r3u4r-8ql24JNj6v1jyDTBdzPUyJiBirNuqvSj4dTu1JD2qcYj7ETj1HTIpJiH01iQ1HiHLv5J12i2tJ1_tH9CyqNK5e9C5wumiz0m5wieiSDe5zQ2oFiF5wtiic5FoSDFoF5J1riAiF9d6er79G9R0xix2Ji72xix0zawuwrR2vgs62ld6er79G9EuwrA04lAiF9fuziG22aa2xix0Ggz9v741ICWCBrCpDmsaDcoZ1v2yqOIye13TKlypDiAiS0J1eRL7GNc7yUzzv64yxva5ZRtcvaH_W1F06aPyrv9ybSro4TBpJqviG1U89vR5rXD93XAcQmEvCDQ8c9IsQrYtJvP1112164MGrsr2xi1yr3rr1Xq8HNz6cgtoGT2pxT14Bz_J51C3rC94JNB2FrD8GiK9FNz1GiPiaTHdz6UiriH0Da9srcW31i927T11aQ1dr1311TbfJT221T53x5RL15Jr1Y6uSaZhwl4uHQcL15_14_iiSD_5zQCoGMmye5FfsDeiSDeiSDeiJ5KfwieiH5FoGOFiGMm5wiK5zQeiF5J1rr82xix0zaD035G6caa2Jg76e1f6caa2xix0GlE0xl79G1eu291iF956er79G9R0xix125a6ziG11rF_LI66clYyr7B1d5PtxsZijThy45SpFXca1dHZbXsSr65Ufa2iwOY7xjskgb-zTpvHr5o1W1tf1H2pEuVrxNcqLLwk_BzGeXbo51Mf44GPfN30MJ38r60W5lYr2Wn_lk-HlUr1rT11151mbAA2Jv7rv1X16m14r9m8egt4FT19q5RpFyX1w217AOb1aTbdcN38J0j9dTc1QQc1q511v1311vh0oT2tJ191w11tF_i5zQCoGNeiSSm5wumfwN2oFiF5wieiG_iiH5Fiw12uxaquqlEuziG6caa1Jgs629d6Hgd6er79G915waDuJg6519z9xgSu4lAuqlE1zaDuzgFicgs2Hr2zlv3ucD31wJzr4il877irsc4yqPw_xv3YtZ6j75Ey1Hi41vw4FQxpzD71PQNfv5fBae6rEMBz_N1-9_c_QGZiQs09xaC1c93kFrj7qSc_Kb-OFvP9Hj7_b3b1rxIEaOJt4pHCJ111bCK_IJ50rfs14O1sa1z0vNLtGX3ox1Auv1pi1T33ca393gIpJXH130p9WTxjx949z7X1qM142T7srhW2v072v574v1KiSSm5wi_iSDeiH5qyqNF1qNFFiHmixNrF6DGiw121c5a6Hg80wgd6er79Jax2Jgz9xgSu4gZuzlAuwrR0zar5Jl52cad6er79G9EuwrQ9w9n1caa2xix0J0B6Jv5415NpzvZp_VJoLcr0qJCqE9Ns1T82HG2_PkppD9DtQl2i19XbKEIo4NUy7l61tB2_baWCYuT215Bo3JB2cOpyGH30vg4462TyAMLy1921sN53qvI0qNYuAS0WCrh7waKpwQt1151ubZV2aX6B11H156171Xp6xOI6x1v1egi41lgdv2U110011510Bv2oD10ee6s5dae1H5813NFfwNFfsDG5zQK1qNFiGNeiGNrF49Hi15s51932vgz9xrSu4iG6erdiF9A5c9Su3lz9xlRov9Su4iG6HlduFgFicaa2xiR9G94_2DAsYuDPtVmhdkWhDmatrN7kHDEeaTEpTOQr4PkxZX-CzQOvw5h2ePZ_QZM1KB7bQ8HFZPCkTsr1eQ4nKvja1931vOFpdg51vio3faYr1N11151ItZ02DJ79r1M17dD14aS8JAX_N219rQuq1DutGOf6HN16QTddchU6vidoWgL1aaL1qXj0ziF0Iv2oD1u3vhs2Ea71Qg71rgr7Iv2tJ1_F40mfe5FtFiK5e9CfsDeiSDqyr5KiH5F5wiKpH9CoFQHi15d12ld6ziGuFgFicgs61gz9xg40v5R5Hr79G9L1zaruFgSu4gFicgs61l76eaQ1wgAiF9s61l72Jg72Jg3ydv2QxVGOSlzrDiEp4zemd4kN6z-5Ha5tqQRtrg07HrMpxQM7er27J56gD5GaPgv4AcPzH93P6Z-7a4VTGizy3htgC52yZ930coMU3vGoS4xz193YgfPiwX-ibnlj7OISJ6DzQhnhtvW5XhIkJJ1118_TtXc28a75v1G153Z3JODi3lj8GUX1w217ecs17a11Qg11r1a61X926a5hrr3evr221X1oFumfe5F5wiKiSSmiFN2oFiFiH5FoF5J2w9f6ziGuFgFicgs61gz9xgR0xgz9vl79G9Su4lA5c5D0GlE0xlEuwrAiF9w6cld6er31rCrqj-vkTgg5xTZB8ScHwseuxhWgHicj3dlTrv42erh7wQWU2131JhQcqczeJDVossRicJI6xJ0gzQkn19t1d6sQ6mVn35cpqTA_QXXpEhSMbZS1112188MK1Qp2bX1uv2Wr2508v14pc9Ui3M1oS1K1GNq9Bv2oD1ke2Ca8Ern1DO0dJWI3ruo16O1jJ1411Qn1JNhL15Kr1CWor67osgP1xDH4Jr54Bv2tJ1_iGNrF40mfwNq6FWmfsD_1qNKfwie5clCiw121rg79G9R0J941Jly1xix0zaD7J9AuziG6ciq5FgwuFgFicgf5cid6Hgq2egs63ix03gE1vaW_KgFwzhqoeG7iVXj5eDE8w1ArAs4p669q4Q_qW2bTeNPk56i7qmq7e1OV15hhRnu_KUMgfi5i_GETA7Ulr9b1eoM1puve2J_oY12417e1wLVTC_-EtCl_K4J1EVaSNty_IF-OE6gN_Cx81YadX8U_100118MFb-J2vT7wv2516GH42dX_N214JQiq2asevM18D13r3iHpkv2tD1y9wlZysa0hrQ3evQ23eLX1wC14wSjydTC1QQC1wW4rHyX1w11tFiKiSSmiFNFfsDqye5FtJ5KiNHm5wiKpFiHi2iAiF9f6c9w12lZ0JiE0xlEuwrFic5a2Jl32xix0v141xlf1Jgf6car9G9EuwrZuzawu3lEu3lR0xix2Jgz9xgSu3rFiPQt63rfctb31qLn2ra61Haj5ExL21949Q6PEKBgKbHj21v22reTu55731Q51JJpnfsXdsTZ0FQ27odv2vv7uDF-A_B7_cHIPRD2moEYwDiEmtSZky41_K2_hv6y1w52W65__zlLGUha_K06pxWaewJ2lQy5fVYVnws3rGDWkgD11bCp_Ni741fN13J1sk5Q4Iz_J51l3rH94vXL1J1b31598cQa11a63Dacsq6W9ric5kv2tD1i6Gmj0ATR1QQR1qloL15K14NFfsDeiFNFfe9CoFi2oFiFF6DGye5FoGOFiw14icgs63ix0zar135v125r135v125D5ziG6er82v9s61rFiv1e53rz91r52cfWiQ3me7944v8G1sQ2jbCn_IR-Z_CFKRM5pHHJ1ebuVr5F_PKr_Lo-OKBizJyDrwHLEaX21J60_OF-UbVe_l52gJ5sVr7Is4gS9tBHYIBL1lg2815lY5sKQw111KAA_-l4Bvgz13a1ir2Qr4aL9q5F5rNjoHT37vQT4vX14JQb3r904clHjz52qw6hir9H8ETQ1aQQdqr303Tw6GTfpcl68IT2i1161wX1tFNqywQKoH5F5wumfe5FfsDe5zQ2oSDFiGNF5iHmic5FoFiHi1575er79G9Eue5DuFgZurr76erf6caa9G9Euwrq035G22aa13ix1Gi81HlduzgSu3gz1qi9u3gUiHiy2KBfVqDPcD6sCr7N1gBw1wk-UbQmuJr36dNPF0VCTr0gjKCjpzlZpv5WRK_zKkvxPA9vpxTQdTeeYJ5rgL_jBtBn1Gt0_R5u2w7WbZyQ111318fMJrxx2nJ19r1N18m1oG9aori113vT7w5r4v5y1312931-y2W6osaPhqD4oq9161rIpHhIur6pusTS1zalL15Kr2go2Er71aa7srg32c6QyJ66ySaB1zOdL15_14NFfsZiiWSm5wi_iSSm5zQK6FWm1qNF5wiKflHmiH9CoFiq6FQHi3af6cld6ziGuzlAiF9d6er59G9Q1Jgz911e511civr16e160xlE0GgSu4gFici-1zaD1xgz9v1e61rFivaY7rcqtCE3rsDJsxvLiKBTOjI-CU-TE_Bl_Rg2Dr5ZNr5z1r4Mw39byGvYtxWxZfeOojfhGyt-Yr5sFA1C0JGgmdTQpaONpEdkZ16wor6O1rJ2mv9BRKCmTbZEwxaTqxDP6GDC_PaAO9pYRr53xKXN_L3VNv13_WI-wvj82vr1tv2i1801ir1lqrOryJ5Bp45lr39x5HH9tAv_1zNW12uO5J6o5SOw1cu6oQaL6STWjxa3qqa20wqX1qM14rQ6srsW2r072r564cnX1wX1tNJGfsDeiFNFfsDqywQKoFumfe9C5zWm1qNFiGNF5iJGoSZiiH9Ciw126cid6ziGuFgFicaa2xix0xl10eid2xix0zaD0GgSu4lAuwrR0Jg76erf6caa9G9Euwr19w958vis61g81eld6er82FivuzaD03l3HXVFE7HF83NLodpvhpbQxKB-_Piu1wDYpFQ82Haa3JUnJ2Qgh5Ws1e120GJ2fYIgTs8kJ_CS4riy66v2iLz-Ajg2_7I-XKmxy4cggTyBNr835bCZpFJBo4VLIwX-SurNp82F2ZYa3GlR7WYRwh127cvcbhVJgTwbyJiIOcDzyTF0LzYMMrN11r1P_vr6e1dA13O1gorc51115oz_J51x3rC9521P6vQRdquY9J099J5z4vXnpv97dvhU2v002v57pIv2oD1i7eCQ8v668Wan1cXw13NFfsDeiFNFfsDeiH5qye5FfsD2oFti5wiKpFiK5wiHi15a9G9R0xix22aa6cgf6v1s611z93rSu4gFicld24iGuzaD0xlQ04aD14iv2teaiwXCEp_-BsUeDnv21KVNBtBN_cS1oqDzu16dLgz5VgF-DKBB1h4F1j15XsgXikCkaZTMyQ8-RyBk_PKfExP6rAhRIgk9B3he_TZl1eJ11bBw__v6nrfm14O1rQ1m1cas2c9q0zaSteJE83iz3qJ16STfjcl3qel26GGV1qN13r5-14N_iSSm5wie5zQKiJ5KiH5FoH9CoFiFoFiHi15d6H9s62ld2xix0zaDuFgSu3lR0viEuq9W0vgs62ld6er79G9Eue1cicldiF9ZucldiF9d6er79G9W0vu51JOz3vv_u3m22rap2vil4vz-Vk_Y6HgApzPH1zmkdWYjqYPpezWiIWXCo28-_6l626jE_n0R6huDkFQI439c3HFuTWv2covY4rvOf2rW0e9EyfCs1aX931a32JgGtGDC4Ja11bZ8_Ml6s1hP13N1g51T2ciwiq5bpxNUwGT4pv1k0GldoqNl7v5l1eX4dcCU8v008v5norXyokv2i51phri2evud1J946Iv2tv1_iSSmtFiK5wumfe5qywQeiH5F5e9CoJ5KiNHmic5FoFiHi15e535G5c5D1xgR0zaDiF9d6c9s511c9xr30JiD0xix2caa6Hgs63ix0zaD14iG5v6T1jxSDqrt7ePY8QND7_Bd_LZY_LMG1vWtaVfy0xhTqWX2sNf9KrtY_KFMTv6r1wPz1sCmwWgLjGkW_T7k_Wt-toO2wfi2UoAkYAJe9q9vgh0jO157_Kg11bX5_B15N1mn13a1rQ1a4Jvr715g73l9gvN2rJMw4J9t6q7X1wM14rg3jv92qr0h1v933HdX1qN1tNJGfsDeiFNqysSm1qNeiGMm5zQHi2i39G982xixuwrAiG115HiA5HiZuziG6caa2Ji42v972xix1GgR_L4HtaiO0sxkn15u1sPyAdmVlw5da3QXw6CWugDGiG0jqvT01Ma3GwXYmDHQ_nt-YKDA-r6B1aVOw4XKomZ-NKBeE_VgseO21xim1112_cw_Rvb02G51tv2br3Qlu25433i9kwr2f4r2qFr2acHx8104816z5r655sre1c5lu1ifyqXLykT2tJ1c1qM13ST4jvi3qri21JOfL15K14_iiWSmtFNFoH5q6FWmfsSmfsSm1qNK5clCiw1w1v1R2xix0zaDuziG229w6clw5ciAuziG6ciq5Hiq5zgFicaa2Ji72Ji84v9z9xlE1J942v972xix0xg30_CK_KBk8qrbtWT-Zv62JT9X0EH0u3JDeQ0WqDCQnDHXd3Mz57MviUX02eTDpsgg3APSu2LKqa5F8xNlgcl4j17n1wOe6wOXuFIX_cKMByuT1gi22r5oXAIk_Ow-PbBz1k92416efd9s0_BWNCbMRGJs8epfqr5V1sQ22IwMtNaB7xO26s111r25_mN8lrfG14O1k51I13Ns8JrR4wak7Gl18Svbj2N38HsO6r6k6r606r5soAiK1srK1aaK1qNgiIT2oJ1U1qM14vT7h1g2srg2evg22c1gL15_14_iiWSmfe5FtFNqysSmfe5FfsSm5zWm5wi2oFiKoNJq6FQHi15f6clq6ziGuFgFicgs61gz9xr413l22xix0zaDuFl20xlR0xlE0zaDuziG6Hgw6HiqiF9d6er82vl82vytgZ31UVcP6xlE4GlAcsAp_J39_KWJ_nXno3QM7Ir2mZsDmeDbq3vBpsj47MMlCL5-pwNmvaPMurowWpzJ_IVS5H9Xi50iSv591bYG_k9ctGTE8lQ2OYAiRxlveFljowVZptBWnr5M1wh1pq5xERyXwv12_CB-zJku2Fa1iv2fr4915vl17c1j1cTju3D80v2j17T11QQ11r1q5vYWoJ67oSgK1xNI8q6U9r609sQc1x5f3Iv2oJ1_F40mfe5FoFumfe9C5wumfe5F1q_i5wiKfe9Cyw5J1qgR0xlE0zaDuziG6Hld6cld6HiA5xrFicgs61gz9xlE9G971Ji72Ji723ixuwr-1zl3soaSidqE5zXTueSqQsil9dFL7ni21h29szlzrG173Ew4ORMlgouK_J49h5ozzGD2Snj8n0kBpelYtxMMZhuoa053pwO2koPnexS8qrZI_Y8-Gyo1_IRoREaAo2mOd112124-bJgc2mO1yJ2BP11b7vXALt_1r3r04QvAuzDIpHY13vC97QvZd4mTuJiZ93vT96Qvjq13q312943X1qM18vO7h1g2erhs2v975alksHPR7Jiksr2W110711516Iv2tJ1_iSSmiWZiiWSm5wi_iSSm5wiK5wum1qNIiGNeiGNIF29Cyw5J0egd6HgdiF9AuFgFicgs61rz9xaE0xix2xgSu4l25zl69q9E2caa2xix0zaDuziG6HgZuziv6er82Jg21a0MQRjoxS1FhfmfpGTC_Y2VSbBhddYm39C2tr8sGPk-TKBf4QgRr3QFqoyUkOeuKCJm1r0Dx0K_19i5t6extGl-ozOYsVbetGQ4wGmssJpo1exF61im94u3r4miYvl43vcveS6ljbVR__N1wKAV2-a9qv9E1HJ1115815i33v8u12LG1QW0L15HOxg3aoz_fkerexDm0qOeur1I5wa1__N1wKAV2-a9yJ9E1HJ1115819D3lJ7V12EG1Qh7L15Hr1QE1QQeqsrP8qaI5wa1pH5S1t__15BMLvbW33Q30vil11122J4f1ar2zJ1kOv0dsIv2ik9E1WEX_XxDdaDP8qaI5wa1pH5S1t__15BMLvbW2Ma30vil11122J4g1sX2JJ1kOv0hdkv2ik9E1ExX_BVDj6iP8qaI5wa1pH5S1t__15BMLvbW2Gl30vil11122J3y1fi2JJ1bOJi3w5GX1w7F0vi3wIz_Ooeys3Dm0qOeuwa1pH5Sur4__J2y_kT8CrnY1xg481111rl1Z16F1iO1951i1J07a5h72vhv1J0aLt-GP6eloeDWpH5Sur1I5waS11o-0bBA3pv7sv2o16r1O51ew4ho1Hhywx5Hia1082JUpvEX_N21yvQiq1Q0sQ26ess6haa4ewDP8FiA8WTAjzg3qwg2uchy7aYiw6TnjcX3qeX28cQh2SaEhqg3exg20xAX1wM171Jrqc2j57Tr1H18k692qW0jav0q1Ji62Bv2i11_iFiKiSSm5wum5wi_iSSm5zQKiSSmiGNF5zQCiSSm5e9Cye4iiWD2oH5FoGOFoFiK5e9CoFiFoFifyw5J1wgAiF9fuziv6er79G9R0xix2Hgs61lWuziG6caa2Ja76erdiFiWizlA6er79Giv0c5DuJg82Jg42JX39G9EuwrAiF9f6zgA5H9Z6FgZ5zaD0Jg81AS1CsJO7_GJ1llVp1DqLTGRZvTr1kwb4GDCdKS53ahZwr5U3W36nItk_K4438Ua_57qzQeXVhYrg4gT5WY7I7GCNZxJX9Je272K2rcgDeS3R3T-245Mr3E0M3Qst3Ss4F-qjLNG2vTemwXMI165Qfa64ccw_KbvjZSkewXIurDou8r2o17izd9d2154n2XTsht__J2j_WJ5OJfF1xg10v111rg1ZlXh11-H1wnX_B3DuF1z2qaI5wa1___MGb-n2oJ9Pv9E1G11115815i2av9C12LG1aHiL15HOxg2aBv2nBewqws10qOeur1I5wa1___MGb-n2oJ9JJ9E1G11115819D2Lv0312LG1aW0L15HOxg2wov3oBeisFs10qOeur1I5wa1___MGb-n2oJ9Dr9E1G1111581ul1Tv9Z12LG1sWhL15HOxg2fov2Kkela4s10qOeur1I5wa1___MGb-n2oJ8EJ9E1G11115819X1Kv9Z12-F1v6twBv2ikiE1v6eL18eP66fua1WpH5Sur1I5waS1t___E_-K1rW38530viQ11122J241o12M11hOv5_tBv2ia100v67DQgNozgWpH5S13Oeur4___CK_IJ50rcd1xg401111rl1zr4k1ma17B92t4GX1w7G0v5_L169P4MpozgWpH5S13Oeur4___CK_IJ50rx21xg401111rl1S__H1nl17B92w5GX1w7G0v6tL155P5M4ozgWpH5S13Oeur4___CK_IJ50rlC1xg401111rl1zv131ma18Bi31a03L15HOGg31aqX1rVDe5TLuxaI5waS13Oeuwa111oMwt-n2d17Qr1U15T1xa27urs8eJ1W53a30qsi5vNl8HJK81il2qOi44J92avId3PTpJiI4rDtrAe41ss41ah41aiTt1sj2dT61QQ61raP42Qi7rJbpov2tD1pdvMU4J004J5t8J1KiSSmtH9CyqNK5wiFfsDeiH5FfsSm5e9C5wum1qNFiFiKiH4ifw9eiGMmiH5qyw5J2qix0zaw2G9Su4gf6JiE9G976erf6caa2xix0zaD04iG21r15caa135x0ciq6wiG6HgFicgs61gz9xlE9Gi82caf6ziGuzgSu3gQ1qlpo4OefCu5hQJpVoYFzGJOuGY2cJ57Iu12lr9m1sUU_Uw-lDKsu1g39WM9t3DCyqO-q5vB1vl66dWASNY-OtBI2zOI1br5hz1X1v53wA5ZixQTpcJWyjSwjBW-ZbBA_OxT-KCiuJaC_KBH3JvSoqOZ31z_k4Oit8ITbYzMYr4___Zu_B173vbR1xg4pr111rl1A1401ma17B92d6xX1w7G0v6RL16dP7mqr2aWpH5S13Oeur4___Cp_Ni741cq1xg4pv111rl1rJ0j1ma17B92i43X1w7G0v5ZL17kP4lP31XWpH5S13Oeur4___Cp_Ni741c51xg4pv111rl1zrpj1li17B92oqAX1w7G0v5JL19EP41B31XWpH5S13Oeur4___Cp_Ni741cm1xg4pv111rl1SJ761li17B92twAX1w7G0v61L17ZP51D31XWpH5S13Oeur4___Cp_Ni741bf1xg4pv111rl1A16Q1la17B92r53X1w7G0v6tL17GP5NV31XWpH5S13Oeur4___Cp_Ni741l_1xg4pv111rl1zv6n1mO18Bi31wDML15HOGg31wdX1gEDuwO94xaI5waS13Oeuwa111o-qK-E2WX72v1-15v1RQ1y9em71wN1p459ocXne3yX_N21r1Qiq3izqxXL3eNq1e9MiDlfsHl3q5hgeEc71Dl1sJ2R11u9p15TiwN1ev5v6JvkpGOE3rNt6de21as2sa53rqjX1wM152Ok6wg4jJi2dvi2qri21HdX1qN1tFumfsDeiH5FoFNFfsDqyqNF5wiK5clCfsSmfr5KiNHmiziK5wiKpFiFoH9fyw5J1r5E9G1521g76FlA6caa9G9Euwr19q1fuFgAiF9d6er82Hgs511c93l82xix0zaDuFlEuwrqiF9s61l71caa6HgFiv1eu3l72J6B1DyiVtBD_OR-XXSp31QzeYS5gvi31bX2aor759Qw0zxs3DB-fKVC_J3MsQlh0wm7sRK4nQ9Y883SvUZY1wilngD2g1uFfzYvff1d1vc5rAVlq_D2wC985TiD03El3TZc_Y8MJgPlw4lW85YmRuIF1j6li4iv_K7EbmWd1lg288WgmhI___Z8_Ml6s1c71xg4i1111rl1rJ4z1lQ17k92iFyX1w613qg2yO5Vi3Tw0qOeur1I5wa1___MH__f2sr9qv9E1F11115819D2br8012LG1w1JL15HOxg2iBv2YBrFtxTw0qOeur1I5wa1___MH__f2sr9gJ9E1F1111581ul16J8012EG1a21L15Hr1QE1atRrFlU5GaI5wa1pH5S1t___lb_SJsa2GQ30viJ11122J3y_-T2Hr1mOJ92uzjX1w613xg31wxGy4XU5GaI5waS13Oeuwa1____RKVt2OD9Rv9E1Fr1115819D2jv9m12LG1wiFL15HOxg2uIz_BorArqDj0qOeur1I5wa11191ht_R1_r74v1m13l1s51I01r5pr1d6c5b3rQt5eNe1c6U2J602SQ81vlcdxmU0J000J5R1q529r5u7kT2i11u1wX1tFNqywQKoH5FfsDeiSSm1qMmiH5F5wiKiH5FoFiHi15Zuvrs611z9xl461gz9xgS5wrZuzlSu4gFicaa2Jl46ziGuzaD0xi2eUjH1sb-YKgHsv9D0xTF5JX7u4sd219cgc-JCMA02ag93bBaBbBc4KB2pzlZpv5WRK_zKgE6sRDk8iRMPHyBWd-m1t___CB-zJku2Fa30viD11122J3y16g2HJ1bOJ92rDyX1w7F0v92yBz_mBrBrqDj0qOeuwa1pH5Sur4__J2y_kT8Crl41xg481111rl1Ar6d1li17B93as7X1w7G0v0fLt-LP6myoeDWpH5S13Oeur4__J2y_kT8CrbX1xg481111rl1Av5I1li17B93aWpX1w7G0v0dLt-3P6huoeDWpH5S13Oeur111v34_Uv79Jf814i1y13or2Q19x9Siz9iu19ko3Jk4c971FlZ43QWoJ1nL15-r49quATZ1aQZdwl3uFeI2v6j2v602v571WT3jv93qr921W1Dg4r3u4r0jFa2qwshur9S6kT2oJ101wX1tFNFfsDqyqMmiSSm5wumfsDeiSSm5wi_iNJGiv5KiH9fyqNFoH5Cye9CoFQF5zQHi3aE1Jg82vl32xix0zaD5GgSu4lA14iG5cif6caa2xix0Jgs62gFizlAiF9d6er79G9Euwr41Jg4uveTiwmORYsSQFDFpwAg5A0C1hTSgxAHy2X-pe5u6FQbhQvg4HNIOdCbz5hqfN2jg8r2u1DQ9ek-RWaNpqX2tcJxaefR1To-TKFYRsrho4O96q9zaxauieNXtVhQdroi1g7y_O5h1t__11kMZray35r30vin11122J3u1jX2JJ1hOv5UpIv2ia100v5PAGDX9HDWpH5S13Oeur4__J17_mD64vcm1xg48v111rl1SJ3-1li17k92yzUX1w613qg2th5Miqim0qOeur1I5wa1__N12KZm2rX8tJ9E1HX111581uO2Y18412EG1qDPL15Hr1QE1w4ti3Tz8qaI5wa1pH5S1t__11kMZray32X30vin11122J4v1ui2JJ1hOv5Duov2ia100v5VP4TJ9HDWpH5S13Oeur4___Si_CX6g1vn1xg48J111rl1X11B1li17B93rQpX1w7G0v09L16rP5v-735WpH5S13Oeur4___Si_CX6g1je1vg4ev11___MGb-n2oJ8av9E1G1111581uQ1Wv9q12LG1seaL15HOxg2dIv2Hoejaws10qOeur1I5wa1___MGb-n2oJ9pr9E1G1111581uT1xJ8D12LG1sssL15HOxg2dkv2Lkeha4s10qOeur1I5wa1___MGb-n2oJ8m19E1G1111581uO1Fr8X12LG1aHiL15HOxg2wBv2tBetqws10qOeur1I5wa1___MGbXn2oJ7ev9E1G1111581uN2qtMA11-H1sGX1zdDf6rSr3aI5wa1___MGb-n2oJ9yv9E1G1111581y11xJ8b12LG1suwL15HOxg2dkv2PoehwFs10qOeur1I5wa1__N1atZ02s19fr9E1G9111581ul1Cr8412EG1aYpL15Hr1QE1aSGwa5z4qaI5wa1pH5S1t__164MGrsr2_v30vix11122J4j1oX2JJ1hOv67eIv2ia100v6pfQY29JDWpH5S13Oeur4__J2r_lQ6a1l_1xg49v111rl1AJ7j1li17k92twAX1w613qg2r8M1yxiu0qOeur1I5wa1__N1atA-2s179J9E1G91115825Q29r1111-H1wGX_X7Dt59z4qaI5wa1__N1mbAA2Jv9fr9E1Gi111581ul1Ov8412LG1aW0L15HOxg2woz_akeir3ld0qOeur1I5wa111o_C_AA2Jv7rv2515O1WQ2yqqaW71rt4HNq72cue4DMu5lUpzQJu6TUjxT3qqT2pQmkp7OT1QQT1qc0ucspdQYUqv00qv6ptrN5hDl2r5l2d5Q2r5Q2eDQ525W81GS2Kr5J1391or5_11Q2i11_tNJ_5clCoGNKfsSmfe5FiFumfe5FiH5FfsDeiSSm1qNFF4ieiH5FoFieiG_iF4iKiH5F5wiHi15F2w9ZuGlAuziG6cas61lFicaa2Gi82caa5cgf6cgs61gz9v1euwrZ2var1xix0zaDuFgSu1iz9zaDuzlZu4gAiF9d6rid6FgWuJa2leT3bDHr1v52y3e1iJp6dp094eHcz56grFQIa_XT1UwMHdcc0zviwxslhGO_srNX9GTM1vawG19A5_Fz2eri24q6t56KnGit4SSY1X4-zL8-wolGeaQx0wQ35v0Ku2Thod8-M_VFy3Dz6Topfr0ugxTD21dmw45NiKVoOiaNfPN5___-k_VN23a8Sr9E1Gr111581uz_Or8412EG1aMtL15Hr1QE1sBvfQQLuxaI5wa1pH5S1t___E_-K1rW2Ji30viQ11122J4h_Ng2JJ1hOv68eBv2ia100v6uBaS5ozgWpH5S13Oeur4___CK_IJ50rbX1xg401111rl1AK-H1li17k92q5xX1w613qg2wumirGXA0qOeur1I5wa1__N1q_VT23r6Sv9E13J111571uNH111iPJ6pp5Y3pz9WpH5S___-k_VN23a8tJ9E1Gr111581uO1nr8412EG1wN_L15Hr1QE1aoQrzJLuxaI5wa1pH5S111315F_cJz22nJ1ov2E1p21oqvT5HDm1eiwadchq5cegwO03wOBiFueq7egh7cQ1ArKoSsIsr6jsr60sr6sfov2oD1iwwmsuAaZ1QgZ1wm2L15-r2116sTsjca3qea26qro3JgQL15Kr1YQ516656ar1c17L15_14NFfsD_5zQK5wumfe5FtFumfe5FtFumfsDeiH5Ffr5KiH5FoFiK5wieiGNF5e9CoFiFoH5FoF5J1eld1v979G91uwrFicaa6ziG5c5D0Gix0GlL1zaDiF9f6HgZuziG6er79Glz9va36erf6caa2GaA6caa2xix2Jl72Jgz9xgSu4gFizlAuwrR0zaD5Ja70zaDux5G8v9s61gz9xl8j1l56Sq2gIw-RdsECAa-rJhK8qh6qGgUz3e1yWLibzBEyxL2u2FVN2l52rQ2t3TXuGOAlEyvk8S8o4QCo5Ap3vv78tBNp4HW1qh--jOOtGY6dvakmFFMztXATJ5rOfPCshN3aJ8B7W131v9oiGWE21943JWSpzNt8bBu-5cEbGSvw1r2yGJOyJr31JNwyGJIteeqhScrh5wW1sJ91wTKwq1h7waKpFlt__N1ubZV2aX9fr9E1Ga111581ul28J8412EG1wJNL15Hr1QE1adBewQppGaI5wa1pH5S1t__1pFMGrmi2x530viE11122v4m3pQ14B52ekz-moe6tcNu0qOeur4___-v_x55mrc51xg40J111rl1zr2l1li17k92iFyX1w613qg2uvQAreTo0qOeur1I5wa1__N1hbA-25572v9E13N1115825Q2pr1111GZ1q979xv98xaI5wa11K-v_x55mrgq1491ev2hr29FyzT_uwab3JP9i3lj8FDXy3UX1w217HOg76a1hr13ev1212ra4vv5h1r2eres21954v1KiSSm5wieiGNFfsDF5wQ_iG_u1qNFiFieiGNqyqNFiH9Ciw16icldiF9ZuziG6caa2xix0xlE0xix2Jgz9zaDuFgq5wrR0GgE0GgSu4gFicid6Hgs61920zaDuziG6er79G9Su4lAuFgZuv5ya5EKT7V7729Uu-HMglaSawgEhdiw9dvWRp591Jaa7eQC0jvr1vi7h17Xd5OAvAMyeHvp3rQo59aTgDluyxSshF9lpHgO3d9C7Zv34J6csh2fnRvc9qQUuKCyy3YEmbfMMrwmiDXZeUeTV5vm9vXt4JXd11o_TtXc28a75v1G14X1sa1rt4gA8JOor41R7cNFywQapIv2i51k7Hvgsr2W1107115162ry31eQ216626a51vry13NFfsDeiH5FoFumfwieywNqyqNF1qNFiFieiGNqyqNFiw16icldiF9ZuziG6caa2xix0xlE0xix2Jgz9zaDuFgq5wrR0GgE0GgSu4gFicid6Hgs61929xgSu4gFicgs61g24W20IV2LccvqpzbObd86us5A0Esz5G6T0hGc31i662QhyqdT51942Er2Nw00qw9GqDL6p7u84wTPsdlG83Odo1WxyePX1vN2gsdrsZYX9q5Ypzk-wzvUhRfS_ba3oaOGiQW9iFup1112_Z__Y1e32vg1oJ2Zr45I6rJiiqgn8cO16svdj2g3jqN2d3N2heX2ecCd8v0s0EaE1QgE1qgnoHg572vTp21xL15Kr2sj4ETy1QQy1rX03sa5hrr3evr2223X1wN1tFumfwieiSSmtH9CoFiq6FWmfsSmfsSm1qNFiFiKiH5FoH9Ciw122Jgs6wiG0wgFicgs61g59G9EuwrZuJgz9xgSu4lZ5FgAiF9d6riAiF9d6er82vl2tJJ95t52We1ypwU2_cLIlsJu58Dz0FOPZJv2yxvIyrq60GvVyX2h1hGifqJdnJr-pFmtfsmcjX_NdzDYi33x1W1Ly4OI_zWytxOX94H2___MFb-J2vT9e19E1GQ1115819D2Y18412LG1as6L15HOxg2qov2loe9aD1s0qOeur1I5wa1___MFbA-2vT7wv9E1GQ1115825Q2B11111-H1anX1w3DeDS16qaI5wa1___MFb-J2vT98v9E1GQ111581y11Cr8412LG1aMtL15HOxg2skv2hkesqD1s0qOeur1I5wa1__N1n_ZG2vO74J971dD11t___QI_JJgi2Ji30viU11122J4h1dv2JJ1kOv5Xyov2ik9E1wVX1jVDtza94xaI5wa1pH5S1t___QI_JJgi2_v30viU11122J4j1fN2JJ1kOv5Cykv2ik9E1wAX1lqDtwr94xaI5wa1pH5S1t___QI_JJgi2_X30viU11122J4n1li2JJ1bOJ92y4xX1w7F0v92yBv2ABrBrJvy0qOeuwa1pH5Sur111bCT_Br0nrhl17l1BQ1t1JNtaFDvuwaWfJTp7cYbLt_1r5v04acbfAW0eeMy1aXKpxshdDcxd70TgvuxhEPE1aYEdEg3hWOSywWj4dTu1QQu1rD5qreh27Q51JrijJJ2dvJ2qrJ241l88sLX1w217wXDixc1jD12dQ12qa12r667930waaPo9W7X1qM13ErG1aaGsw93ixpX1wM13aadsehW6vid8kv2tJ1_iSD_iSSmtH9CoH9C5zQF5wumfsDeiH9CywNqyqNFfsSm5zWm5wumfwieiH5FfsDeiSDqyr5KiFtifw9C5wiKpFiKiGNe5zQKiFiFiH5Fiw126ca46qaAiF9d6er82rgs62gFizlAiF9Zucaa2x5x0xl39q115wrqiF9s61l71caa24iG14lEuwrZuwrZue1Q9G152vl86w9d6erz9xgS511c92lEuwrFiclAiF9d6caa2xix0Ggz9vgK31J2OI9VowPl_ar0dA9-b8X_4QV4v_VfSKijDtV-_PZ-moM_rGOhlv5fFlT27GOp61o-ZPw-LbXoHGT3u4-ned543v8A1apA279O8L-BEuCeyxvu5ULkYJsrizf-x1lO5zgJdJJ_bRBB0vr53c6ZeF2gFbBU1dr26yQ2USrXiHF-BVx-Bv6dBc9k9HTy2Jgh1eERbTPk3JC5ydVmqv521aL08z2X8Q5PywaOtrgK___-dKCy2Tl9mr9E1GD1115819D1AJ8D12EG1QSuL15Hr1QE1W1xa6OH3GaI5wa1pH5S1t___WIMKvj82vr30viP11122Je01e91111tOr0tLt_qP5MsirOWpH5S1t___WI-wvj832X30viP11122J4v_-D2JJ1kOv0fsBv2ik9E1WAX_-xDfsiH3GaI5wa1pH5S1t__13Z-21s535r30viL11122J3u1gN2JJ1hOv5Ooov2ia100v5KzxNV6c1WpH5S13Oeur4__J1P_vr6e1cm1xg4ov111rl1SJ3U1li17k92t4GX1w613qg2tDN_iHgr0qOeur1I5wa1__N1cbC42qQ6LJ971tO11t__13Z-21s532X30viL11122J4v1e12JJ1hOv5AuIv2ia100v5NJFJG6c1WpH5S13Oeur4___Bw_Qi6nrfm1xg4oJ111rl1Zr3N11114ol2r_S4t3gS0qOeub___Pt_-1sC35N30viK11122J4v1p12M11hOv67eIv2ia100v6iCaH30zaWpH5S13Oeur111bBw__v6nrfm15O1h51H9v1R0HD84JNm8wh6eaDOuv1RjGl2qxmj0J9Rt1JndcCU8v008v5n1xaKiGaF0wiatoT2oJ1a1wX1tFNqywQKoH5F5wiFfsDeiH5FfsDeiJ5KiH5FoH9CoFieiH5FoFiFiw1262iF6F9d6er79G9R9Hgs62ld2xix0zaDuFgSu3l42G9EuwrAiJ9S9xaE2caa6Hgs61gz9xgS535G6HgFizlA6HgFicgs61gz9xaE1Drg2UXOywQOqS9o4rT9tFrRrra63vF6pFmEP2T9_LE_VelduxTBlr9ZdSYjdQUkqQgCwpCnyqJe_KHf2ret_I59uGOIyrxzncdwm7NCpJJx9rOlFr5054OIu4D2qDru33Hl63aW5xgCbWa2wvv92r982z9_owQt2r4___Z8_Ml6s1bs1xg4i1111rl1A1251li17B92rDyX1w7G0v6qL15KP69MpciWpH5S13Oeur4___Z8_Ml6s1l41xg4i1111rl1Ar231li17B92yFLX1w7G0v62L15WP55XpciWpH5S13Oeur4___Z8_Ml6s1bX1xg4i1111rl1Av1z1li17B92t4GX1w7G0v61L157P51ZpciWpH5S13Oeur4___Z8_Ml6s1xc1xg4i1111rl1Z11C1li15k931wVX1ryDtQgU5GaI5waS1t___lb_SJsa2_X30viJ11122J4n1oT2JJ1bOJ92yFLX1w7F0v92tIv2lor-exTw0qOeuwa1pH5Sur4___Z8_Qa6s1hP1xg4i1111rl1ZJ5I_CD14B52rBv2Fke4yGTw0qOeur4___Xa_CX8Grcm1xg4iv111rl1SJ7O1li17B92wD-X1w7G0v6qL15kP60733iWpH5S13Oeur4___-n_TN7Frcm1xg4u1111rl1SJ1Y1li17B92rDyX1w7G0v67LtMeP5gVoeTWpH5S13Oeur4__J1r_RN79rcS1xg4ur111rl1zr6T1br17k92t4GX1w613qg2tJl_qxOy0qOeur1I5wa1__N15tC_2x58tJ9E1Fa111581uO2ur8412LG1wN_L15HOxg2rIz_DIe3t3Oy0qOeur1I5wa1__N15tC_2x59v19E1Fa111581y11R19W12LG1ah7L15HOxg2woz_BBeirxOy0qOeur1I5wa1__N1wKAV2-a7619E1HJ111581af_qr1F12dD1Wa31Q-X_gdDwDgP8qaI5wa1tFa1__N12_-m2gv7er1R13v1GJ111rl2ebXA14516kr2sv92aozM8kereGH40qOeur1_ur4__J18_kg931h313l49J5111122J66_zg1ir1sP1691v63LtKuP59C0HgWpH5S14NS1t__11b_Z1dP2c910J1O1gQ111581af-uv1H12dD1ag31a3X_iUDr4lIiGaI5wa1tFa1__N12__42Wr75v1E140911581af-uv1H12dD1xN31cLX_ryDpq1543aI5wa1tFa1__N12_Vt36J8ur1R1Fr2zJ111rl2ebXA14516kr2rv92tozBHBrNiGDj0qOeur1_ur4__J18_Zr8iJhn13g1RNg11rl2ebXA14516kr2wr92eBzNBIe8tvih0qOeur1_ur4__J2y_kT8CrdJ1vg48111___-n__e2ov79J971HD11t__1ok_-1qW2nO32v5H114__J2x_Bv7rrh_1vg22111___MGb-n2oJ7ev971G111t__124-bJgc2mO32viS114__J2S_kg831h31vg49J1111o-qK_42vJ6_11O14Q1lkaZoGrn01VX_N21p1Qiq1XyyHX412N91rvh67QP1svP1qDFiG6a9drc1Qac1q5e11a63H7X1wM142lRjGl2qxmj0J9R3Bv2oJ1_iSSm5wi_5zQKiH5FfsDeyqNFfsD2oFtifw9CiH5FoGOF5e9Cyw5J1F9d6erz9xgS511c911e511c911eu29Ficaa2Jg36er5iF915e1Q9G1521gs1q9Su4iGuFgFicaa2LaGr0S5gviy1b92dr6Y_WB-LbBb_Ry-bDrI88126NZY1wt-AM4-XKVG_OGt1FWas7y9bR2gOryDrwHLEaX21J60_OF-UbVe_l52gJ5sVr7Is4gS9tBHYIBL1lg2815lY5sKQw4-C5Cu2JcyeHf___CK_IJ50rfs1vg40111__N1ItZ02DJ79r971Gg1111213f-UvbR2Qg1or24OxO00kz_J51e3rC90qaK3aOIdGPIpJiI2cdX1w2143uQ8J668Sab1cNR2Iv2tv1_F40mfw9_5zWm1qNeiGNI5zQHi1572Jg82xix0zaDuFlA5zlAuFgZuziG6Hgf6clq111FizlAiF9s635x01141vl2YxJMyvXEqxQZ3zSPhEln8ENs7S299eNw5rJ-1wT22IlWra5xgtBJDtVX_Whrn5a2Jfd2b30niGak70zW1rzVqD8KEWcVmGNLibBC_tt-HcrwjgZe1BQ2ktBAFJ4__J2H_kJ03vf-1vg4p111___MFb-J2vT7wv971GQ1111416k_ZJd02n516r1O15v1jQ10pcNU8DgX5e67Lt_1r3i055c7eQT72zvBrss2ha53eQ52rqMj7dTh1QQh1eQR0JDSoBv2tQ1pdv6U1r001r524kv2oJ1_iSSmtFiqyqNFfsDeiSSm5wi2oFiK5wiKpFiK5e9CyqNKiw122G5R9xgSu4gFiclf9qaG6caa2xix1Gix2Ja79G9EuwrAiF9ZuziFicgs61gw9xlE9G9823ix0zaDuziGuFgFicldiF9d6er71_Up_mq7pFQCpHTViv9O1faOywQOwDH7pwR-mfYEpFQCpA87Z5Z4pFlZOQdpcDhAMtB_hxOCyqPXRb_afWMnjxOZuJah1vgZpGOZ2197uGOIu_At1vT9yqOIuJToyqJIu_S92vgr5wQOpFly6rl9yqOIu____QI_JJgi2bJ32viU114__J2Y_MO7Z1gv1vg2OJ11___MPK_R1-X79J971GO1111218K_CrsK2b91ur2Ur3Oh111J41JQ04la1v9bi45bo6achq53ex529qlRseMW8J078J5bpHv111aIL15-r1J266Tajcr3qer261dX1qN1tFumfe5FtH9C5wieiSSmiGNFfsDK5zQ2oFiFoFieiGNFoH9CoFiHi151uwrAiF9624iG6caa9G9R0xiv6wgf1egs61l72Jg8235G6caa2xix0qrz9vl70zaDuFgZuvpN_nhbyoi24v5UW3aHEDp2j6z-Zr5w1h5DiZcLc5g24r9UiQiF0ko-DtBWHvP9uDMjdTVI1Ga2_7vDurQ7uqsT2vvy1ew-szlcpGmjRkW86a1H0wit4vT9rx9zg73AZt___Pt_-1sC2mD32viK114___-n_TN7FrlS1vg4u111__N1d__l2tv6Sv971wi11t__15wMZJmH2b932viF11111r27_-a6iJgp14i1aQ1e9HTj1vQ04GO1ir5Hiwaa4GVX1qM151J1dv2U110011517GQY2c-N1qN15r5K11g2tv1_tFNqyqNFiSSm5wi_1qNF5wiKfwiqyqNFiGNFiw122Jgs5er79G9Eue5Z0v9euwrFicgs61l81cgfuc5ruziG6er82c5s61lQ5wrAiF9d6e111Jg724lIo4Q9-_HEpFQ51vn9JrTJrdr92vQ2dwlIpFR-B18RoHDE_PaOywQO1wuv715O1soHYzaIiEYh_P806AJ2mr5plsC9azZ-DccSfEQ3bqOCyqK-abX_1151rKMS2AD7fv1C17H1i11K4eJK83Nl239r11Tr3v9p3zOZp1rLh112er2s1191u4rg8rSs4dau1Qgu1rDw7ov2tD1pdxsU0r000r5W2Bv2i11_iSSmtFiFfsDeiH5FoFumfw92oFti5wiKflJF5zQCoGNeiH5Fiw1W1GgEue119q115e132G1d6er79G9R0xiz2G9EuwrZuFgq5wrE9G116erf5Hgf6caa2vg59G9EuwrA1bGq4xD3a16n1rl21Vk31dyouGYyfEm80Y1LwApyt8jfIbBV_cNZbrTb8qh3_Rhlp4cGjv6c9mU31wD2AbBI_UK-_KCeCqS6pzO93rsQu4sCYQg2mv5tIpo-RnAHE_Bo7z1J7zrM5FTCpDgE___-k_VN23a8yr9E1Gr1115819X11v8s12-F1v63rIv2ikiE1v65L15yP5epozgWpH5Sur1I5waS1t___CB-zJku2Fa30viD11122J3y16g2HJ1bOJ92ywEX1w7F0v92yBz_mBrBrqDj0qOeuwa1pH5Sur4___Z0_CX5K1nk1xg491111rl1zv3-1zl18Bi31aMtL15HOGg31s7X1m7DaslSr3aI5waS13Oeuwa11151p_BY2ET6B1271861yxY4rFvH6Hl7211t51NJ4JittvN-7v1X54v3y4c97zu6jDa2qQsjer06uwaz32lHjF52dz52qw52iqyX1q-GtFO9L15-14_iizNFfsSm5wie5zQKiSSm5zQ2oH5FoSDqywQKoSDFiFiKiH5F5wiHi15d6erf6caa9G9EuwrZuzaD0GgSu1i30GivuwrAiF9f6ziF0w9f6ziG6caa2xix0Ggz6clAiG115er19G9EuwrZuc9S535x1HQq2vhOpa182vl96cv6LtVAyqDPlSM4w15voIhCk3QNt3QAX73g2vxxRv5p1ez-CiacuZuZxbVQdvoXXhrQeQvzPzOY3xrz3am9eS7y1rr21h34owJe4vgi3FDYpFOy2O2FtbBc_K4N_vgL9Q1Bt160Yv6Y1t__1ok_-1qW35r30v5H11122J3u1qO2JJ1hOv5Ooov2ia100v5Ku3NV8r1WpH5S13Oeur111r2j_-l5OvfD13X1W52i2cOs0qav6w1s1casi1O14HOb7GNk1HOk3JOO4EOO1aTOdxJ3o31R0HCE3r6s3r6p3r5036T9jvv3qrv237g11sa11aT11r141Hvx8Iv2oD1os1CQ4v064v5y5cxX1wX1tFiFfsD_iH9CoFumfsDFfsDeiSSmfe5F5zQFfsDe5zQeiJ5KfwiF5wiKfwiK5e9Ciw12uxaZucgs61g62caa6ziGuFgFicgs61rz9v1S511ciclAiF9d6erz9xlE0xix116lRv5F43c6Q_Xg3phCWuYi8qQM_T3MG_Bz1jX2w71-9wQCod9_9eNMrpB-DJiW6wa32FQSrwm19FP-JYXZtxYrVv5ASJ7i1WiqiZ-QkDYp5tB0__N1obX52ar6Pv971GX11t___E_-K1rW2ma32viQ114___CK_IJ50rlC1xg401111rl1zv131ma18Bi31a03L15HOGg31aqX1rVDe5TLuxaI5waS13Oeuwa1__N1ubZV2aX6B1971Ga11t__12R_BrnB2ba32v8n114__J1J_-g8v1ge1vg2ZJ11__N1pK_g2z96Bv971n111t__1p8_N1qN35r30v8L11122J3u1eN2JJ1hOv5FiBv2ia100v5A0Fh27J1WpH5S13Oeur4__J1m_MT5GrbX1xg2MJ111rl1Av1a1li17B92t4GX1w7G0v61Lt_-P51Z7v1WpH5S13Oeur4__J2B_LT6jrg11vg2XJ11__N1wKAV2-a6O1971HJ11t__10K_NveU2b932v8W114___CB_M55L1gz1vg48r11__N1PK_X2pa6VJ971nl11t__16I-Ovfq2vl32v8T114___Z0_CX5K1h71vg49111__N18K_J2Ig71v971nT11t__15o_Svec2nr32v8I114__J32_NJ6k1gi1vg2B111__N1vb_i2dJ8-19E1nJ111581uT1xJ8412EG1s6eL15Hr1QE1sa4saJQ13aI5wa1pH5S11121poMFrbO2v91yv2br1NWur5K9vTl84Js1r5p8cEX1qM14G9XdzcUy100y15X6ea55ov2oD1yo3cQp16sp167p15TivqX1wX1tNJGfsSm5wi_5zQKiSSm5zQ_iJ5KiH5F5wiK5zRi5wQCiw126ria9G9Su4lAuwr40zaDiF9d6erw92iAiF9d6erz9vl72Hg16H91iF9ZuziG6caa2xix11i313iz9v6Z2dhx21gp37gOuvD21o2CmFWiuEPbdUHU1eMiD15fjx05e3aOum6SLbCNE9R-MSvH81ofJtCRzE00WYmpzv5lClynuGOL_z12sLlU8aBLAwaE_Y-d_Ef--GgEyqstgJ771wD27J5U__N17b_U2wl6Mr971nN11t__188MK1Qp2bX32viT114__J2S_kg831h31vg49J11___-qK_42vJ6_1971GT11t__17R_AJkl2x132v7F114___AA_-l4Bvgz1vg4pJ11__N12KZm2rX6M1971HX11t___Pt_-1sC2mD32viK11111r1k_MQ7GJlS1451jkaQ5v142HEX_N2101Quq2QhiGOI2Ga1dv2U110011515Wgq1e9psqCWov07ov5Lpov2tQ1y832U916096Qv1x1d6vUX1qN1tFiKiSSm5wi_iSSm5zWm5wumfe5F1qNFoH5FoGOq6FQHi15E0GgR0xgSu4gFiclf6cgf6clw5v1Ficgs61gz9xlE9G931Ji71vrz9xgSu4gZuzgZ1WpSuw6QYc9-p4ibaY6w836OBRa2sie9sz9T8eJm8AZAm8MoFtBVKxDXy70VgcX2Snj8n0kBpelYtxMMZh0ia053pr5r1s0nexH9pGK-J_Bz_OxC_WnEyqOHorJusFo__J2k_MJ5-1fd1vg2iJ11__N1etZb2Z56Nv971Fi11t__18K-A1g12v132v8V114__J2Y_-95gvg91vg2-J11__N1g__J2Ov711971bJ11t__17t-A1mZ2v132v8M114__J1E__96U1fP1vg2_v11__N1E__l34J6Vv971bN11t__10K_NveU2nT32v91114__J2g__i5DJfl1vg31r11__N1ab_43or71r971v911t__12I_AJqd2va32v94114__J22_Zr8krhn1vg1RJ11__N1wKAV2-a9Hr9E1HJ1111R1uJ2lJ3Q1rl1zroL1Qr1yk55gBz_-a1hgAuywE141QgYeQg72E15hTHElqDm0ri3soz_OIeaf3Dm0qOeuwaI5wa1pH5SuqOeur4__J1L_VQ9U1cS1xg1Q1111rl1zrqJ1br17B93sWjX1w7G0v0hL18MP6WQ3HDWpH5S13Oeur4___Cp_Vg7fvc51xg4wr111rl1zr8u1li17B93qaEX1w7G0v0iL15JP5Hf5cXWpH5S13Oeur4___Xa_CX8Grc11xg4iv111rl1rJ0Z1li17k92rQpX1w613qg2qbe0tJvz0qOeur1I5wa1___-6t-n2NQ9e19E1F91115819D3Dr8412LG1wN_L15HOxg2rIv2EIe3wrvz0qOeur1I5wa1___-6t-n2NQ80J9E1F91115819X2I18412-F1v6twBv2ikiE1v68L15wP5mu33iWpH5Sur1I5waS1t___CB-zJku35130viD11122J241rr2JJ1kOv5AuIv2ik9E1wAX_FLDtwiP7xaI5wa1pH5S1t__19fMKvaY2kO30v1A11122Je01gD1111tOr5XLt_EP4v-13XWpH5S1t___PtMKvsC2mD30viK11122Je01nX1111iPJ5--4C50zaWpH5S1191tb_h20J5Tv1p12a1eB5r2Iz_J51h3rM92vgf3SN1kJ2_11i1srSW4r074r5u3ov2ea1pdcuU5J005J5w1Bv2vv1_iSSmtFumfr5Kfw9eiGNIiF5J5Fr19w916e1c911w535GuzaD0xix2zD2tJ56-r5x_lk-NKBYJJ6xLkxPYjFs1WFH1sf-FLfMwv6s1qz-et8eKiZj111210X111ic20g1or25r2lw1GTxr1Yr3v9p4c2K516n516i515r7kv2vQ1i2xhs0EaE1QgE1qg1L16514NGfsDeiFNFfsSm5zQ2oSDFFiJGiw1c9xgSu4ifu3lEuwrwuza79G9EuwrZuzlAiF9s61l76vl76erf6caZucgs61gz1wuftYSg2rab2TiRpzcd4cbtqDrp21Og61a6jGQZuxTcudr594rDeSl284lRj4TUoQio6oei4SJREiLcrFQLox131wvYpzr11151Yt_-25X5Tv1A16c19G17iz9Xpv117r5hdzeUu100u15D8cXz1STzjxi3qqi29GvKL173r1Jj1Sa4hri3evi21J-X1ar1tFumfe5FtFiFfsDe5zQeiSSm1qMmiFieiGNFiF5J0wlAiF9d6er79G9R0xix2Jgz9vl79Glx0zaDuzgZuzgSu3gz9vl82xixuwr-1ziG6caa2vl51dktvVHjQ4lR4zvX4zsQda5RwzDSr3NZruEfO8AhdsPszqDhhz-LYsbvD_HB_YL-5JH4y3lM51N72JT92z0haZxzwsY-y4SyudXzaxS1cFA-kVZryUi11r2M_RO50Jqn1451j51K71198xNK5J93iGQY11v2311dqchj6ETd1Hh87WljhHT47cT60WTcjx53qq529qGX1g013Sarhe13ec1251O6L16714NFiSSmtFumfwiqyqMmiSDqyr5KfwiK5wiKiFiKiH9Cyw5J1rre611z9xgSu4gFiclf6ziGuzaD0xlEuwrZuFgAuwrE9G982Jgz9xgSu3rFicgs61l48r5p_LFoS_rNpxvloDyKljfpU7MdN42kWfH6tR9E4xlB1q0wZbV-1mmb_PI3_LKwdxQS0aszzEjaUH5iwzJnt1Hfqd2Q9aaft3WuziUZVDD11191o_Cd2pg5xr1k12N1fQ1f72i112Nr2v572x5n3AOl1aTldcJ3827X1g617SgihvJ3eJJ241Qn8crbseMW8J078J5b3eO81Iv2qr1_oFiFiSSm5wiF5e9CfsD_iSSm1qNF5zQKfwiF5wiFiw1263ix0zlZuqaE0zaDuFl2uziG6e5Zucgs61gR1J982rt6fw9Z1ro-qpWGuSg2BQ6Yle9DEDEgJ_-z1jo-P6C7g5Fz3vrmoGH8hvoufEoNJ1970aaLy1g4wKCRC1T11151b_X_2955cJ211821uwQC711851l32Jm34rD113v2p6TkjcO3qeO27Ag31sa31r95wG529rrc21YjtAT_1QQ_1wNHL172r1Ps6das1Qgs1ear3Iv2qr1_iFumfwNFfsDqywQKoSDqysSmiWSm1qMmiFiK5wiKfwiFoF5J1er4uziG5car135x0zaDuziG6HgdiF9AuwrE9G972Jl79G9EuwrZ5zaD0GgSu4iG6GafizlAiF9d6erz9G9R0Gi2cGdoXOFE_II-MOfPtxgU04YbhVZvb8ubv4COp49Yy25x81hT46i2mUrq0qre0z_L9Hrf0ci4Ozw-V7Z-S_z-NtVmJDvEyxP9u_VDYBQOtRQPyGloU15NgeHw51T-2rl52JlV0R531v111v3u_Bv5mrga12l1012qr3115JOv11a22raE7v1o1rO19EOx1sTx1aQx1q931vva5ov2iD1pseSW8r078r5m3ov2er1_iSSmtFiqyqNFfsSm5zQ2oSDF5wiKfwiqywQHi15AiF9d6er19G935e12uFgFicgs61l82vi76erdiF9Aue1c9vg2zjCaC__-CywGMv7qfQ1T0zMRGW0H2YUtzVz-HqSL1AYy-yfA_Pi2e15b1nX2jE22yxgTgNme_R1SilKUHo525HQ11151eKCn2oX5vJ1c15nA12iy82J54Iz_J51t3rH94vXzoJet26N51JrhL167r1Jr1dT21aQ2dr531rEX1g51tFumfe5FtJ5Kfe5FoGOqyqNqywQHi15W0GgSu4gFicldiFiG6er82vg81Jg82vgz9xgSu4lw5zl4b_X9ZA9XpI4o_8-AjzAvmwdA6zXMexDRtw_cmBT4P1T81SOIurv7r46pJUsD_R5HPk2lyqaYEv9R1qtf11i1n__o27g6Mv1a12D1p12Pr4ip8ca1219f2JlR4rDU81939r1w1ei13cCI8v6p8WTn1cCf6dls1cas2daQ1agQsxr3023X1as13ETj1aQjdeT37vdX1w91tFumfwNFfsDqyqMmiSSm5zQC1qMmiFiKiH5FoFiFoFiq6FQHi15EuwrQiG1e61g86cgs61rz9xrS53aQuwrE9G1e62l72caa6ziGuzaD1sGG1ro81jeinVhJ_LFOZKBF1mQ217p4_J4PGsxGnhjf1JCOGof__E2RbD6sJVo5COG_1azme0mBl_B-znYvWRsOnZ-kAr13188-rvq42p116J1z17S1rr1g5cT13H1o91O43JOW5c9b11a22rOj7cDx110U1v601WQ31v9t9cNx1x9x37aa1agascr361Mh8dQm1Qvm1eD9L17314NFfsDKiSSm5zQKfwumfe5F5e9C5wi2oSDFiGNeiGMmiH9Cyw5J1rgz9xrS511civ1s51919G9EuwrZuGrw5FgSu3gz925a6ziG1Z-UmNR-Z15I1rp_1qkS_b2ep4h4U158QSXtDEB-IIGqn157sKRl1rv25_B3AbBz_mB--4ORyHNCdr5v1s2su8bA_UpiRJ4__J1M_MQ5R1qx1vg4B1111151JJ1127r5Wv1L15C18Hra4Ji21GOz51Y13v9pqrMh4AQt1JNek252de525eUX1g0143l6hra2evsd2r961ov2e11_iWSm5wi_iSSm5zWm1qMmiNFifw9Kiw1c9xgSu4iFu3lEuwrwuzaS2xix0zaDuFgZuziG6er82cg82caa6Hgf9w9d6er79J6gaDpmZra68Jks9qTXsRmOfDW53vro72r5219223TAuxTvuEvcyFTHfv5uu39rU4TUoaelfWWi4SJTWlVcrxTIpFiApxTD__N1Yt_-25X5Tv971-X11t__18Z-nJrR20X32vtK114__J1K_Wg5Yvq01vg4N111__N1b_X_2955cJ971_511t__19Z_L1eS2cr32vtG114__J27_WX5Kvq41vg4NJ11__N1n__o27g6Mv971_r11t__188-rvq42p132vtS114__J1M_MQ5EJgw1vg15J111151AJ1128D76J1L15Y17eXz9JTw5JiI11T23ETy1aOydJX34cTr52UX1wu143l7hrg2evhd2v971ov2e11_iWSm5wi_yqNqysSm1qMmFiJGoH5F5wiHi35x0zaDiHlD0GgSu2iAurgz9xgSu4gZuzlAiF9s61lf61l76erf6caWicgs61gz1f6srhBw31Qf6oXPpzv_n5lHd6243vgg7rv91rNYuFgU9wsQ25uuszmH1e4YEYaVpcC4dwaYdaJtfymDXuWCw5u4er9SpGTD1t__1pw__rey2v132v1s114__J3q_M95yJfA1vg16v11__N1it_E2pa7719712l11t__18B_Jrq22vv32v1g114__J2K_Bv5srga1vg17r11__N1eK--2oX6C19712T11t__18k_GveE2bT32v1k114__J2J_V55c1g11vg181111191d1iI1KJ7xJ1o12r1oD1w5r1751g32vgd43N11a111r1t3kO2wr1w11i2qv1_iFNF1qMmfw9eiGMmiF5J5FrAiF9d6er79G9EuHrdiF9e53ixdoLWEVR2Wj3LO5HqY0pJ2uE-MypRAKZmZjyp1wX22v111v1_1Gl47Jjl12T19J1Nr2Ov4Ji12vgk41g111Jt7J5k7JW086QljeJ482jV1aO13r6u14N_iSDqyqMmiFiKiJ5KiFieiFtuiz5J1wlA6erE9Hld9G9Sura7uwrZuzlAuziG6ca81Hi72Jg8uziG1RlCjDCa1v6cqKVNwxLecFJXiHNK2p13iD687cNSpJqo1veuurxQw5Gc310roGLuFWOGpHMB_Iv23FPffHT5111218i40JoV2Yg1iv2wr35KoHl12H181vl8u1Du111x53939c1a8eDa1cQh21rpixGX1aUZhcr2sHr261UX1aD1tFumfwNF5zQKiH9C5wQK5zQ2oSDFiGNeiGMmiFiKiw122vlAiF9d6er79G9EuwrAiF9f6ziGuzaD9G982xix0zaDuFgSu3lEuwrF6FiZicaa2xi28Jg0lAeHTIGjbkrK8GJIqWH5a96krqc19F5o3Jl8uAtzcaYxU1fVmwNYv9EaUDlV8Qrho6W9vGOgpHDvbZXr42lf4wr62wvGiv1317T40ri92UT16v1v15qD5Hio8rdX_N215vQiq1a69v1g721o1rOb1v995ov2qBhf7Alk1cO9L16u14NFfwNqyqNF1qMmiH5F5wiKpFiqyqNHi15AiF9d6er79G9Eue1ZuFgFicgs61l71Jl76ziGuwrz9v5FsEn1EpAcIjtOe3gDo4vPTAO32S6nWXse2a9EzfSNKkAh1e40uHNF8HOlhKBZ7sU8U9J11151nJiC1Jg7cr1n14s16H9y72v7111y51Xv4viy4x112c171vgsLJ6u11113J6p14NFtJ5Kfe5FoSDF5zQK5zQHi15x0Gix0zaDiF9f6FiG6er82vi72xix0zaD5zlAuFg37HboiWlSq5p9mImid0uS03Jc8zHSieQarJfY2G9JrJr3uq2LPbB9f4TJ8cQ23W1T9Rl111i1sviP1Jv7QJ1q12J1012jr1X08ei1219d2JlzwJO23Bz_J51j3rH93JOE7v938GNe1e513eST8r5m5Hi69rVB1aD171161aT1tFi_iH9CoFum5zQC1qMmiFiKiH5FoGPmiFiKiH9fyw5J1qgSu4gF92aa2Hgs61gz9xgSu3aAuzaD9G9s62gf2caaiF9Su15fYpEq1qP_IP3qWkO2sxCtvgsayjGQUvwDeZmYnuMzrajkn9U4khyl3a1RaWJjtYs8ddPMs1111v2n1Ga3_1jT12Q10128r31o6va652Or6v5d921d7HOn4aDzfqi39D1045vz9J9n5BO2qJ171192wr1_iFNF5zQKpSDF5zQeiJ5KiGMmiH9CoH9Ciw122xix0zaDuFgAuFl79G9EuwrAiF9d6er72ciZuxgz9caa6ziG1n5Bd35SeFdi9H2ejX3hOjywPZLkhv99ssLnewHz1SrKpHDx9HYZiHlRQZCVPBxrWLnt1llhfTdFuDT1__N1dt-Y1KJ43ri821T11tH-11AF1r103kv2er1_5waS1t__1pa12roe1FT22J4L_HtNbv1oOv1h7kv2e11_5wa1__N1Q1161LO4av581y__5_H-11LG11TpL16514Neur4__J3H_Ma3Hviz1rl1NtNw_8X13B912vjX1a91tH5S1t__13b_Jvi41Fl42Jro_-zNEJ1uOJ513rEX1aa1tH5Sur4__J2F_Vi3-viq1Jl54111_8J13B913vUX1aa1tH5S1t__17t_Ori21Fg42Jru__RNz11uOJ5131xX1aa1tH5Sur4__J2O_Na3MJie1Jl54K_H_9J13B916edX1aa1tH5S1t__16k_Pri91HO42Jrt114Nx11tP19211XyL16614NeuwaS1t__16B_IroN1F142Jrr114Nx11uOJ511vpX1aa1tH5Sur111J3u_CJ8yrg911D18r1C18P15xDh1v9B92i9dJCI4v0p4v5y3Bv2oD1BjqN2q3MgoJ9KjeX2dcX2qeX28zujiATF1QQF1wuhpAQI1QvI1qPY9v6p9WTx1x9Eh2g2seg2ecg26va1oFumfsZyiWSmiWSmiWSm5wumfsDFfsD_iSSm1qNFF25FoFtiiw12225a135v14ar135G6Jl72Jg16er5iF91uwr30Gg29zaDuzlZ035G6Hgf6cgs63ix0Ggz9vl82vl72iN2B_Vy_TZ-_bCo1vQ2qFvlfDrFVKBR1eFxVv5alCuI_oGUsomr1qJ2qyKX7ePNqROCqIB8LajhsMmz2b1q_h8X_Ra28_52ir8k5I1a4wF-KYntDJ52KTD26elt-Emlox1d43Xb1J900whj42D831gn4K__15b_R1lC2vJ30vrk11122J66_Rg1pJ1tOru4LtFTP5iV93DWpH5S111417o_GJgi2tJ15r1Q14X1ra1W0eTtiq50jzv2qwchy19XpSamheD3ecD28rHI6v6j6v606v5d1ov2mr1_iWSmfqNFfsZyiWSm1qNFF3NFF45J1elGuFgFicgd6e119G9Quwr12rgz9xly1caa6ziGuzgSu3lE1wrFizlAiF9f6ziG6er79G9R0xix2Jgz9xg4mF597G9orNG3_UbMF_Vj1a92J2inozn0cgKqzW_gsUTu_6PFsNo2gXweD8Pju3C-HlsBki82k41B2tv521ejFZf-V_B8AUFk1gbe4cJptI-id8WRDd7E618N8Sv03eadd3gV6ca03zb__J1V_lJ4Nvr11vg1qv1111g1fKNI5717K12R1pN1H14w1ta21143r6oBZbkh12EG11txGl_AXO_tXKg44TNAlCDE2apPhi414Tc3VPrylX-muxg6oZckdSM-aSuLfSME_PD7-bRa2vhEO2QfF2AU7Ar1hv_q1moq7BHEL15_r1-pt4GsoHLE9GikC2lfJHLX1qD1tFiFoFieiGNF5iJGiGNFtFiqyqMm5zQC5zQCiH9Cye5FoFiCoH9CiH5FoFiFoFieiGNF5clC1qNFiGNF5zQKiFiq6FQq6FQKoGNeiH5fiH5F5wiFiw1W61l72Jrz9xgR1GgR1zaDuzlAuFgZuziv6FgFiclAuFgZuziG6clAuziG6F9f6ziGuFgFicgf5ziG6Hgf6Fln1caa2Jg82vi32Jl72Jg82xix0Ggz9G9E0Ggz9vl79G9E0GgR235x1egf6cld6FgZuH9Ficgf6clf6clG6cldiFgZ5zlquFgZ03i72J979G940xl79Gix0Jg81vgz9xgR0xlE0GgR2vl72Hgq6er71egs61g72Jg76erdiF9Quzar1xix5FlA6caa2xix0zaDuziG1wgZuzlZ0xl30FgZuzgS535x2Jg82vld6Hgf6clq6Hgf6ciEuziG6er79G9R29yfw5K-Xa0kowPn72s9awDFneNj-o925ZUTCUpWpWQZr0JB96NY7DP18evD4egd4Huz8D013GEs65gwUjuHyQvRpere0gn70rO9335k3SNIo3JPoAAF5HrdRmUnsDCJ0rQp_LB-Dng4HrOq4D635ko845JY6qQY31vpqaQ9D21z3Hgji63roGlP_Oe06cE4jxgOaGOaqE1n4rDq9zgR5x265vTu7elJuHPQdqhlw1RNt4QQe9MWp_4mHv6dxKfHEhQ0p7sFq5u7e4Nh_2rm8X9X8rJte1vnzCes_UcBWEQC0q935e5o6ePK4JQk3qDicaeUEzlW53Stpcrfd9Fb1juHaJ5shFE44wiE3vPIgoeq0vg453n7UaJS8ri82eYWb18p7rli3J527FaRoSDOrTz-JbB4SFaYoNrbQ1g681OppHMmI3gzDJ0v3xW0n8Su2c1J1wslUqil7Ja34Ji8eha27O92f9SSnHW0fKXbNr7hDa1e1zUB_PuRvWiT0DP-_7l47cl2lKB2bp2V1OYWcAsHa69Vp3piAUbpAJ6P1wf-0J90m5h8QE29wp4NbrQuurQ5yzX246NhtD32d16grqXe3HiIoxNUssw-YpmIfG54LxOMf56Hor1817_-N1Bw31T15J1R14O22r591eg29v5DLJ5j1q129150r1YFmXsTfWCMcgdpL150r26ZmGabi4Tu22NV21rV8JylloN251501rQ2015810g1Wv54r4qlZBZw1NZECUqQIhGPRpApFaqyzWnpKmzgFVtH64iFec5eeP-APPt7j8uM1ZYPkaMzQ5qwLr581rm1457iQCyTdTbXrb67HIv26oszU9n8U7yX1ee13lh7Na8X3g4QFBJ23J5m1eD26J5fr1U1nRU1o3J09x9013NFoH5FoGNFoH5FoFieiGNF5clCoGNKoGNKoGNK5wieiGNF5zQK5zQF5wiFoH9fye5FiGNF5wiK5wiKiH5F5wiKiJ5KiFiKiGNqywQKoH5F5wiK5clC5wiFoFieiGNFF25fyqNKoH5F5wieiF9K5e9CoFiFoFie5zQeiGNFiw12uwrquwrR0zgFicgd6er32xix0v5x0zaDuFgSu3lEuwrAiF9d6er75GlEuziG6cgs61gz9xgSu4lAuwr2izX3iF9f5H9FiclAiF9d6erz9xlE0xix1caa6ziGuFgfuzaDuziG6caa1FgZuFgFicgs61g86cld6er79G9R0Ji79G9EuwrZ2xix0zaDuGgR9va72xix0zaDuGgSu3lEuwaZ2vN32caa9G9EuwrZuzaS0Fa42vgz9xX31xgR2vl72Hgs61gz9xl40viEuwrFicgq6FgZuzgFicgd6Hgf6H9ZuzgFicaa2Jld6er82ca4uFgFuzaDuziG6caa2Jgs6ela2Jgs0rlZ1erz9zaS0FawuwrFica49xgSu4gFicgs61gu3EaB33QOo3lNgGXY8q_MbeNP2rrE0xNbyElGKv98i3lEpwepyq1J4c_BRJskEsJdyHmSUIJH9e5O0xYyo2Dt5xmmA6a-aW2h81rO9x9I4xsUU2lW9xBrW_msyGQnkhAy1v650wv0xgcNPrJT9Jo-VDDJpeNH4e572v0Ymygi3QJxo1Tu28OtocDxovvcocJ59Fsp41gZ0sJ5ac0K2QNEoZlvo4gCa3JloHlT3vOWRGvgoxMt62Q01Jr5C9WQ2z1T8z182Jri3J65lCg7oScd21edd6TQewlzpFXA26Xi2J67TjdH75rU-03n_TNMo18goqay4vDei45H93iPKaQZar5e3q5NiKPlljrK9HQkoA2Y_q-nNfup_l124rQhtRCauqg6_ICXr7gNe1yjdq9Ji39O_KQxnO9koqizMYtSp21B8zpcQtBAwzQIRnhxJXiZyDk3uBcii31o02gkpsHjoqQh2evPcA1FwxJxtRHSrHH64KByp2Dc7Ai23RJPl8nZiJNy9GYd1dcu1s5o65QF_EnYjkVMvqMK-Q9ZYr78Y6s7wvXSe2vu9x5xpKBVoePsW4HJpqif6cgm6s62lRlSKkvj_8SdscWqhv5ra6cg_7mu0GgGaqizur113r11_k9ef1lh19i1EJ4v1tO22r5t1w52y1671rnX1qGFCMtwOIN29J3q1yl29J4R1qi1-166r1GqQzJRqeSTnJhFiFyC1av2tBj9-tcFKlFNKv521rg241521rJ21r5iOLCIXBD2iv5X1wv2p15g1ec14Mk4ZVg4Fp7UUWjcTd8dFoN2p14z1qN1Sv4d1qN1XJ5Tr1Ri2rclhdslf5LB1wJ1xJ221apGqCxoLr631a0159Lg1GeoBLCMbrvQ01vf6Jv1oFiK5wiK5wiKiGNK5clCoGNK5e9C5wieiGNFoH5q6FQKoGNKoH5FiGNFiGNe5clC5wie5zQKiH5F5zQCoGNeiH5F5wi2oFiKoFieiGNq6FQF5wiqywQKoH5qyw9K5wiHi15AuFgZuzlAiF9f6cld6HgfuzgZuzlAiF9f6cld6er82caa6GaA6caa2Jg86cld6Hgf6caa2vgR0Gid6Hld2xix0rg82vl72Jg82xix0GgR0xgR0xlE0Jg82vl79G9E0GgR2va79G9EuwrZuGgR0xgR0xgSu4lAuGgR0zaDiF9fiF966vaa2Jge62gFizgSu3lEuwrZuzaD9G976r5d5cgdiF9AuFgZ2JgqiF9Su3lEuwrZuxgAuwrZuzaD0xix2Jg81vlE0GgR0xlE0xix2car2J9s62gFizgZuFgAuFgZuvadiF9Z025D0FgSu3gz9vl82caa6Jl76eaa6ciZuzlAiF9s61g4uwrZ6ziZicl72w9Z6cldiHgFizgSu3lE0GgR0xlEuwrE9G9712aa6ziGuFlE0FgZuzl20Ggz9vgs62gFizgSu1eCufD-51JyyxDmwe5rowQZtPclmg2kDAY14vio7rv02vyd99Uj0cDsLFxQrDvZsgSYhGy22vD9dzCH_IDUzGil3JJd3Hhvr6ia5SqA4Hlh7eQLba6fOScuk5CY0kb-0eJWo4Oy5SsekEW_IWjbv_QdaS0IpevzmJ51vvQN23P4u3s731Qs67TPyKK657vFyJXBwFgftJ99eE2O9HT521504JvM0QOF4v_bi3is6cTy2Ge5e3h1wAaBpGgC2vO78F1l3r8CV2XE6eg2JR9vU802exWg325jq0Op21lT8wHYrJ9s4aH6r492EH1e5cue8GcDp4vq3JNz2vai6a9Uww_-VzQYqHLB7QOa6cas2FXm3q9BrzTHrag5XCcXt6rq7EYf61JFzTTXcw5IoQjvfHvqyaXNtzXNpqwk34Wygj9T0asp6AiYp3gUuD1d1r8fxEY3tjYqaerj9x5-aVuJ7HiaC2vm62iggDaQqhmGbUgPQdQgrcc5lIrv0w9b52h4i6M5uVMJOs0ahcc50uvz9IB-J4MwwGTYqQYUi70xtNs07bSTw_BPd2uMPs72iiR-G8ij9ZLUyFQZt41bhQTRpwm2lHNl_RxBd6Mbd3DEOo9Dp_XdG_BNeGe3u2c396YZezi0z2Np0J5hj4lSeRphpcvRwclas93IrRaX1biN8cDwyclC_OiM8HD932MwZ1g42H_cy3vn7F9JjUdmr7P2t5Rq_b64ozSrL1DgpxlRpKCU5Jhkuz5-mHXS111916k_5vJh2U11eJ2C1o51S14P1tT22r6w1fc2415W1wi28J5B1ev2rv5e1aO131571qJ2o51RghuVEj35cpxTkWPZw6ivocTD5wv9tJc70Gmiw7VvkU2LVd6waA6cLv6s1rg22Q1sVbfkA-4oKkzeDn4YeLBBevtYLNByLJ6o1rJ2415sORViz55g1ea26r5e1e52ev671aN28J5Z1wl2715_1wN2wJ5m1qQ2iJ141q520r5J1w12wJ54PmZmAtZzXBv2wD1UEV9UpUpAH25A7zN4y1J4441nuz1Ai2C4AtbghSPQh6LxHuckdMz5TvrnL16tr1WCwQXnu2gd02X1oFiFoFieiGNFoH9fyqNKoGNeiGNeiH5F5iXeywQKoH5qywQeiH5Fic5F5wieiGNeiH5FoFiqyqNF5wiKiNDfic5FoFiFoFieiGNF5wiKiGNF5wieiFiKiJ5K6FiK5iJGoFtiic5FoFieiGNeiGNFoH5qywQKoH5FoFiK5clC5e9Cye5FoFiK5zQCic5FoH9fyw5J5FgAiF9f6clfuFgAiF9d6HgfuzlAuziG8J9AuFgFiclAuFgFicgs61gz9xlE0Jgz9xlE0Jgz9xl82vl79G9R2vl79G9Euwr22G9EuwrF2wlA6caa2vl72vl72F9f22ld6er79G9R0G982xix0zaDuFgZuzgZuzlz0r5AuFgFicld6Hgs61gz9xlE9Gix2Jgz9xgSu4lAuzlw21l79G9EuwrWuzlAiF9s61l72Jg82vl71waDuziG6HgdiF9Su3lEuwrAiF9d6clf6caa2xix1zaD0Gg6u4gFicgs61ld6caa23ix0GgR0xlE0GgR6Hgf6clAuzaD9G982cid6GrSu3gE9Jl81wrZuzlAiF9d6HgfuzlAiF9f6FlAuFgFiclAiF9f6clAuFgFicgs61g79G9E0Jg82xix0GgR2vl79G9R0Jg82xix0xlE0Jg82xix0FrRU1mttF0h8xJbuwStpHJPyerj63lPrqTz83dq7cserEsO4JXFoGaPIF9Pi4QcnsJKr36eh8slsziy4wC8sp151vYc8GX9h4QYok9342v_j67cm6h2tqaqQ159EQgV67FHXH1F0qaXwZT_a4mlh8iQrbBe_yabadcAwQMtqDgV62c_waDtw6fFiz1DucuJQnf-c4Od8G9L1wJYl7lMW7ig4DcrY3ia_8lL06gu4WalavDaoqad0H595JPZkUda2rfMrBmvfErqj8b-DTvJ75l62c1k31JfIvv41JaStq5j72vu01i223ctpa611eDF3epJg3c1tegn0eYppHMSHqre65aLuZ7-kwVi9eDs77u29GMlz4ixwVsQe61Ci5vw5H09eHicy_1r3DcE0zC26cXl9gXMueD327xEKf5T8chTv79Tw2Jq6aSgr2lcmcTbmfiu4z5P8Fj7t5l3KDTWimPUg2TcWUTEpUiF8cQ2yrgH8SJi1vaTiGCSxAukfsaR05i064JQozgA2JaZpwSciRmeg5CjprzBFJll0rl9229M03X922h1ycXHeeR6Sr6a03TroHM-5r5d67eocq1hmd_zq3v33vNayk4efo0jsZXJ64Qk9apnf5jpIJ5aU2Ja68S1g8SYoqOebWGjTxOpq5m4lEpjrHrz0GvE7z9Yr1Oi_OEY0x6QpxX521BMLzNs32yD05vj5xvnszml6vTruEwebeXw6eHDoq1IrYaYcaS6aW5a51TGiqsZ4cuA9DDj4HlxQzv51v113115_JgyevkJ14r1gr3j1oO1AJ4Y1rQ2414ar1YjeQhvg4X-a21rLv5y18g21okJAIBeCOxEL151PkBEYUkEKIv2151q23qvQS2r07ODu95QDBF2SNZVKJ5p1rT1_r581tD1NJ5i1rnGIptFLJ581pi1TJ58r2_F1XPWdzP71D6mraSmsDSfwsl47XKxVnR2JkdmRda413_iixNFiGNFoFiKF25CyqNK5wieiH5q6FQe5clCoGNK5wieiH5F5e9C5wiKiH9Cyr5KiFieiH5FoGNF5clCoGNKoH5F5wieiFieiH5FoH9CoFiKye5Fiw12uzgZ0qaG6caa2Jgs62ld6er82caa2vg82Jgz9xgR0xlE0GgRuzlAuGgR0xgR0xgR0xaE0J5F0xlR0xlAuzaD0xix2Jl72FrZuzaD0xix2caa1J9s62gFizaw6HgFizgSu15ZuziG6zgFicld6Hgf6cld6Jg62Hgf6cld6Hgd6Hgs2Jg62vl59Jl79G940xgR0v9Su4gZuzlAuJlE9G936erdiF9Auwrz9vl79G9Su4gFicldiF9Auwrz9v5AuwrE9G976erf6vl76erdiF9S0FaD0Hgf6ziGuzaD1egd6er79GiZuzaD0Gl22caa6Jgs62gFizlAuFlAuHgdiF9AuwrR0JiR0xix1cl8uJlW43ww1FT2rTl_2vhDm4gZ2Fs0DXL4w7uagSubTxC6kIhVtHPwdDeVuUOa6KBN71O7zv9P6FLmiYzyoq9W6Vcdyrl8o39xpJQpixY71TAbk2DUMLGaeQ1UeHTto434V4OSoq_euUK-hhgWYx5mtSCur4uRL6w-FCwm_vRdycXcUd9Pu4lGQd480cVq--Jg7Ay-ks2pQw5fiz9KeEXNp1Nt62QIecT2CV4gPcOJ2J9p3caKyr93RXva6eQz_UJ-bTug6JQ72192WF57rqgfuzli2R5OycQGpclE4cW48rTS6Bkpm6v7GrQo1rQ0e5rHiz9FcN82QdI8HA2u04a75vOEyQ9KuUJHtZEofwiafEgZr2HS9Gb45rIVcHiaoC5AWtOm9GDkJArZqEhW8x9Ji30s_IZ-KsgTtaX23C3xicXM2wvn4ri8pZEGoxXR9hspbBTK4Crn63HgqqNId2Oz51X8859h4v8jSU0Tfr6Ef5eOo1vpixI02KB-l5CBqziH7HHEqhNn8cDdxKSjyZSLIqQR8QXbkdrhLW9Msx5q5wn553rfqJ7-2d9F0Fs9i3vf6xZMh1NL5vEo7eTzWG5y7rT9bfvz7vQUq15ZRzR--5Xazr171iKMHH6n32D1711F15v1k1331pi1Y52aEhqag2QR8qJu5va1yze6o2p715s619gqo1d2a72TsSmTjpsAl8O_vqmjdYjlQfCPtwSPpx1d37PEeFndQdDv37gZuAg997AeWvn458uFvF9r1Jir13NFoH5FoFiK5e9fyqNKoGNKoGNeiH5F5wieiH5FoH5F5wieiGN2oGNFF49G5wiKiGNrF49e6FQKoGNKoH4iiH5F5wieiH9C5wiKiF5J1wrAiF9f6vrFixrAuzlAuziG6er323iv13a72Jgs62gFizgZuziG6er19G9Su4lAuFgFivaDuziG22aa13ixuwrZtv9Su3lE1rg82Fi71caa6Hgf6Hgs61gz9xgR0GgSu29-1ziG6er72Jg2911e619z9xgSu4lAuzaD03ix0zaD1q9EuwrZuzlAuFgZuxrc911s63ix0xlE035x4vi82vrcp2lcoTr2okAf1qANe2is03u4ZtXHVKBv_Qi9DJmKfqlvflxSjG1C_cUFMIge5Q9EuKwS0eDn1wz-8TP4cTYCs8Wi4Yr9a3D3fYek6Hs9iGag8Xi7ij0YLMpciaTCdxIH9v5Z1jVFsHlW04gJ_Ut-owa5vHTz86eZ0qTUpZi2Xr5z1h12_FNx7ri4_z_-KU8XDuutdV98d3iWa_pKsgSVgf64nk4-Go12Y0rxE963pzSjvaH9tbB0XdBn6HYv-2lzSkZ0_TrBpsusjYQXJFNR_YXbtqus_IqKTpgIo5Tfoq1RmerBJ_nr1qIZWGOM9q5a3KD9_Pw-MY4-A3rj9GC8xZGFG3XvqtLU9clW6QtytwgStVGZ_KtXbweyTpDShpSlxt913111_k9dN1z812a1813O1aX2h16K1g52xv7hL166Oxp-RoX2qv1m1sa2hr6W1sX20BaZ8wlmuGpC1wQ2ioaPDgVyFhpM1ga2bJ3q1fN1Qv6_OCG9SQ-X1rS14MOd1vDgmLkEv-MK9YJPSIv24kn41ccKkHv3vBv24a10SxAl9vER_d2vrrQ2z16U1sX2fv3S1pl2cJ6N1fH16gPGVyFOAmM_bXL7AmRpRBGNGIxQHkT2vv6J1f213YIpY0UQETKpIULX1rUFaW9Iua5u1qT2kr6k1eX1r15U1sO1r1211sO2pv141wLGpAfXK16313r2112m1es15QRpUGKX06S0qsDQ-3LIGvlVxBT2hJ6c1d7FycTo3BQ2011V13NFiGNF5wiKiGNq6FQKoGNKoGNK5wieiH5F5wieiHlCoGNK5wieiH5F5wiKiH5F5e9CyqNK5e9C5wiG5wieiGNF5wiKiH5FoFiqyqNCiH5FoFi2oFiFoFieiGNF5clCoGNKoGNKoGNK5wiqyqNF5wieiF9eiH5F5zQCoGNeiH5FiGNF5wiF5zQCoGNeiH9CoFieiH5F5wiHi15EuwrZuFgZtv9Ficaa2vl82xix0FlAuwrz9vg2u3lE0zaD9w956HX36GgSu35E0GgE0GlQuwrQiG126HgdiF9-1zl-1ziv6er82caa6ziGuzgZuzlAuFgAiF956er72xiR9vrs62gd6Hgd6er79G9R0xix6erf6caa2xix0xgR0xgz925r2xix0zaDuFgSu3gz9vl72xixuwlE9G972Jgz9xgSu291iF980G982vl71caa6ziGuFgFicaa2Jgs62gFizgZux5G6caa2Jgs62gFic5D035v5erd6ziGuzaD0GgSu4iG6HgFizgSu3lL1zaD04ifizgAuwrQ9G972Jg82vl72xix0zaDuzlZuzlE9G982vly1Gix1xlR1x5x2caa6cld6clf6caa2vl76erf6caa9G9Q0GX39G976erf6cgs61gz9v5d6Hgf6caa9G982xix0zaDuziG6cl80xix2caa6ziGuJ5AiF9s61l76eaa2xix0zaD02lZ2caaiF9Aue1M7cr94rigwgYtERqPwc5OuJn2Cx6tdtrMKnny1r3r1qededK9kEv24cNwtS6HwtXz1ekQ1RX21GSeh428UCTT2riOl612os0qlQPOOfMXowm3jWLSUni2WoKbRoGg_U2wvCb3Q8COgB6si2s9eNPNniM63rCuhtCrx9mTLFrFdatEVZxVjMX6922uRpZyK0UTVr5Ehzr69qOJ3JjLCEhbbnfNXgT423aHgUCZCJ5ubj1GiWM5cv5u1qT29Fq3R56nrDq8rZmAjzi-ZNGZfJ7EVBEuWT8-PISVT7mTwzQLE-z3vV9l9x5_1xYWj3r021OGRL6JElgu9m_MLT4j_p3Qbs5suFS5xDPpR8K-PSM8lne8oDbFOXsiuao-51g02vvBtarHGUcGY-Gsh8YThg6EhTYkudqq2_lbtarq5CU0wdO284J3FagHs1hC63iwwq5S4XsDdjevTgc1oFEjYg1PxtJEYzY7n5EVj7HgssTqvFnQ02CniJvptpHDm_XzaYeogjPhq4XV0VYdPkh6w79VkgrHiFAyndkVI94JjrqvlzMYtxQSmdYEIdaC5zm8q4CzvDcCnB34_IF-BMeJw5pyzwNCqICxfhCo2sjiYPEHOJ9p1rn44x191ZB-0NPXYN4tlvDr5rXx6SYvLgshjZSMu3OX1soGX_BuQf9XtF5PwaS9xsuwlwmTyFsqxWxZZJeaG5YGJdxoz5lDi0MDRdslj5C3bSTK7qTbdW-Hvv5xp4O2zQ5D0QXt5ae-5F9J05J21FXvaWiRth0XdQC5pGu6aqGVdFni2y943vv74ziX9g6VqShC942giF9J03htMM2TiH1x9cgsVhe6yWILIzd7uxsOoJ114v11_v1ef1mE19g1Or3A1oO1-r4M1rT26v5b1sJ2lr6M1gg2Qv9Fr23jkALtzZLGP0qiRk7RTkEBKJ5f1eO2bv731fv2kv4S1dVDJlw55oVX1f014l_pGKzMAKKBByIzs-3C1qv2potWSG5mre92sv6d1wv2ar641ar2tv651gT2ov571rr2215x1h123v1P1rUZbZLDRj7BIUq-1e527J6x1rO2vv6L1fpF_nYfSBD2y16i1ar2ov5x1rUSyGQMtqQBKr5p1q92ov651aJ2yotfs-IMKv6G1dX2vv5o1d927J5er1GQIILcRkeBbHJSmFdV1qO2h17uP70frQpbKv7u1u51Hv5S1w12cJ78OFTBE0e24r591sQ291751aT2rr6S1iQ1S16k11i1J167PoFMAIGNL15aPbbkZbT4MBT2aJ5h1eEDVLtFIoh23J5B1pv28v511yl1Bv6J1rX20r5y1rC13gE30Gir16STr55y1gD2nJ591gr1MJ5n1111115n1tl2c1591fO2zke1j6Dp3ov2vodBwonG6Jv1oFt5H3_5H29fyqNKoGNKoGNKoGNrFwt5HiDF5wirHirGic45iNrGH49GiH5F5elF5irF5wiF5iw76Fo5iz9eiFirHiw5izirHiw5ic45iH4uFe45iv5KoH9fyqNKoGNKoGNKoGNKoGNKoGNKoGNKoGNKoGNKoGNeiH455wirHe5F5wirHlreiH45H245iH465wirHzirHc47iH475iaGiH475wirH25F5wieiH5FiH5FiH5F5wirHiw5iw12uzlAuFgZuziG6Hgf6cld6FgAuFgZuziG6Hgf6caa2Jgs62lAuGrFicaa2Jg86cld6Hgf6caa2vgR0Gid6er79G9W2vl72Jg82vl79G9R0xlE0xlE0GgR2vl72Jgz9xgR0xl72Jg82xix0zaDuFgZ0xlE0xlE0zaDuFgZ0xlEuwrAiF9f2eg8u3ix6ea72caa6clF5qgR0xix6erf6erFizaSuzaD0xlSicldiF9Su3gz1GgSu4lw6caa2Gax6erFiJl76erFizlZiJl72Jgs64iGuFlFizaD9GiZiHlduzaD9GiAuwrz9vlzuzaD9G982vlz9caaiFi8uFi89J5D9G9s6rif6erFiza2u3gz9vgs62gFizgR63ixuwrAiF92izaD0xix2caa6ziGuzaD9G982Jgz9xgSu4gFicgs61gz9zaZu3ix2Jgz9zaDuFgAuwrz9vgs62gFizld1ri72Jgs64iGuFgZuHiAuFgSu3ix5FrE9G976erdiF9A0Hrz9zaDiF9d2q976erdiF9AuwrE28QSbwXr41XVoeSu5e1Pywg_A6SDbsBwjQ1y1JOh31Q7n8O2ZOdUExgm6ITSYDu9uSjtjEizWWi_lbVMpTNz81Oi6vOdg56q62uaPvNf7eQhoRS2sBugwdPtjqsfS_6loqOErrJi3ssekdCBEEUbv_QOsFvBi29l1fzwlGOIdACJsreh8GNl0-TYomSSj1HQ61QInwMdg72dnZO4Fw5EfrDn04gY2K563rOu0xQtpCDYqdaDeG9U7wenpqQHp-XR04Xh2ve_eGA4tYIIubr71W6y21eyabn9wzXPd5lNyssirzQW65984I_yWhb2DhcyzqO46QQEp8qbQR2LRqXCtJrR4GlY73StiHJIw8SqiqQPobR-neaXe3ax9vl4h8lq5JgW9yeltFMywzM3daW9wQrbiJkY9w5-9q1FuJaHE8vNs29jjsla3FqycFU7oGOPqp2b729CwzJ-tFOB5HNRWRMcTxvWeDQdgGQT0xTXr2g21bBbiFEUaW5a7x9ctWyzkHOa6yrg8eiw7du605Eflf-Eoah1eGNhuxhmdWWk93aH9rNer4cbe4nKDRcui3XX3aXIE3lIfePGyD0a1KBJ22JUpZa5nGOIbFqZwZ1iHe55peQP_LQtoDTQ_LXcaWgHHqQGpSTl0B1g4eDJy2iRihOLolv31q1f9T1v0Nn18xEf9rNWilz9G17oa62p_OmY6QCy1d04aDNUrs65iqP95cZ-tNE5LP-RzMOF9qD77JVxmTdIc7r-iGlGoFM305Xn5HreoguyoQJPuv7j_KgPkXlW0dia2Pi223lc3vTR_lDZw6c5yaHhesrBaxujoq9cqz5b95T111r13KX15dg8hv371og1Mr5R1iLADIbm1-z8uBO24r4A1tX28kqscCpzTBv28kqDEYpqVoT28r4T1eADV3OIuFnX1qW14tC-mPnZZm95KiIpCkO24r4A1rQ28BnfWh3820AJOoJ23r5017Q28J5br2FB-J3m511r122YNoGNrA2YrDuYg1i9wGQY72v913NFoFiKoH9fyqNKoH5FoFieywQKoH5F5wiKiGNeiGNFoH9fye5qywQKiGNq6FQ2oFtu5wiKiH5CyqNK5wiKiFieiGNqywQe5zQC5iDe6FQHi15AuFgZuzlAiF9f6cld6HgfuzlAuFgZuziG6Hgf6caa2Jgs62lZuzlQiF9s61l72Hgf6cld6Hgs61g70xiz6clf6vgz9xa72Jg82vl72Jgz9xlE0GgE0GgR0xl72Jg82xix0xlE0Jg823ix0zaD5GgR0xgR0xgSu4lAuGgR0zaDuziG6F966v5D0FgGuw9f6ziGuwrE9FlfizgSu3gz9ca76erf6cas61ls2caa8v9f6F9AuwrE0eld6H9FizaZuzlAuH9ZuzaD0xix2Jl72Jg82GgS0Ggz9vl72Jg80zaDuFlA0xix2caa5Hgs62gdiF9ZuzlA1qlL1xix2caa6Hr76Hgs6erdiF9Su3ld6cldiF9AuwaD0GlE0zaSu3ix2caf61l76rq4y8OM51JyyxDmwe5rowQAtDc5bCC-fm2Pr1X43HQ93rme9sX31lqUEqlm7kvGUau9uS7oPHNzvvgi2Sl_lbVNpTNz81Oi6vOdg56q62uaPvNf7eQhoZO_dIsdwdHyjqs9s_VgF3JB9seqb7eAEEUvxb9daS9Bi3Qhxv57xvu_2v93yw9GiE-4Jrwh0az_RfQe4rJ35x9DU5x20ad21Ig92rinWAXf5cYppTu25wTYyFimtcvhhxlj1csqrePPeH9s0e1u3zQGeFY12vrSuzlb5sNK-WhO3T0P9xvA3vrJozTIhxnOac5Oq3lV1c5f38gUyJD421aHERgBse9jjsla3FqycFTIpS1VoQnvfHvqyaXNtzXNox1w32VzbAqbp3s9q2eWpqvEpzl_7rthcAY3tjYqaerj9x5-aVuK7HraC2vm5HihgDazqYmGbUgP9G_2rcvG1wQv0wll4c61y6C6yVPJOs0aozvge3wNwZWS1v903WDSao1byqPya7gUaXLLP3c4931372NliHg821OCpFOMnzab9bVrEwJLpfua1rsg8HJUy61Rs5cpUw-PFrune8qmp3bpheVpe4uqUpGs_Yiv9wvzrQ5QW5O246g9cWgApeTs1W47Kd1bi5qockxrs3eTtz1y31QPt9tztts1yfaE0xlE11a18_Vv4sJ8sv1z15i1mv3S1yi1RQ2yjAPkaULHUBIrGPBjAQcWsWh9TZnm1X-IqpP9zBFpoe-7zFJuDoU_SMmtRfSMmXi4TXGLIWhthsn_KZpgEpyzlQMflR0fwJiF6FN03qT113NGixNFoFifyqNKoH5FoFiK5wiK5wieiFiKiH9fye5F5wiK5zQC1qNFF49KiNJG5wQCoZJK5clC5wieiH5F73NF5zQC5wirFz9GoF5J1w966ziZizlAiG115c5a1Jg82vgi1x5x0qgR03r3ue1q13r62xix0Grz911e62952eg66ziv14lAuH9S511c9vl89v5D0GgR0FrZuxgAiF9d6er79GlfuziG6er79G9R0xiz9vld6FgFicaa2GlE2Jgz9xgSu15AuFgZuziG6cgf6clZuzlAuFgZuziG6caa4v982caa9G940xlR2vl72Jgz9xgE0GgR1zaDuziG6ca82caa1qgR0xld6er79G9E0GgR0xlE0GgSu4gFiclf0GgE0GlDiF9d6Hgf6caa2xix0vwfnv5alc0ZUw67o16m1EFRscro7Eo-Z_N1_WK-BIZ-YlFt_QF-n9dA1jN2v1i79qOA7_BjgKV1_fHC1ag2UsO2bjVL1cQ3bqg52skMLbZMw6Ww0KX243182va61wXGNocp7b5505kErxQz9x9x5xX761mqsIex0D2DgGOQe1u45rNVgeh79FTq72iig1OS5q1u4qM3p4vIdwPruELttrl742YairlheqvF4vr43fiXuGvN2vwBH3AYpqu6t3vTyva6te5t31TYuxc7ZZa81vgo3A0iiHiwt1gZpq6u2Sgm41T62KBV_W8--uK_14DDb9RdfE1m51Jf-v9OHJ5u1gJ2fX8G0Fvl_bf-lPb-oVQw22Ou1wBJ8eJ27YT2n17551_Bs4YvO_F922reizvMrxXX4ua9mGNC2Jl9QSv7hS1d1vi92FQI5v56p3UUmQJOtpLoilrdTwgG62cguxDRtlGxREW3Qr6np2vSaVhc65rJ9wOz9v7gSTSbrwH5oa6__cP6l2TjCZiFr4OJnkNFicJbmw9TuOWircnmoGE2YmFlQ2Two4OB11918_ZV5mN9Yv1H1pO1E52tr3AE16caa7YW2YVezrHSl2vP162WRvJg71Gnhs11orlTve5eIaTTwqaW7Whcj1iv92TXu43axvU64QrIlRcX641p4xOa63Oy3z161HUz1J1KiGNq6FQKoGNKoH5F5wieiH5F5wiF5wiF5wiK6FieiGNF1qNF5wiKiH9fyqNKoGNKoGNeiFieiFieiH5F5wiF5wieiF5J1e119q116er8uziv6FgF911e511c9xgR0J9c9xrR2vgz9vi723iv125D5zlEuwrQiF9w2xix0Ggz9vgs62gf6caa9G9R0Jg82v9s611Fiv1Su3lEuwrFiclG6er82caa6ziGuzlR0zgFicaa24iG04lE9G9EuwrAiF9d6HgdiG1quwr303ix2Jg79G9EuwrZuzaD0xix2Jl72xix0zaZuzaD135v125a2xiz9vqu1br2Iv5L1jlmsai27Aw1GJ5h1zZ-Y_VFlBjVyf4-6OI-vSlMA8wOjWI-Gk8-D_C9VkEr1rtrXl5v3qggdMxsUWV5wDgWieJf6o8i1f4kHv6sperMfHHv42Etq4Zprrr6o3P71gkjPr5e7Xmv0qlE95Rni-kalr5E_0F-ugqmA2MU0eiU0DEmhhWl4r9W5clWuH_-LtBJ_Tw-hxOf3Jr6bJ711jb-UyHaxe_TaKVE_Ww-TbCLySvk_WjymEeK1rxzPJ7t1e_a1f5LIUk7NKVu33K6TfYnWdC49FNH5c177KBTHP_-Y15uKwmkpJJVDFJw9zQIw9WtT4QTyAEwPInztGQf73su6AS01f8PKv5_WW0bgqij6x04rQHnlHO66GrbTWSxV15g_Eo-vqiW1191dtZ-5cr9qv3g1qr1Ga501rr1pr511411i15913r28r5jr2XqenIUq-dLxAtdpqrqCgKdSTKW5xrY2zt6mZnFvTpC1qg24a108cBXiMMuGAvELv5712g25BywRDSTKr571ei1RJ3b1ei22IeTwrs4coO24r1l12J28Q1i3vUKcuckdDtGyFP413NFoFieiGNFoFiFoFiFoFie5clCoGNKoGNeiH5F5wieiH5F1qNFiGNF5wiKiFiKiH9fyqNKoGNKoH5F5wieiFiKiH5FiH5FiH5F5wiHi3a72Jg82vl72Jgz9xlZuzaD0GlE0Gl82vr62Jgz9zaDuzlZuzlE0GrEuwr-1zlAuGr1uwrQiHlGuFgFicldiF9Z04iG6er82vl72FgF92lAuFlAuFgZuFgZuziG6er82vgs6er82Hgf6cld6Hgf6Hgf6cld6Hgs61586cld6Hgf6caa9G9R0GaE0zaDuFgZ2xiz0qg82xix0FgFiclGuFgF6F9ZuziG6er82vN32egf6clR0xlE0GlE0GgEuwrZuciZuzlE0GlE03aE0Jl70zaDuFgSuwrZ2Jr79G9R0Gg82xixuwrAuFgZ2vl79G9R0xix2Jlz9vaf6v166Hgd6er721lfuF9s61g62JlA04lZuziG6Jg86Hgs6Hgs2FlAuzlAuJWQtAeTOqQR5Hue0wgo4clw221528ON_bt-Xx-Eh7T_hPbCA3iD_K3IpwMkQI6B_vwMI15fGLYfs6efa0Egs6SX1rbTW8N91Ysef5v2ux0CteW8xGik8rgATaTB8H9c4ce-nfhGlECUj4JW8cDw51l8_W1Noq6QYQP2TsHxGgtNaeObrwdnxcTn_LnrQ6rLpaOh7cildYUjuLeglpayqrgRcDu31DXeh6gvrrl62vlBddG2rsh2BzaQ4fe9kwb-TtBN7Hr96zr893RL_KBxqFikujhLr3u3wgWO7jbhHzC6IjCe9WSyWfR-tSeo1fl2w7sNqEw-M9yunfKA_PmpkOg3dYTRmwNM5ris22rr3Jj8xzvCgzcx5W2weH5d3JM1eWqpyS5D56QBiFJmSWrtuaTWtFU4Eol622aFp35E4x9cp3Bh1vE9rDO531vw63sytzdV41bRIcTjuGli9Wgs4H940dY9p5QUVgeWdQu71vQ95c5k7xa02rDi5H1e52uG_RgF8JXJWQrPkFs5oeAK2qQmpFaOG2l21eJecHis5H955HH3529CE5YpRrim7raC2vg71Fmwr5JZ9z5Cor5wtqQd5G5W5F561H132qgU5HcIondkKgAhjwl32x5aqx-vAVXZ1GXI51N72xsKg_BnRxOSy39zeWTn31ecpuV-oSr-V5gstS1f92WM8Q1OyU9-tG5Pw2r11v2T_l5rXJcB14D1nv1Ar2cv3rQ1hEgWl4QCb5aWjr11qG5c3ZlHg1O1oFiKiH9CoFiFoFi2oFieiGNF5zQKiFiKiF5J0eX38J9d6caa9G9R0GX40Jgz9xlE9G982vl72Jgz93r15wrq03rW6HgWuziv6Hld6Hg1129s61959r579G15219s6295iF9ZuzlAuFgFicld6HlFuziG6cld6clf0xgR0GgSu4iF6zX5uwr313rQ0xiz9vliXGQN9DlSizXxjqMg-AUgbAGI0GS9x9citY03VDMjzzK-nbVe_O_d1q93xv6E0qD3eEWs1eMnzTnrVJ7n1eu_FKCZ_KRVW7fo_EwMAtVRXyT2kNuSSXx_hWPstanGpxTxv2gw7xc6WndFcwDNiH1zP4Y3Jlyfl4M-_Ko-dKCKLUUeSD3-UNH1t4icpqikwHCo9aWQvyg982Oc4Jr262_y1li25nr2VbZ031937rro4HgGa_BK_Ob-G0o7_WU92Gl9mLk-t_yP_zAS8H551cva9vv61c1hkuk2ueSqxUaSm4Yn1riRdgB9m0l2oJ5E-Zrq311912bMO2gR3iO1Zv7O1lO2Z18N1c530v9D1TdH2HUB1jv2zr4q1gY13GgW4-X1uMPpX-8Trq12j16A1a91v18y1m11m18l1xX39J7K1mJ2iJ311cD30J5c1092yr2M1rQ1Ov5Y19X2sv2c1s91hv5d1pi1rr6HPibAHKvFL16APuKT1yitrrD2Y11j1gT2_r8V12r2Rr1b1gi39J8l19130BnqbkpygdjzJ55d1f51Mv4X1fg1V14z1jr2xv8V1hD2vJ741hD2-v7p1jr1XJ4T1fg1-14A1f7ZJpuEggVGbh026r9R1912Z19z12l2Vv8a1li33v8U10r1P15c1uv1Bv8a1m11Gr8l1mN34BpcxT025r9W1ci2mv7o1xX1H1861yX1NJ7G11127r5K1wi1fv6g1gUDtEca7cc27J9v11l3ov7r1fr2wJ7m1d53ov7h1z51319w1412nr9Y1cT2Nr981qO2iJ371nv2iJ8W19X33Ia7vKVMZJ224J7N1ml2U17X1kv11v8l1yX1FJ6g14Q35J6C1cT32Bp3Kr3V1ml2Z18rPbzaFN_a-oT2D18l1mnG1oA3rer32J9j1fQ35J1C1sv14J3D1dv2vJ661391wr6611i1lr591rQ23r3D13NF5wiK6FieiFiq6FQKoGNKoGNKoGNKoGNKoGNeiH5FiH5F5wieiH5F5elF5wieiH5F5wie6Fie6FieiH45ic45ic45ic45H2455iw5HirrH2455iZ55ir2oFiKiH9fyqNKoGNKoGNKoGNKoGNKoGNKoGNKoGNK5wieiH5F5wieiH5F5wieiH5F5wieiH5F5wieiH5F5wieiH5F5wieiH5F5wirH49G5irrH2455irrH2455iw55iw6H245iw12035G6Hld6er79G982vl86Jr26caa2vgz9xld6vad6er79G9Q0FiE0GX30GgR0xix2caa6Hgs63ix0xlE9G976erf6caa5cld6er79G9Q0xlE0xix2Jgz9vg72Jgz9xgSu4gZuzaD9G972Jg82Jg79G9E0FlZuzgZ5FgZuGg1uwrFicldiF9ZuziG6Hgf0v1Eue1Ficld6cld6clf8v9FizaD0GgR0xlE0GgK1xgEuwrFivrf6Hgf5cgFizgSuwrAiF9s2Hrfuzl-1ziG22aa9G9R0xix2caa6Hg49zaDuGlE0GgSu4lAuFgZ9vg81xix0zaDuJg72Jg79G9L1xlL1xlz0Hld6Hgf6Hgf6caf6caa2xix0xlE0xlE0Hgd6Hgf6Hgs63ix0Ggz9vl79Hgd6HlG6er82vg81vg82HldiF9AuFgZuzlAuziG6caa2Jgs64iG5FgAuFlAuziG6cln1clE1xlR0xgR0zaDuziG6FgAiF956cln1vrf6GX30GgE0HaEuwrAiF9f6cls6cldiF9Zuzl10GaE0GgSu4iZ1rr82vl26caa2xix0GlE0xix2Jgz9xgR0xlEuwrFicld6Hgd2GgSu4lE9G9R6cgFizlAiFl2uziG6clf6ziZuziG6er82JX39G9E0GgR0GgEuwrZ6Hgf6Hgf6clf6clFizlx0xlE9G971wiGuFl-1ziG6caa1xix04aDiF9W0xix2Jg82HldiF9ZuvNf1ev2e6lV7eJJpxRYhHTS-r591jQpjgDRrdltcr5nkC26JKXsj19k6QPuYE5g63Di2rKt35HkceJQkDsWtwFTkgpwqAk-EYeplX1F83T92vy7h83snFPj8FNFszA7iwWdbxcId7FktUJIgTP5s1XxrbI-AwTxtzXTpzvX8a9AqRMo_TCOw39fpVEzIh5Q8qiYs4P5yc983D9P9T6wwxO-8PKt1fTV4H1crf-HpewXj5Xqk35-p5UAhXX29zXp5sNcauQa97u3q1X44xDM5e1-mojuossDhZgqgSro3QMGyB6ar41Ad_ME6QH_7xam8Flc47O7w7CubjrH7ZEYDfDtaVu6qD0rfTf84c5cqq0owXU6e8OhjWQYehTSmF1N8zY79H9jyQmZDWenhwM18FzyqzPprH6j06dklsCgPL2SPcl81HDveUp6t6l0qqPp1q3xa50gIr5bjDGKX5i03D9o2eNf7cl43eJjjQTO5x9F_U8S_ID09sIe9J5N_YG_7sBDqYlR721t3ve99F1Ji42PD3vIerc86zaAPjm-aH99eQ-3sqpniHQg72Y04NmWXSytaqDKpwOW0DTf4xO_xE2GGc9r6sq8szsIpwPR21N03HvYGS9YwWCHoa-5f9_L-e5Ui71Tsaacr7FHgfb-_zTj1bvl5DcBiJJZ0qH38fav2gmP8rTk7cTWZAispASD_EXd5qaXdw7lLlhu5w01-CTLujMcm3Ji3HvL2gpJ4ce1bE2D8H9Et4DXQbBH7eDVizsZcCbRQ295pWVwJzDH9FHRaDhtkQCHvl1_eRul02O-FLJ26qNxrEO2taW59Gie54e0ifX2j_GK1rvbbUrJug2kgfegtzljfHHyv5TGpV5_uHlc8xu9xdNb9gI-V9OGeGEKBDwkc3gVS9Wzs7YrrvvIOxajuWK-RFQyb5QtiYgDe4Qr5504z0R-FBPQtdQFEC2XfGupxoFwkdJ81ETdoGgWrGQ7kjTSkW60fjF6mdNHtTF5YXNMh6eEqWEQ22g7ddu50wXs85p4UbBTMqeh62W2exrvqTojvdPnt7eQ0HT24d1v8ev79X4nLEmgyar21Zm26z1zqqhudGiBdCjqUgM-m8vo1AZdQ7MNdcg42Hgf0e592v9s88aq9cT2qEGu21laySvR1eDcfEJh1munq2vm2vv45vl9QRhBtc1eyqJL6esaTrXb6rJ_6SPA2ra5_RyQtd5ZyqvhtGQR7aSitQ9j6vQmoFOIo56F5e9b1rO932lR55hneRhR_wTsfqlX6DOMptVAT6vSqvU2uvvW52qQor113v2Z_cQd9rkw18128v5U1wl2rr6u1fT2RJ8y1bi2xID2qr651ar2015Y1qW13cH-E0ywbxYFlZC24v5J1wa2ur2-1er1iv5V1a12r15h1pJ22J5i1rH14UFiH4BMZPkMSOw5PpH-LJ5h1pJ1I15hP8X485ZOre92kv6Z1fl2Cr8J1fO2Wv7d19T1817x1l92Br8k1qg29r6i1ajGpxcAKJ5c10g2ev1d1q52ev5c1ah13qvdLASP2AI0IIv23Q1ruJaVD7hE2SBhtvu5CWHl2D5p1wi2pJ5M1wv1iv5f1qO2y15I1wc13wa8Yv93Rvl86ID2G17H1gl2Er6j1fqFM5e5yIv24BaSuwU3p3xN1eJ1i11J1ri1yv1KiFiKiFiKiH5FoFieiGNFoNJKF3_iF49KiFiKiH5qywQKoFQC5wieiH5FoFiq6FQeiGNF5clC5wiKiH5qywQKoH5qye5C5zQeiH5FoND2oFtiiziKiGNFiGNFF49e6FQKoGNeiFQKywQeiH5F5wieiGNF5e9CoFiGic5CoFieiH5F5wieiH5qyqNFiGNFiw162xix03l79G9R0xix2Jg82vg62vl79G9R0xlE0JiE0GgZuzgZuzlAiG1fuzlAuFgFiclA04iG6FlA9elG6clAuFgF6G5Zica82vg82caa6Hgs61ld6er72Jg82xix0Jg82xix2Jgz9xgE0Jg79Gl89v5d6er39G9EuwrZuzgSu19E9G982xi72Hge52iGuFgZ04gZuzgFica8uFgf6ziGuFgFicld9w9A5zaD0GgFicgs2Hrf6caa1vld6HgFizgZuzlR0GgSu4gFicgf6clGuFgFuzlAuFgAiF9d6er862ld6FgZuzlAuwrR0zawu4lAuJl70Ggz2vl79G9E0Ggz9vl79G986caa2xix0GgE9G986Hgs61gz9xlE0xix2v5DiF9d6erz9xgR0xaG8v9s61gz9zaDuvaG5er79G9Eue120zaDiF9d6er79G926cld6er82Hgd6erz9xgSu4lAuwrR0zaDuFlEuwrZuzlR0zaDuziG6caa2JgW6cld6er86Hgs61gz9xgSuwrZ0GgSu4lE0GgSu4gFicgs61l75Hgs61l76erf6caa2Hgs61gz9xgSu4lAuqgR0zaDuFgZ0zaDuFgZuziG6caa2Jg66cld6er82vlf6vgz9xgSu4gSu3lEuwrAuFgSu4gFicgs61l74s2cm08-AFV5v8dEgcTz8cXvs-_-Mf6tIaAD2J965Jlb22X091-fG6-Fgdi23E9SsHljx8zCISa269zyjvTL1aKNhRXE62etd4i2Xwsq7vD72vgspvv9gC6rtGQYjqJi4339tsiU93S2eq1AngGGq3oC-wG9kxvLtF1Sdh6LsIMlwjNM0wD-shHk1s4c41c34QD56FPUWESlgcOH7cMB1rLTW7ip5ANboJg525QD93JI0w5TerXy1v95ox9ctzJFix6ywqi53qNai4Tm0zvi4vXo6xp5dvlY6Jg82v9GqhudsJQCmDlKeweuwQ02rQ6BwziJ9QriigHOMgXs7z1nw1DyBC6mMtFjnacSDw9x21i5mqC24zuvrdNl1V0HrD2iaKQu27TMfaaDcH4h6eHJpJrU5Wvzorr50xgt4TSZ7JNpyqDzt76O8yLW41XD41C7r3aWoJ9fi21u557peqgAeHaRqF9GiFly5w5Upzvu3vTqwDJt2aNtovvkeeXV0xOad1Tp0rl93197iw5xpevipGXj23Nz8z5F4b1FqxMxyw593ruhee185GI5pqYh_1yQLRQz9FiO1J5h4g5M0rTue9MqjRO90rrHLcXRE1r7hdrSslpuQk6C_sDPMH5aoqN7221oReOnw219iT9CmE554vhrY6BJ_PiH8Fvg5PuCor5VyeNr1H3R_YbNBbVq63i65scWecHn4196oa2gpem_a15llFj1B3XUtwM8f4WY_KgY1vr5605n7vmhfvQay785UFDr4JTwg5Bpjls86HTKuzlF1rae3orFh_A0Kr5SwQCusJ942Jr8gNA9LrJ521ChtqrAqYmHQG5Ys3gGh7-tlbCkQg08vDiM91TPqUXZw7F3YVOY_Y2xv0MV1wRMuvQeW8PyyE95PJT665vGqrvHi3GJu2Dr72ls9x5co2Nj7G2SsXln6JgxycXJbqQ-xxty51NMielx4a5S0zQH8Jl522lL0HXO5eupu4HOi3rD7JzBy5ONiQPo92JVrqOmtHlh8F1Bie5b7cvf5S5Nr9rk6QOD8qsS0T1H0GSusmiw54OJ62ad8rTnt4rx7sa24JJYrqPeprg46wgPoqC95J1916o_urMT2c11pJ251611f13q1oX1Gv4d1oe1f9a013Trpv9UpRra8QcjwQiCyeVfs5X1wc2y1RrnwQXnm1yxhgA_HlfgYBGFQVooDlVRLYynSuqjOoUjsDPeeaa-tciY0eK9xTs_jOo3l8M_1v9Wj82J4JNkiFik13NFoH5FoFiKiGNFoFiK5zQKye9Cywie5zQCixNFoFiKiGNKiH9CoFQC5zQF1qNFZ49GF49eiGNFF49e6FQKoGMm5wiF5zQKiH4iic5F5zQKfwiGiw12uziG6caa2Jgs52ld6erz9xg31Ha45Jlf61gz9zawu3lEuwrAiF9f5v541v5s62ld6erz9xgS5H1Z5zaDuziG6car1J92ic9e519z9v9e529f9v9s629Fic9eu1926cld6Hgf6caa2xix1egf6caa9G9E1zar5FgSu3lEuwrAiF9e61l72FgZuzgFicgs61l72Jg26vrd6er79G9W03i89xgSu4lA5zlZ2vl72Jg82xix0zaDuFgZuxrFicaa11aDuziG6caa2xix0xaa2xix0zaDuziG6vOP8F5vocDm9Jhgs8EJbJr521rP9WQ82vlWt5XjwJ5U3vIMsJr8d3QK21g9iHNnivl9_bpaxhUec9EjcweurzlDeFD7bccfp40ZeQiLpTb-Dr5o3Wglucgx3rv0ieMR22J4osequqOvocQE9U8SIYX2kwlO924-_KBi8wiYihT_IwN5e4XNe1Jre35Ei8rl67T27zed_KOpHd68is0Orzs9NAuOe5ejwQsukvariz9P6K8GEKVl_41igpN2Rr7Dy_CX_Pdsr3gJbJimnRmAnup9w_At_d92018f_h0maquoukQG916g1bK21r4_9GTW9tBW_LI-Vrif_TR-dtVc_Ri2bv5a1fJ2_kK-i_7H_OQ2qJ5oDJ6M_tgJe31AvJNetHNH1s21bRlsdza2d3O2y15nqDOTpqQTpxB-McvY-7iLmZ9_ox1Q7GQHVbBQ6DDJ031Jy5i7ucXXE4X24OOeoFgFiJQtr3Nbisls5sACwfbMDr0okd5Sr7CapDmMjDP1gW113r1c_jXe0JbY15N1vJ3l1ig1FJ4J1tJ2uJ641rGM1ea1_r5m11i20J57r2wF-yFkGCZt1BAYnW2JsAHOgd67Ukv20BtkUjRkL15ROvyfeIT2y15-1wVSxCLkzYnfLr661rjA5z111HS7xkT2yJ5B1a61pZsShPoXXb8HBL8cO62Ok6HEbZMl5v1J3ve0ywQUAuzLRN_oGB3WYl2EWk3X1wpFf3ILJoQ2415iON4LpWGX1wpDO0sE3eUX1a7GqaQj13NFoGNq6FQKoGNKoGNKoGNeiGNqyqNCiH5FoH5FoH9fye5FoH5qyqNF5wiK5zQK5zQF5wiK5wieiJ5KF2lCoH5FoFiFoFiFoFie5clCoGNK5e9CoFieiNDGic4i6FQrF4QC5e9fyw5J1wgZuzlA5FlZuziG6cgq6Hgf6FlAuFgq5FgFicgs61l72Jg82Jg42vl79G9E1xlE0Ji72Jg82vl79G9EuwaD0GgR0xlE1zaDuziG6cld6H962vl79Gix0Jg82vgz9xgSu2iAuwrAiF9d6eaa2HgZuzlAuwrAiF9d6er82caa2xix0zaD1egs61gz9zar5zaD0GgSu4gFicaa1Jge6J5E0GgR2vl79G9EuwaD5H9Su4gFicgs62ld6erf6cld6Hg79G9E0GgR0xld6Hgfu3lE0J5x0Ggz9Jg79G9EuwrZ5c5DiF9f6cld6Hgq6Hgs63ix0viG6GgR0xlR2vl72J5qiF9s61l71caa6Hgs63ix0zaD0GgSu4l72Jgz9xlD1Ji72Jg82xix0zaDuFgZuzlAuFgAiF9f6clq1wrAiF9d6er79G9E1la41v94o7DX31H584a40rT94vQt2vPrd2Opax5H3e9523lP2Rlp3xYbizM931i6kJXd3elu2HH304TT3JQFd2PoyeDS9HDi7dD6kzgXy4vg41Oi219K9q1J8rvEicJA52LV8HTcicDcievh9wivi1EB645RjTO82GDzhQXB2tvi0xTI9JDppaabik2_ieNWecgs4c941Jv6ox9Fo1a73vPT7evf81l92rpc8cOAeq5w035biFPVnDii3H5e2JHf81er0xVQo5582vg77JJp3vD4sP6Bwxru0rJiaq9J3vDhg5gbpagpgWN68HJ84Q9vicNQ2eTnyrguuz6uo1Oigr8Yfw9JrdOC8wN4Hra72rhY1eqdoDlIqtBHICSzuD9v8MN2Gr5_cwiP93u1lfk1AcK-dqlJJ9X26PQMttBH9AaOueJfdzOI48dvo3IK_Qv275gKodGQq5t-Ati631Q3WC9TixDWk15CkdKpsxOg39fV3cv51Lcj93OO8dfcXEqkaxDWV_KN62Nbill33v8KjeDm8q1xopq2_PIl_R-T1dT02vgq9GEcoqQowv7y1q6C9xQDp7LCLdY5f8aKizNWus2F0xrQXva72vh2i3NP_WJy4FNEoxrKvr5y1s6le4NVyFSM_R6e5c2qi15x4G1b8HWPoGJPpbBX1fMnoRTU_OhZpaSw0AgA85O_qG7-IUnF0soL1rF-i3vNucM1o3gYyDrmcgo-tTPKIqOx_L4NSFHRoxcokFQ11r291sr5f1qL15g1051w4xv7oJrjyeTToFld4vg7pGg33J1KiNDG6FQ2oGNq6FQHi15AiF9f6clAuFgAiF9d6wgZuziG6er86cld6er86caa9G9R2vl79G9R2vgz9xlE0Jgz9zaDuGgR0zaDuFgZ0xlEuwrFicld1se46evT3rQl8aY28JJo82SKoqQF5HPImeNbp6O86c9d8dg8kHgbpvT0k4Jd41JbzA1a3ria62Tmu4T4ClE18Haa8S1HrYio4zlP6dri445h5sY5j3u938uvLcCCm2OegGillJgoiHOjs290p4lZ43rs711212w_SJib2ii1p11Lr2rf12l17JgW0rg7pvNt7Hl111Dc4r1KoH9CoFi2oFiK5wiKiGNe5zQCoGNHi15AuFgFicaa2Jg81v1z9zaDuFgZuzlAuGgR0zaDuH9Zu4iG22gs61l71nJJiz5HkSaw2NI-VFlm9zQ92vO61cQEYqV42xDk1nrwLDJ48J9933DlleQp_Lt-T3NdsYuQsxNg5Jg77carl15-z3ap7eiQSWl11151ur6K2aX5cr1F12Y13cgduqT15Jgb73l1oFiFFwQC1qNeiGNHi15G6FX3iF9d6er8uziG6FgZuziG6caa9G9R0xla2xix0Jgz9xl79G9EuwrAiGgSu4gFiv5rrqTp9YcpoUi75c66pHDm82mJxOlDtc9sg5U9uqS4ecM5g6p8eGXRwqJi1NOWrdgXrAlm71h32rl8n7bm8JQ0i5m4uDelm6g-mGNKiSr1212l19Q5JJgy11Q1vJ3s1pr1t51vg7CCyxQfvvlzsSnEWYGl9Ja113yu571Eqvs_trl31zD1oFiKiH4u6FQ2oFiKiH5FoFieiGNq6FQHi15DiF9d6erz9xgw0xix2Jgz9zaDuzlAuG9Su4lz9vl72xixuwrAiHlGuwrR0zaDuziG6HgFizaD0GgSu4gFicgs61l76erFizlAiF9d6er82caaiFlG6caa2xix0Ggz9caa6Hgs61gz9xlE9G976erf6caa2xix0Jgs62ld6erz9xgSu3aa6cgf6caa2xix0zaD0GgSu1af6vgz9zaDuziG6er82v76pG015x6jjrTu63QU7zs4f5gyerTb4JJQiqiSQacluGaWy2rmoxXsuqvTh51ItG1cpH9Su2XfyaDt5xQa85iv5qrW4zu3rw5h5qvU5vDE3vTQ8e5q41v9d57l1bX52rsg9erg9rl9_eN32qTPoSgh71r52mQShFDadbJu2Giziw5B8Hlqie9e5FOKtQVt24iZ0qaw94TVyA1HrDivrdSdieNGiG2ai3NA8xQv2va61q9l0aJq5svjpGOG6xDOo41j8eJm8qe151Ok8xQU5A3HaGr_1ri51FNm740porgu41gse1DzdFaZsc993vT11151iJ6B2r15Ov1l12C141gp3cij7cXw71g1511KiNFu1qNeiGNqyqNFiw126cld6erz9xgE0Ggz9vl79G1EuwrAiF9Z025a2vth4xHo8GLxrzvEyxTUpGK-BjzNKe3v1EqA1Whx8Fgl33NJwrv62jpeEjQ65_VDm0J11r2C1il5tJws13D1k52113lR9rO17J5k7GNO2ras93529sQU1qT1dr0Y1v091v53011Q1r1Q13r976g9hvv3eJv232XwdrCY4v094v5y711KiSSmiGNFfsDe5zQCoGMm5wumfe5Ffr5KflrF5wieiGMmiH9CoFiHi15E9G976erdiF9AuwrE9G972Jgz9zaD04iG12aa13ix0zaDuziG6caa2xixuwr3g25UozhQrXySZ0M2EegFys124h_W1wf-NljtJ0sYgTM9ysX3I3Wrudc-XYLhOqrUg5h_zbBUZuK-K_xkhkj9aFcjwzg111a1f16p27N5XJ1r12N1pv1S15l1mQ24uzgIia030x1H945v6HDf4cDr31599GQYoze1y4vNesM6kDa3u5aDeeajheT2ecYd7v9jJ1Kr3J9ojca2qesh6r9s111KiWSmoSDFfsDe5zQCoGMm5wiF5wieiFiKiJ5KfwiKiH5qywQKoH5FiGNeiFiKiw126F9ZuziG5caa23ix04aD11a79G9R225a6ziGuzaD0vla2xix0zaDuziG2er79G9EuwrAiF94u4iG6HgFizlAiF9s61gz9xg3jxl93rQ0Kt_-AlRI_Ov2e15F5eTv6bVfHBx8OXO4pq1cuqXzwKBDpx1xu3NzwRQC4JTZu3C141M4naW6vvwc2vr5_Ok1LybBAIQ23jJy62F-Nh3fc8HCDolxizlm8F6l9z9C7G1K_K9C3zm04wOXfQJ11J2d1rJ5vJaS1391g12O1901rsCv8r5m8ec9hA6c61T_yFOtuQrAicrapHcjsv11q5v6e1TpwrswwJ9Wpr947AYQ32hp7AepqErk1H6l955u4wve13NFiGNFoFiq6FQKoGNeywieiH5fiGNFiJ5KiFiKiH5FoFiKiFiKiFiKiFie5zQC5wie5zQKiH5qyqMmiF5J1wgFicgs61g86caa2xix0Jgz9xgSu4lEuwrAiF9fu4gFicg62xix0Ggz9caa6Hld6Hgs61l76erFizgZu4iG6HgFizgSu3lEuwrFizgSu3ix2Jgz9xgSu4lAuwrz9caf61lDuziG6caa2xix0vuvo3HlkFDKrhmclwMcPd6XfOWMfQcgnWmshKBy4FQj9slJe6lQ52WEw5S6iZOsa45n8aJPrzM1awJPwxXZuclcuJNy9DX5naJHtSuiuwuk25Xim6aAg1PuaA-wq9YRdRYYnXMih30UvX4nuG5EoqP381Dtrw1RpqYwq6iJbsSme4aGq5lji2gvr3rQqxis03iRod1RuBlOrFNXizM6111718N1qve32pg13J1s1351or1X15i1dQ1P1JQCtzlHp390tz5x9z5-3rrb425eeeQb5JNl6xOWozrt6xaDu3ad4Je2yJg113NGoFifyqNKoGNeiH5F5wieiJ5KiH5FoFiq6FQKoGNK5wieiH5F5wiHi15G6caa2xix0zaDuv5DuziG6erz9xgWicgs61gz9xgSu4g2u4gFicgs61gz9xgR9xgSu4gFicgs61ia9G9EuwrAiF9d1WHinAsufZHS1g1V0Shk0zkMxwu9wzW1qsi31A5ZoFPtuxMyIxiKyx1ni2Mvp49C9GgX2ph_wWqolW2TvKBY0F6TgQl7axNVgDQNtSI-Q4YQrGXMjDJpyq5WiqankbBLnaaYpzDH1191qt-E1N55tJ1W14a1ja1F811R0J1e52535e5ZoG503aNc1q571QQOdqJ3o11R81inr3er019Q01H7iWgG1z9n7cTnL163PQQ3dr931vGX1wJ1tFumtFiK5wum5zQKfe9fywum5zQ2oSDFoH5F5wiKfwieiFiHi15E9G982xix0zaDuziG6c9e6rls6Had6er79G9S2xix04aD5ziG5GlE0GgE9G976erdiF9ZuvoO7KuQhHDg9FtmvNoptr973GNWjVWXWbBNMpEdcJ9v3JmDj6LwvWyxlJT3ULQM54aWa5-J_PB-NFNHogae7evxu0sGLR_e1rk-e0Ow9HaTW7h0hgay1t__15z_Yvt22RD30vrC11122J241051111kOv9Cykv2tk9E1Q3X__EDr4gc6GaI5wa1pH5S1t__15z_Yvt22T530vrC11122J3u1tr1111hOv9AuIv2ta100v9CYFW59elWpH5S13Oeur4__J29_Vg4Jrjj1xg5yr111rg1SB5112EG1Qh7L15Mr1QE1QQpqwDc6GaI5wa1pH5S1t__15z_YvtF2c930vrC11122v4gUJ117k93qaEX1wS13qg3d2MgrG5f0qOeur1I5wa1__N1qt-E1N56h19E24Q1115719VF111mOJi3t4GX1wS13xg41zX5tQrc6GaI5waS13Oeuwa1__N1qt-E1N57Zv9E24Q111571uGB111mOJi3wD-X1wS13xg41Qrye5Jc6GaI5waS13Oeuwa111i1qt_02KX5tJ1D14D1q14wr51huwaW3v1_tJaC8H1J941Ji1iJi2NbqQr65Hut2r56jx92qq0h9v9Z9xs00sQWjqa40waS83Ssp7aT1QgT1qvFL163r1Jh37TB1aQBdwO3yHGX1wP1021i37Ti1aQidrJ342hUrr60rsW21Q5ptFX12519a1v331v36Iv2t51psahWev07ev671Iv2rv1_iSSmtH9CoSDfywumfe5FfsDe5zQ_iSSm5zQ_iSSmiH9CoFum5wQCfsD2oSDFoH5F5wiKiGMm5wiqyqNFiFiF5zQHi3a59G9EuwrqiF9f0xix2Jgz9xgSu4gFicgfuFgFicgs61g82vr86cgFizgZuziG6caa23iv1FgWuzlE9G971GlE9G976erFizg4fKBFJTLNMpEdleIFh7lm73iFZgyvAcXfcyUMDSvVr_Vvb3E3QaZy8xiR04k-J0Z-HxA01aHs5WjjnBIt1z4ndCy4amjvSBy7Dr57o-QM54aWa5-ubq7-z91MkcOvKE1-tD5Juwazj0T2AfjJoe6rVtV_vfyahUCW1t__15z_Yvt22a130vrC11122v4hRJ117k93ra7X1wS13qg3eJP8tx5f0qOeur1I5wa1__N1qt-E1N57ur9E24Q111571uUh111hOv03rIv2ta100v072agM9elWpH5S13Oeur111v29_Uv69Jr_1411r134r4TR149G8v1r52135223yxJ03aNO1qJw0Jg3jzl2qwmhuJ9Z149H0JrYr3MroJ9KoJHWtr67tsgM1zDYL163PePR6J5f9kv2aQ10qr0h1EQ31J9iL15N14NFfwNFfwi_iSSm5zQKfe9fywumfe9C5wi2oSDFoH5F5wiKflJF5wiFiw120xix2Jgz9xgSu4gFic9e6er82caa6ziGuFgFicgs61gz9xgE0GgR2xix04aD5ziG5GlE0GgE9G976erdiF9ZuvoO7KuQhHDg9Ftmv-4I41rBush971NbpB6LrdNX3Jr0YfVs_KFDUhj81x1o2ZeTdCy3aV0F3vpUVwDruqsrw_BS_ETb4iDC2ZyA0rDH8Fv_afYGp3HJLR_e1rk-e0Ow9HaTW7h0hgay1191gtZh21X5av2215X1Oa1hi2Xn6c5CyrJM1vT82DTi461Be5rMpGlRtkz_J51E3rH9twOtqrMh4AQt1JNteHM81Qm8ivT4rWY3jQ93qa92rQ162a3X1wH15GQYow9d7WgjhcT3eHT27z9AuzpX1a613WaPhqD3exD2oq7X1al1tFumfwNFoH5FfsDeiH5qyqN_iGNeiSSm5zQC5zQKfwum5zQ2oGOFoFieiH9C5wiKiFiKywQe5zQKywiGoFiHi15G6HlAiF9s61l86caa2xi72Jl72Jg8uzlAiF9d6caa23ix0GgR0zaDiF9f6ziGuzaD9G982xix0zaDuGgSu3rFivl56erdiF9AuwrE0Gg3GrTr6Sl-jFlPo_8S4rNo4JNr3f1VjAcFkw4-RjA4cersksT-78U3lmmvtdL6t8mnd9O28mNJrKBrd62mF46p81ra21h9d5is5A6WJPvr2vDe0qit2rlyedd2G-ML51M0ef04Q0p2fvXeasuEmdbsPMjV5BYAwaGvdF9y2r4__J2v_mQ54vjj1xg5e1111rg1SMv112LG1WMbL15MOxg3gIz__Bexsxln0qOeur1I5wa1__N1gtZh21X7ur9E25r111571uUS111kOv0kdBv2tk9E1W-X_--DfSgR8xaI5wa1pH5S1t__174MArry2fJ30ve511122v4kav117B93aWpX1wAG0v0sLt_rP6st0HXWpH5S13Oeur111J2v_mQ54vjn11N1ar2n1i61951LocJq7Wrf6HHo0xh03v16qrs02aSj82Hvs5DBuFmuLt_1r3l045cuqHM08SQbjeN48JMf8Sl3sSm37cuqdW0Uav00av6qa1X91S3X1wH15FQCrzDEpWgUhxT3eGT2pQ07eQpX1a613WaMhwD3ezD2tw7X1al1tFumfwNFoH5FfsDeiH5qyqN_ZODC5wumfe9Cye9CoSDFfe9C1qNIiGNF5wieiGNF5zQCoGNeiFieiH9C5wiK5zQC5wiKiF5J1er79G9Su4gFicaa2Jg86ciG6HlAiF9s61l86caa2xi72Jl72Jg8uzlAiF9d6caa23ix0GgR0zaDiF9f6ziGuzaD9G982xix0zaDuGgSu3rFivl56erdiF9AuwrE0Gg3P5lXcf2teegK5sgs3c1fsFCIuGDKNbau4JOt4H10l4YIj8uPitVmIgy662sPdzXgnT0HSA1MjXaNmSCgxJ5mZF23_P2ga6ZiiaTl2qaXrV0WBaTl04OHutVv21h9d5is5A6WJPvr2vDe0qit2rlyedd2G-ML51M0ef04Q0p2fvXeasuEmdbsPMjV5BYAwaGvdF9y2r111r3Q_kX2Kt-n12118Q1y11v94r9o11ar2r962e9e14iKflJ2oFiF5zQHi15EuwrAiF9d6er79G9Su4lA1e2Oqzm3sgS4q3T__U1-rFh8aS62-DvEpwJ1118_cbAU1cl56J1j13H16J5h7rl03eJt5c95eehs6Ead1Hgi81rt14N_iSDqyqN2oH5FoFiF5wiHi1540zgFicgf5Hid2xix1zaDuziG6HgFizgSu15P9JiCoGe31x5j2jE0QOC1pwWqp5rItv6K1xlIszih_kBMERZN1eTV0FElwA6mgr11111113X3ov1211111111149111121111111211D1iv121111111311l1tJ121111111412r1ev121111111511D1iv121111111611J1dv121111111711O1hv121111111814X1lr1411551J1311J1IJ1411552r131211LJ1411552v1311J1GJ1411552J131211SJ14115531131211CJ1411553r1117r1MJ1411553r1212T2dJ1411553r1311X2mr1411553r1413v2vJ1411553r1512T2dJ1411553r1612v2UJ1411553r1712g2JJ1411553r1818J2Ar1411553r1913T22r1411553r1012X3sr1411553r1p1f13lJ1411553r1o16r4XJ1411553r1u1Yv5uJ1411553r1y16r4XJ1411553v1311J1IJ1411553J131217FJ141155411311J1IJ1411554v1311J7ZJ141155511311X7VJ1411555J131297-r141155611311J1IJ1411556r1312183J1411556v1311J1IJ1411557r1311X87J1411557J131218pr1411558r1311J1IJ1411558J1311J1IJ141155011311X8yr141155or1311X8eJ1411593v1311J1IJ1411596v1311J1IJ14115i3v1311J1IJ14115i411311J1IVQviz1Hiq2ujduGkZuKhRrvrAMGl7MGgfeYkAXL956Ok32qjdmTm8ivaEsFhf0AhdrLrAMPjdivaA6LlG2uaS0WhZsOgf0ujduGkZuKhRrvrAMPjdivaA6LlShWlRuYkAXvuqXHiauKkdWzaA6LlDSwrAMPjdivaA6LlG2YlG2c98eGgdeWkd6GjG2Khx2Dj7avwdWzlEMFkAhD97mGkZsJ97ME97uKkf2ckEWWlGX1wv2K1891kr2c17J1kJ2x18Q24r2W17T1kv4Y17X1kJ2G17D1gr2O16i1m12c17X1h12c1891h1yj1B54Kry_1BD4LryV1VJ1Ur1v1491i11H1451912u17Q1gJ2G17N1lJ2K17g1m11v15i1kJ2G1811kJ2G1751m12Y17N1kv1L1311rr2O17J1912q17Q1hJ2T18r1lJ1v1691hr2F17a1lv2A17a1h11L15i1kJ2P17Q1gJ1v16i1gr2L18i1912u16i1av2W17l1mr2O1751lv2u17Q1gJ2G17N1lJ2K17g1m11v15i1kJ2P17Q1gJ1v16i1gr2L18i1sv2W1891lJ2Y17N1kv1v14a1ov1H1451rJ2K17D1jr2z16i1gr2L18i1wr2w15i1kJ2P17Q1gJ1v16i1gr2L18i1912Y18i1912c1311m12G1751h12W17D1gr2G17O1912K17g1912D17v1hr1v15D1jr2z1891kJ2F17N1hv2D1311hJ2G17N1mr2J1311kJ2E1311gJ2K17D1l12c17X1jr2W18i1ov2d17Q1kv2z17a1kv2D1311rJ2K17X1kv2c1891hr2517a1lJ2Y17l1kv2W17r1912x18Q1912u17Q1gJ2G17N1lJ2K17g1m11R18i1912d17Q1kv2z17a1kv2D1311rJ2K17X1kv2c1891hr1O1311m12T17Q1lJ1v17Q1lJ1v1751912E1751gJ2W1311gv2c18i1hr2Q1311kJ2L1311m12T17a1912O17a1m12D17a1lv2Y17X1hJ1v17g1lv2K17D1912z17N1kr2Y17i1912P1751hJ2c18T1jr2L17a1lJ1L1311s12T17Q1lJ1v17i1gr2F18a1gr2O1311gv2S18r1912O17a1hJ2Y1791k12W1311hv2c17i1hr1v17v1gr2F1311l12G17N1mv2W17r1912A17a1lv2C1311l12K1811mr2O1751lv1v18l1jr2D17v1912c1311mJ2Y17r1hr1v18g1gr2G17Q1hr2D18Q1912K17g1912J17a1kJ2J17J1hr1L17v1m12D1811yv1K13N1mJ2Z18l1ov2P17Q1gJ2G17N1lJ2K17g1m11L17i1kJ2P13N1m12C1811kJ2R1891gr2J17v1nr1K17g1kJ2L18r1lJ1K16Q1kJ2S1311kr2c18Q1912S18i1hr1v18r1j12Y18i1912E17N1kv2D1311gr2F1311l12W1891kr2Y18r1m12W17r1912x18Q1912D17v1hr1v15a1sr2i1551912E17N1lv1v18r1j12W1311l12G17N1h12S17i1m11v17Q1kv1v18l1j12Y17i1j11v18r1j12Y18i1912E17N1kv2D1311jr2F1311jr2L17i1k12S17r1hr2Q1311m12K1311h12Y18i1l12O1751nr1v1751kv2Q1311l12G17Q1kv2D1311gJ2K17X1m12W17X1m11L1311dr2K18a1912P1751nr1v17N1kv2O18Q1911T17Q1pr1v17a1kr2x17a1h11v18r1j12Y18i1912E17N1kv2D1311jr2L1311gJ2K17X1m12W17X1m11v1751lJ1v1811hr2G17D1jr2D18r1hr2Q1311gv2C1311m12T17a1912W17D1gv2W17r1h12Y17X1hJ1v1891hr2F18r1lv2Y17i1m12Y17N1kv2F1311jr2L17i1k12S17r1hr2Q1311jr2L1311m12T17Q1lJ1v17g1kJ2L18r1yJ1v1751kv2Q1311p12Y17Q1pr1v18r1hr2P1811kJ2G1751lv2Y17J1nr1v17r1kJ2Z17X1k12K1751h11v18r1j12Y18i1912E17N1kv2D1311m12K1311gr1v1811lv2Y17X1m12W1891912K1891912K18r1j12W1891912K18a1m12J18a1m11v17r1hr2A17Q1gJ2W1311m12K1311j12W17J1l11v1811lv2Y17X1m11v17i1kJ2L18r1hr2L18r1ov2y17N1lv2P1751gr2O17Q1wv2K1891kr4c17J1wv2K1891kr2c17J1hr2w18r1gr2L17r1gr2c1891h12y17N1lv2P1751k12L18Q58vrH25O5eJrM25O5yr2y17N1lv2P1y51k12L17a1wv2c18g1gr2Q17X1kJ221891lv2S17X1m12c111411111111_K11IJ1111111111111111111111111111111J1911914J12__N11J1111511r1211111r116Ag1111a111111116SXJvcmj2vQUcQx7MJD22Jpvvcmoi99feJ921w5oi1Q72qOy1J9j2r1JgrgppJg22173uJ922p2wi65Jo1gppJg22173uJ928p9nv2J1t11N14J1wJ2x18i1kJ2O17a1m12W14X1tv1-i35J3rg6pJX41cT611ra365IGhPVWKAgwzno_GJqPoNjw6Evvc9Hi995g4331DGv1J921v9poUOeZ64_f0ZoJ4102vaI4vi38ra1i81HpF1Y2vus21Ow9QuKl8WGjdmTm31TgGQviwQCuG2ujduGkZuKhRrvrAMGl3XH8z1l2vus21Ow6aSYgZ0KlAMEm324kZ0JkZ0cm7WKkz5ci2N71Sa51HigwdWzlEMFkAhD960KkZrvrfsDj7MGjfeCi2Xf4w1Zi4vGiz9GiF5JiWTf4w5Gi4vGuw1Zi41Ji6TJnw5oi1Q71Sa52ci3ssiH5F1e2vus21vw3WmclAcYkEmDkAXH541y2vus21lw2S0Wh7SKkErH8z1l2vus21Tw6aSYgZ0KlAMEm324kZ0JkZ0cm7WKkz5zi3571Sa51HijwdWzlEMFkAhD95uKh7avaAWRkEWLhG2rrD5Jvv5xi1D73qU7q9kZ4r521ra11X924J1Jvv5p1T921r3ZnfZdfku6yjvDI48j-qaSqfb1-H-nHDsHBM67VuqiJAPiaEoDEro4wmc0k3NQtEd_FxyZ3DxZbZfmekAUzJCrHqaINU4R4qibDa5Q-EphFHW6Yhup8CRuOGNxJDTPb7_h6eXBz4QrymAMpbeEyGD2iK_-0DxEPdJ2cCFBLI0zbXoCfp32c9dyOtpXWpttyphrcelRcDBmitg1tbw7-wA2KTkPk4ERozwAP3VK3RSxQfcER0cF4gjKNOwF9oWt5TSzGGFhiQahBIPpWzPraHzyhW6CUUA8G6g-RX0rx7X6Owf2nGqMaEgMEaBipZXFkTe82P7nD5U71EV71pw1cMMw1vi2117zvbTJvblJ5Jg4seDW21JJ3vg9pJg22ra81JiJvj971Sam1rq2Ez32WX1rdM2JBAWGRxuebcqGwgB_GV6Gi81HpF1Y2vus21Ow9QuKl8WGjdmTm31TgGQviwQCuG2ujduGkZuKhRrvrAMGl3XH8z1l2vus21Ow6aSYgZ0KlAMEm324kZ0JkZ0cm7WKkz5ci2N71Sa51HigwdWzlEMFkAhD960KkZrvrfsDj7MGjfeCvvN1Jr3ot4G95m5-MEtOZD1J4Jg4seDw1r8_21aJ1J52_F1m2vus8rX56vraF2Zymv2JdV_HAOeyEW65oUu5g_1J3Jg4seDt21r41v77i1Q72qOy1J9m2r14vv5218LIIRCp0KoyK5CDTWvRm3YSOXkMUDGan12uVlII7uHYHrVxbti3rNkpcNFXaNF3RBSdk_2zepW51yVdG0Is8ovoRHQuWubj8UDYbn_PYRyOzMXCzzAgjIJXkmp9IGtMZ-RdjrEexoZ-Xr3ButtZbtQr5xX6VGEdQD0Ip87Zy9_v2JZ0fdzuKg22jAjTLBnBzzwpNvirb8ISDL23ZZK-Xn7O_KkbSrAFlujqXD-Ayp0NomrMAFrogzl3RX6U9XRAf7ytO6UBymmvz6d57ztSyCxvvvGxfXLFooncYlLIAx3AKF1hcq1a4qUNaKe2X6XJXC9Tjgb2lyoFYVKyv50GmvXJvveVi994gU141v531vYc1kpk1111111si1D73qU7q9kZ4r522ra1i8QH3F102vus21gw1WswieiJ5rg4srr95JYfgfuTjdCRm7MLie1J4vg4srr85JmqhdePkACQieXJ81g4srrp5HsujduGkZuKhRrvrAMGl7MGgfeYkAXH9F1c2vus21iw7QSYgZ0KlAMEm324kAeW96uYhACYkElva5u2i2Xf4w5Hi49Giw9JuwiHiWTf4w5Gi4aGiw9JuwiHiWTJvgiH3F102vus21gw1WswieiJ5rg4srr95JYfgfuTjdCRm7MLie1J4vg4srr85JmqhdePkACQieXJ81g4srrp5HsujduGkZuKhRrvrAMGl7MGgfeYkAXH4w1o2vus21Ow25Sta69H8z1l2vus21iw6aSYgZ0KlAMEm324kZ0JkZ0cm7WKkz331q9J4rg0pTh9cKlu1r522r14vv5t14331rT3vv521psHm2zoACJK-K6z7g3zzK_9l9iiTalU-KYjOiCu4BDBAx8u2msMb4-SEfgWyPGvwG4WlPu4lnk_k2wCRXqG0gnM6osmKzn0oOdIcd2Hcg5RLwi4-jZdQJoLPWae1OL4cbk2cduc7j1aR0AbR5hzuMvet6b8q32w6KbidtBAJ2IpPQhO4nvV2lVE8yy9NuAUJR34dM8GNz-XAjqmTJ2LUT8uBzT5Il2pQxJwXyW2mvE11dHR9orHO4CIDQ19vMsJi9DJCBViD3_LS9g_7WUWJ7x6V9WNQrupkWW495xlxtB0ekbTw1r23AoyTLJlQGfMDo5yHKxA02YB-ZFdf5Beh-Q31J511jy2-432Mw1w2vus8qa5441p2vvI2v562rl41F1m2vus8rX56vraAfoaGJHxfMAzm0Mb4Yc2U6OwrGgJ4vg4seDt1r8_21r41vn1i2N71Sam9Jrgi2j16iJmFRg1l6LKNmI5wYYee3Vze7tJi5r71Sam8JrMi4OJyj1ZT4d7iAcDm81VoGMzlEJLkdWzlEMFkAhDoEuKkqMJjAQKgZ0OoZ2GkAeSgZeFoDuwa5u2oEuGk4292vvI2v562rl21rrNi4TJy1g9pJg22ra8i1p7o7cDm81VoGMZmZlLkdWzlEMFkAhDoEuKkqMJjAQKgAsGm8iKrSurrD5LgZ0Di1D73qU7q9kZ4r522ra11X921r2vg3bgb4205Qm2uFHnmkwQTv1A5axJo6xkE8FPTHpcEyXgOCbAkgBgi2TlIq6zrajwSVNjp5LfuRS1s74igIFY_7ERfZ_6cVj748GYXWWMAXzsmZv6Yxwphtcyakm5p9Xjo6r9p8o68HvMoiN10ANwDjscNPhxyID1wvaKEdmMCdu4tFOiKTO8nL6Xro_bniV89p9hTkHvN0-OaWHA6tDkn1ffgZsIvbA8eUAPdsp_nB-K7jqqOK9oo8XJ5uOHqBV5dR_ZEH0XVmC-gpOuHz5nMRpjtEbtyyXXFzQklMOBAwwbvMplFn7oZcI-h1cbI_gLL49WmEQWNMduuqt4AGs5i995Rw331Xdv1J921v9rjvLhwN110jOeADabd8YRTz1u2vQUcQx7MJD21ra6142JiqOJprg4srro5G04kZ2ClEWRj8rvp7iY945CywlvwdWzlEMFkAhD95uKlR1LieXJ81g4srro5HsujduGkZuKhRrvrAMGl7MGgfeYkAXH9w1b2vus21iw75SYgZ0KlAMEm32qkAMD956Sm7cKlEWDnw1n6JDJuz1CiwgJiw1Du4mj6JDHyw1CiwaJuF1Ji42ji8QH3F102vus21gw1WswieiJ5rg4srr95JYfgfuTjdCRm7MLie1J4vg4srr85JmqhdePkACQieXJ81g4srrp5HsujduGkZuKhRrvrAMGl7MGgfeYkAXH9F1c2vus21iw7QSYgZ0KlAMEm32ajdSWlZeckf2YkElva5u2i9929z1u2vQUcQx7MJD21r5611y31rN1i9923vp31r51Z4mL-V_9rQYH7izyq4CwJtUI6oTOiIOqwSo9v-D-iMW0ih9TPY6QX2MrcoI3qM6_2bzKmkVoHVzsIEWJhRvRhLxAP--6LlZLUKDqY1Ph9xQKFD4hsvrkmIsPh7SpsuKmNmV_RXt8vuM_w19ZWtf1Rvcd8Ec8FmR1mWJKbkgW2oeddATlg_-1b4FLSrrWwwWZm1mmJWFgczlOmlQyVcXC3fHA_YSOkRIvB4VtWCCH4WNUwHcxg4pnDTuypG0lj5doZx-5563G-kajzdFL0hOw-iOrSXayM90AlFk7WfUxF717B1dJczyZ-0ekc575d9dakI1bo5zikCH4X7ITbGjyjJ941r12TX92p4331qrJ5Jg4seDW21JJ3vg9pJg22ra81JvJvj971Sam1rq2Ez32WX1rdM2JBAWGRxuebcqGwgB_GV6Gi81HpF1Y2vus21Ow9QuKl8WGjdmTm31TgGQviwQCuG2ujduGkZuKhRrvrAMGl3XH8z1l2vus21Ow6aSYgZ0KlAMEm324kZ0JkZ0cm7WKkz5ci2N71Sa51HigwdWzlEMFkAhD960KkZrvrfsDj7MGjfeCvvN1Jr3ot4G95m5-MEtOZD1J51g0pJg22173uHa221i31r1J8rg4seDy22g567_Twz-fLwqIqXjtK0FUI4P2rNkri2Q73qO71rr2vzla1vri8vT1aJ2S1791rJ22i1O71Sam4Jr51J92cz1t2vus8ei21bN52w141r8_i1D73qU7q9kZ4r522ra11X921r3awe5HJRHrLH7yTd581rVil5duBZuaKwN02qZ_L66wceFPyh7ZTSgoZTGAyHKe-VGRGknHaq5kkJcYbEO4Tx07BdGDkfJxL5kwctyu4BX8xzk2VZBYl6S6RCoqFiBmzO4cKGIubyF0IzoscBRogNrADevcKZknyCUF7Zyn9gzgPorqs9FDRi0WqYTT0YHvxvNBHHuWn5xBFVA4yQ-JgWzniyRYyeZzxbojyg8C5G7ih92z2vqdNYT3rGMBeTxV_JohhbWpZPT4m0yF2dXiF0Zlp76Nqt5fR25cy19lcVJ7HhgGLys1HWiMKjE0ZLcEuXZD9YjlFo2Zs65VSR05OxtAi995Uz331Cpv1J921v9pgrdxi1111111341u2vQUcQx7MJD21ra6142CirOJ3rg4srr75J0saF5wi2571Sa532ipsA6Fj7WLhZeKkz5ri1X71Sa52Hi8aEsQkdMLh45ni2J71Sa53ciswdWzlEMFkAhD95uKlR2KlE6DjdMLiqiJ9rg4srr45HYujduGkZuKhRrvs7WPhfuDgdSJjdCR9624rw1n6JDJy41ZizaHyw1Hiwsj6JDHiF1ZizaHyw5Hiwsji97FirOJ3rg4srr75J0saF5wi2571Sa532ipsA6Fj7WLhZeKkz5ri1X71Sa52Hi8aEsQkdMLh45ni2J71Sa53ciswdWzlEMFkAhD95uKlR2KlE6DjdMLirDJ3Jg4srro5JeuwS2qiqlJ0rg4srro5HCLrAWJj7sG95eweq26aDXVy4s5iGDFi4s4ows3rDgH0w1z2vus21iw85SYgZ0KlAMEm32ajdSWosuDgdSJ96uWlRhYgAaJvv5xi1D73qU7q9kZ4r521ra11X924J1Jvv5p1T921r4J23AGWO1jvdlWOqhxOHuoFz3VJ29X_96Wu1b5uI9Qjtg82i18W_qZNfOngxH7AaLQawqZDAFPdzLDvV68te59ozsIenk3t9J3hvpY77RIqLDRoyXNmSLQS83hqSn55u3Kobx08nkUpkwRFCX7gUmGsi9BHON_Ly7Jd22OCjffJN0SuBZDcn72V3zg7_8GIK73TMkf1Vpb6gwBtbUIXkgGGp13httE_HTElrcwxca3NTiRmQE3ljbKIw0XHPmO6QNxhhmxwagK_GyKcnGEloD4GMIgivf6pC21PYBso9hOPNOwiRAuHRVL6GNG_7jB8k26sbxP-xSRvAlYQXwqdU5z1vi2117zvbvJvbaJ8rg4seDy22g56yxfMKbKzt8Ejnuhj5BZE9YVZhOLi2N71Sam9Jrgi2j167_Twz-fLwqIqXjtK0FUI4P2rNkri5r71Sam8JrMi4OJyj1ZT4d7iAcDm81VoGMzlEJLkdWzlEMFkAhDoEuKkqMJjAQKgZ0OoZ2GkAeSgZeFoZeFl7ucoEuGk4292vvI2v562rl21rrNi4TJy1g9pJg22ra8i1p7o7cDm81VoGMZmZlLkdWzlEMFkAhDoEuKkqMJjAQKgAsGm8iKm8uJgA5LgZ0Di2i71Sam0rrii1T733O71ra62Ji9i1X71Sam4J52_Jr51J97J41u2vQUcQx7MJD21ra611y31r514wMZfC5NKUaSYuO62grbsKoKEjk839DKOND_lmd7b8lbZnOfOISNX_EhNvY6qpDaLAQONzCRgWwGBRNR5h9CBiBhcDV9MA289ZOR6a19RBNuirq3A4dA40J1DXLUn786Pgc2RwXAZ6xQ0COVAID7feqEOvMiJgXNx_0xEbcEBmfF83xJiPKpirEN-G0TeQFVDZixCGEy9v4BsIN7IT7v6kTD-qxy8DYx2j70Mg68VrAe3umgyXNnjJWYUl29b6d3tSN1y5yl2OJ_A3-_wZi0tbAVfKw8B4b3h77vwmrMliHkO2y2JmqzieUMhujdDRT_pWP7aJQNFrtCtSQ1F9Wwgw7320OJvvqf1v52i978i8QH3F102vus21gw1WswieiJ5rg4srr95JYfgfuTjdCRm7MLie1J4vg4srr85JmqhdePkACQieXJ81g4srrp5HsujduGkZuKhRrvrAMGl7MGgfeYkAXH9F1c2vus21iw7QSYgZ0KlAMEm324kAeW96uYhACYkElva5u21vYc1kpk1111111si1Q72qOy1J9j2r3vvlgJ7rg0pTh9cKlu1rQ4irJ73xO71rr2vzl31rrJ81gppJg22173uJ923F5yi1J73xO71rr2vzl31eaJ9Jg0pTh9cKlu1rQ5ieg568UtcMMLJ9ksbWdI4LkxLT-V5TSli7g73xO71rr2vzl31rJHd42dT3G1pv2u17Q1gJ2G17N1lJ2K17g1m11v15i1kJ2G1811kJ2G1751m12Y17N1kU5Ev3eTm8eJyxNKmZmZoESYgZ0KlAMEm3CzkADKm8WJkAmGgf2Tnq1J4rg0pTh9cKlu1r522r15vv51aJ_tWf5wVDBJKOtjzcb6QOJcJ-IJSoAacyXRSU13Mmu4mSuPK9injsLdyUO8r1aetlyfUhPlWeaErCouALGGokmNG9j2o7QrNna9wP7fFBnjOvi09QvbH_3l74EE9DSruEouRXa1BHUiYhWng9-Bdy_UfxESfUStfal0WtwW_OuW1H6FGwhEZFVwyF79rbSzM0aD6YZJoKCZ4lUC9ZkEKk6TU9odKuqt35f1b1MXVtY6oWjGku520uK9XaOZJBq_hSAoQ5ce1ow4CShxpDc9EZ1zRmj2673IP625O2-polYxEvKlUyCzuCJsQkmZxs3oh_UIU6kfZR_363NAUFLs9p731cNJvv9k2vQUcQx7MJD23rgHvv9ii99331921w32cF2CirOJ3rg4srr75J0saF5wi2571Sa532ipsA6Fj7WLhZeKkz5ri1X71Sa52Hi8aEsQkdMLh45ni2J71Sa53ciswdWzlEMFkAhD95uKlR2KlE6DjdMLiqiJ9rg4srr45HYujduGkZuKhRrvs7WPhfuDgdSJjdCR9624rr9pgrdxi111111134182vaI4vi37U2mi2v73qU7q9kZ4r501F5o2vQUcQx7MJD22J5J81g0pTh9cKlu1rQ6irNf4w5Hi4QJiz5ZuwrHysTJ9Jg0pTh9cKlu1rQ5ieg56t0NhiM3HDXrg9gtBcE2lAVJIs1xi1D73qU7q9kZ4r522ra1299218xgYBwHEOXRGmZtBarQpo_1uz92rvWiHW4X5OhDMybwZH_Wfs1Yy1JZ8ne9dC3F5mzTDj20nM_WabSEDeATzCAdWwhiELeh3-T7v896MLNzYsnk9iHlrEkXd9_Cg1KhNNowXRzEoL0t4paHNPbpKk3hptC5gfIVhWxgbNHmsezi7UY00fq0BD-K6gXcCvkkBIXs1rfTVJGZinqP3SJujrzdExbcPdJAFVsT9GJntmGkn31z-cjpdvYztuWqtCd4dKhGuDvPfglm6JiUIF6Vi_6gUEiy_X-0jtBQTnm3I3iDYr9pmgc2VkZ6EFvgilzKFyXBe8fCagKvFtrWF7gzLLl111121111411112g11113115111ep11512111115111111151111p16X1R114gZWGk11ahZ0WjJ1vk76Dkv1O11r11111__N11r1111r11111__N11r1212111QHaq311760twq119111__N11r13114__J1211i11t__11512116jAsGkv1vjAsGkv1EjAsGkv1OjAsGkv1GjAsGkv1X11111r1111111r1111111r1111111r1111111r111151211311v11r191168V115111361rG2497q1cd2499Z1Eq3uJoC1KQ40TiZ1X74c1yavCl4vgyMvN14JTrh1Gj4KgrYc4l5pgenc755O9qF2oi5VT7q1cd2Qv9svGj40Ty2vCq4KgrYco35pgaL2wq6uvsavzl40TiEc3E4W90QvEq2495ivrG249wUcwg6s99Z1zl40TyavGj4W9yavN14J1t11N15pgrYc3E5O9qJco357renvXr5VTsj1Eq4vgt126V4vgy2cwq6mXiEvGj4c1y51Cq4W9rh22Q57ryMvBA5pgenc755grqJco36vJdkcjD6JTaL1Np2495ivGj4vgy2vCq4W9yavX74vgy2vBA4Kgt11N14J1t11Np57ryMvBA5pgrYc6V5grqJco35O9qJcoi5VTiEc3E5OJqF2oi5VTsZchL6HJaDcfn6ZXfW2na6mXfOcna6EXfZ2na6vJf82na73Tf82cX79TdkcxT7oTgxclp7uJg-cWg7k9hOczl7m1j7czl7tTj7cY97WTg-cRr7QvhOcEG7Qvjq2zV3h9enc757TvjVcIN7JTj_2U97KJkh2Op7C9j_2Ki7NJj_2IN7LTk3cIN81Xl4cJQ7NJkF2IU7C9k3cG38rvmhcZg81XnocNl8F9bL2IN94Xj_2IN7KJvL35V9sJcf2Nl9lgl4x099U9xL3o79HJxq3un9QvxL3px9QvzP3pX069zfxo79IvxHxil9U9xHcG3899lvcG3899lvcJy81Xl4cJy8dgj_2IN7KJj_2IN7KJcyx5V9wTcyx87091cHcG3899lvcSE8dgl4cJy81Xl4cJy8xXnocNl8F9bicNG8F9bicIN7KJj_2IN7KJj_2IN7KJj_2IN9ovvL33X9wTcyx5V9wTcyx5V9sJcHcJy81Xl4xil899j_36l9sJcf3877KJvL3wd0RJRKxvrp5TTj3WA4J1Yv3IyoT1LRz2iiqgHi45ViR1Gnzp5iTXHi4dDukrX3zvTyzgQSxwd0ugQSxwd0ugTqvX7p5TTqxcpp5TYv3E1pg1Yv3vriqgHi45Jiw1Hi45Jiw1Hi45Jiw1Hi4vTyWJXp3wd0ugQSxn-0BXRKxn-p21T53cpp5TTqxcpp5TYmxWApfgYmvN14J1Yv3E1pg1B0xE1pOXUFxV1oYXBe3VnoYXBe45EiqgH0vBAiw1Hi45Jp5TGnz0ViRTGc4p55fTGc4pyiTXGzz5Jiw1Hi45Jiw1Hi4dDy3vVuzTAyzgNuzGitpTM84ZEt4g-54X-tZ216zGUr4c1QQ3qt4h1O4GUrrC1O4X-teH2Y53qrxTMCQ1XteH3J5oLe2257Qrje9H6RQdnrO2725knrO23BQknePC7ZQlJeA0555oLeve8i5knehC6RQlJeF1MCxwdp5THi4dDukrSP4vT5fTGzzZEtngz82IN19a3q_N71Q__2v0f_Jg3db-l1WF_R10b_CJ3kK-l1E__R10G_AT3nKN71RF_R1p1_CJ3v_MU1Tk_R1p9_CJ3xK-l1TF_jvpa_Sg3EK_y1YK_svpn_Sg3YbMd1Uk_jvpG_NX3PbN71Ik_2vpZ_Jg3LtN71IR_2vpV_Jg3L_NX1IF_R1o8_CJ3Gt-l1OR_R1op_CJ3G_-l1OF_R1oa_Jg3SbN71Pk_2vof_CJ3At-l1PR_R1oj_CJ3XK-l1Lt_R1oQ_CJ3Cb-l1LB_jvoC_CJ3-K-l1KK_R1oN_CJ41tMU1J8_jvi3_AT41_MU1Ho_Fviw_Jg46tNX1Hf_R1ij_AT49K_y1Gf_y1iT_AT4pv771GO3d1iO_NX4or0g1GB_R1iK1aT4i10g1FF-S1iM_NX4q1771DQ2cvup1gg4qJ771DJ2cvuu1gg4wv0g1DN3d1ur1Wv4ar0g1Sb-S1uz_NX4ht_y1Af_FvuE_NX4k_NX1ZT2cvuB1gg4b1771ZD2cvu-1Wv4bJ0g1X13d1y2_CJ4vK-l1Xt_R1y5_CJ4cr6p1Xg2qvy81aT4x10g1XQ3d1yp1Wv4xJ0g1XJ3d1yu1Wv4Q_N71CR_Fvyj_Jg4RbN71Vw_2vyW_AT4Ob_y1Bb_FvyB_Fv4JKNX1Nk_R1ty_AT4S15g1Mk_Fvtx_NX4CtCJ1-a2cvtU_CJ4VJ6p22K_Fvrl_NX58b_y19i3q_MU1Q__jv0f_AT3lK-l1RI_jv0N_AT3vtMU1Tt_R1p7_NX3xtMU1TI_jvpi_CJ3QK_y1Yw_Fvpg_NX3E__y1YB_Fvpx_NX3Yb_y1UR_FvpK_NX3PbMU1Ik_jvpZ_AT3LtMU1IR_jvpV_AT3L_MU1IF_jvo8_AT3GtMU1OR_jvop_AT3G_MU1OF_jvoe_NX3D__y1Pw_jvos_AT3SKMU1Pb_jvog_AT3AbMU1PI_jvox_AT3X_MU1Lw_jvoW_AT3BK-l1KR_jvoV_AT3-_MU1KF_jvi1_CJ41b-l1Jo_R1i4_CJ44K_y1Ht_jvia_AT46bMU1HR_Fvij_CJ49KMU1GT1DviI1jX4ot-l1GD2IviK1iv4i17r1Fr1a1iM_AT4q14q1DQ1Dvup1u94qJ4q1DJ1Dvuu1u94wv7r1DN2Q1ur1h14ar7r1S91a1ua1614s__y1At_jvuQ_AT4hbMU1Ak_jvuV1u94nJ4q1ZJ1DvuM1u94bv7L1ZN2Ivy11jX4v_-l1Xa1G1y71iv4cJ491Xv2Q1y01h14xv7r1XO2Q1yi1h14zr7r1XN1a1yw_NX4EK_y1CZ_FvyQ_NX4IK-l1No_FvtQ_CJ4Cr4q1-Q1a1tU_CJ4VJ4922B_FvrC_CJ5yK-l24K_R1rN_CJ5tb-l24B_R1r__CJ5rt-l258_R1e3_CJ5r_-l25T1Wv1c1GT2L1iI1z14or9J1GN1-viJ1br4q17X1DQ2L1up1kv4qJ7X1DJ2L1uu1kv4wv8D1DN2M1ur1br4ar8D1ZT2L1uB1kv4b17X1ZD2L1u-1z14bJ9J1X13i1y61tT4cv4V1Xl1-vy91br4xr8D1XT2M1yo1br4z18D1XD2M1tW1kv4VJ4V13D3fbNX1Ef_y10O_Fv3mbNX1TZ_y1pt_AT3QtMU1Yo_jvph_AT3IKMU1I8_jvpD_AT3DbMU1Pt_jvi5_Fv42bNX1Jk_y1iu_AT44KMU1Hk_jvif_AT47tMU1HR_jvik_Fv4ot-E1G__y1iH_AT4iKMU1Fw_KJuq_BN4st-_1Xf_y1y7_Fv4c_NX1XB_jvyt_BN4P__y1N4_Fvts_NX4SK_y1-k_jvtR_AT4VtMU1-R_KJtI_Fv1W10o_NX3w__y1Wb_Fv0m_AT3fK-l1Ef_jv0O_AT3lt-l1R8_R10S_AT3m_-l1RI_Fvp3_CJ3zbMU1T__Fvpr_NX3QK-l1Yw_Fvpf_NX3Eb_y1YK_Fvpn_NX3T__y1Uf_FvpP_CJ3IK_y1I8_FvpF_NX3Pt_y1If_FvpA_NX3P__y1Iz_FvpC_NX3LK_y1IK_R1o2_CJ3JK-l1Ot_R1o5_CJ3Db-l1Pt_R1oa_NX3Sb_y1Pk_FvoT_CJ3Vb-l1LI_R1oI_CJ3Bt-l1LZ_R1i5_AT42bMU1Jk_jviu_NX44K-l1Ht_Fvia_CJ46K_y1Hb_Fvig_NX47b-l1HK_jviz17X40bN71Gg1kviU10g4o_MU1F8_jviG_AT4i_MU1Fw_y1iS_NX4q13d1DQ1Wvup10g4qJ3d1DJ1Wvuu10g4aKNX1Si1kvua_Fv4s_-l1Al1kvuT17X4kt-l1AB_R1uK_Jg4l12L1Z91kvuS17X4nr2L1ZT1WvuB10g4b13d1ZD1Wvy4_CJ4cbMU1Xk_jvy8_AT4zKMU1X__y1yr_NX4Qb_y1Co_Fvyw_CJ4WtMU1Cf_jvyd_AT4W_MU1Cz_jvyh_NX4EK-l1CZ_R1yb_NX4Tr2Q1Vw_R1yR_NX4U12Q1VK_FvyP_AT4I__y1B8_FvyF_AT4PbMU1BK_2vy-_AT4JtMU1No_R1t7_CJ4Gt-l1NR_Fvta_AT4SbMU1Mb_R1tl_AT4Z__y1-o_FvtW10g4CKMU1-b_jvtT_AT4VbNX1-I_R1tI_AT57__y22F_Fvep_NX1oriU1f94pJ8d1GD2SviK1pT4i1831F8_jviG_AT4utMU1Dv2lvu01f94qv6G1DO2lvui1f94wr6G1DX2Jvut1l94a1831S52Jvuq_AT4stMU1ZT2lvuB1f94b16G1ZD2lvu-1mg4bJ8d1X12Svy61pT4cv3U1Xl1Uvy91l94xr831XT2Jvyo1l94z1831XD2Jvyy_AT4z_MU1Mr1UvtW1f94CKMU1-b_jvtT_AT4VbMU1-O1Uv1r1TZ_jvpt_AT3QtMU1Yo_jvoe_AT3D_MU1Jw_jvi6_AT42KMU1JZ_jviy_AT46KMU1Hb_jvig_AT47bMU1HK_jv2p1HD271ib1br4918U1G5271iQ1aT40bN71GQ1h1iU1aT4pJ8D1GD2M1iL_Fv4oJ4V1F12M1iD_CJ4tv8U1FN2Vvu11nT4rr8U1D92qvu41aT4e16p1Da2qvu71br4eJ2Q1Dv2qvu01aT4qv6p1DO2qvui1aT4wr6p1DX2M1ut1br4a18D1S52M1uq_CJ4st-l1SJ2M1um1br4fv8U1SN2Vvuv1nT4gr8U1A92VvuY1aT4jv6p1AO2qvuP1aT4k_N71Zg1h1uZ17r4n12Q1ZT2qvuB1aT4b16p1ZD2qvu-1br4bJ8D1X12M1y2_Fv4vKNX1Xw_y1y61tT4cv4V1Xl1-vy91br4xr8D1XT2M1yo1br4z18D1XD2M1yt_CJ4Cr6p1-R_R1tI1tT11vim1jr49r7Q1213zb_y1T__Fvpr_NX3QK_y1P8_Fvow_NX42t_y1Jf_Fvi7_NX44b_y1JB_Fvid_NX46__y1Hz_Fvih_NX47__y11948r5A1G52uv1E1RI_y1p4_CJ3cK-l1TF_R1pS_Fv3PKNX1Ib_y1pX_Fv3LbNX1II_y1pB_Fv3StNX1Pf_y1od_Fv3BK-l1J4_R1i2_CJ41K-l1Jt_R1iw_Fv46tNX1HI_R1il_Fv48r611G52r1iT_CJ4uKNX1Fb_y1iX_Fv4ybNX1FI_y1iB_Fv4sbNX1Sk_y1uf_Fv4X_NX1-w_y1ep_NX11vim1fJ49r6N11948r6p1G52qv2d1RI_rv0N_CJ3vt-l1Tt_jvp7_AT3xt-l1TI_R1pi_AT3PbM31Ik_rvpZ_D93LtM31IR_rvpV_D93L_NX1IF_R1o8_CJ3Gt-l1OR_R1op_CJ3G_-l1OF_R1oa_D93SbM31Pk_rvof_CJ3At-l1PR_R1oj_CJ3XK-l1Lt_R1oQ_CJ3Cb-l1LB_jvoC_CJ3-K-l1KK_R1oN_CJ41tMU1J8_jvi3_AT41_MU1Ht_rvia_Fv46b-l1HI_jvil_Jg48r611G52r1ix_B14ptM-1GF_R1iA_Jg4u_N71Fz_2viC_Jg4yKN71FK_2viM_B14sbN71Sk_2vuf_Jg4g_-J1Aw_O1uW_B14hK-J1Xt_jvtz_Jg4CtNX1-I_jvrC_CJ5yK-l24K_R1rN_CJ5tb-l24B_R1r__CJ5rt-l258_R1e3_CJ5r_-l25w_R1e6_CJ5eK-l25b_R1e9_CJ151pu_Fv3z_MU1Y4_jvpq_AT3DbMU1Pt_jvi5_Fv42bNX1Jk_y1iu_AT44KMU1Hk_jvif_AT47tMU1HR_jvik_Fv14r0V_CJ3Pb-l1Ik_R1pZ_CJ3Lt-l1IR_R1pV_CJ3L_-l1Pw_R1os_CJ3SK-l1Ht_R1ia_CJ10J0V_Fv3v_-l1Tk_R1pi_CJ3PbNX1Ik_y1pZ_Fv3LtNX1IR_y1pV_Fv3L_NX1Pw_y1os_Fv3SKNX1LB_R1i1_CJ41b-l1Jo_R1i4_CJ45_NX1Hw_y1ij_CJ48tN71HD2Q1ic1h14pt-J1Fk_2viZ_Jg4ytN71FR_2viV_Jg4y_N71Sf_2vud_Jg4s_NX1Xt_R1tz_Jg4CtNX1-I_R1131HD1n1ic18v1wJ0V_Jg3btMU1T4_jvp4_CJ3cKMU1Tz_jvpp_AT3zt-l1If_2vpA_Jg3P_N71Iz_2vpC_Jg3LKN71IK_2vpN_AT3H_MU1Oz_jvo0_AT3GKMU1OK_jvoi_AT3StN71Pf_2vod_Jg3S_MU1Pz_jvoh_AT3AKMU1Lo_jvoz_AT3CtMU1Lf_jvoL_CJ3-bMU1KI_jvoB_AT3_tMU1J4_R1i2_CJ41K-l1Jt_R1iw_Jg46tN71Hf_jvij_CJ48tNX1HD2Q1ic1h14pt-l1Fk_y1iZ_Fv4ytNX1FR_y1iV_Fv4y_NX1Sf_y1ud_Fv4s_N71Xt_R1tz_Fv4CtNX1-I_R1rC_CJ5yK-l24K_R1rN_CJ5tb-l24B_R1r__CJ5rtMU258_R1e3_CJ5r_-l25w_jve6_AT5eKMU25b_jve9_AT11vpB_CJ46t-l14l3nKMU1Tt_Lvp7_NX3zt-E1If_jvpA_AT3P_MU1Iz_jvpC_AT3LKMU1IK_jvoa_AT3SbMU1Pk_jvoL_BT41t-E1J8_Yvi3_Vg41_-E1Ht_jvia_AT47K-E1HF_y1im1sX49r6n1Gz_FviA_Fv4u_NX1Fz_y1iC_Fv4yKNX1FK_y1us_Fv4sKNX1Sb_jvy4_CJ4X_NX1-w_R1tU_CJ5yb-l24I_R1rB_CJ5tt-l24Z_R1r-_CJ5t_-l254_R1e2_CJ5rK-l25t_R1e5_CJ5eb-l25k_R1e8_CJ5qt-l15i3nKN71RF_jvp1_AT3v_MU1Tk_jvp9_AT3xKMU1TF_jvpS_Jg3PKN71Ib_2vpX_Jg3LbN71II_2vpB_Jg3KtMU1Ob_jvo9_AT3GbMU1OI_jvoo_AT3FtMU1Pw_2vos_Jg3SKN71Pb_jvog_AT3AbMU1PI_jvox_AT3X_MU1Lw_jvoW_AT3BKMU1KR_jvoV_AT3-_MU1KF_jvi1_AT41bMU1Jo_jvi4_AT45_N71Hw_2vis_AT47KMU1Gz_R1uf_Jg4v_-V1-w_jvtU_BT5yb-l24I_R1rB_CJ5tt-l24Z_R1r-_CJ5t_-l254_R1e2_CJ5rK-l25t_R1e5_CJ5eb-l25k_R1e8_CJ5qt-l11g3YK_y1Ct_R1yj_CJ4Rb-l1Vw_R1yW_NX11ryL_NX18viW_Jg4pv7j1GO3yviP1zT4oJ5y1F8_R1iG_CJ4q17j1DQ2Evup1hT4qJ7j1DJ2Evuu1hT4k_N71ZT2EvuB1hT4b17j1ZD2Evu-1zT4bJ9V1X13yvy61rX4cv5y1Xl24vyy_CJ4Cr7j1-k_R1tR_CJ4Vt-l1-O24v161GO271iP1ev4bv5g1ZN271y11ev18r0V_CJ3v__51If_R1pA_CJ3P_-l1Iz_R1pC_CJ3LK-l1IK_jvoa_CJ3Sb-l1Pk_R1oL_Nr45_-l1Hw_jvil_C948r7j1G52EviA_C94u_-q1Fz_QviC_C94yK-q1FK_Qvus_C94sK-q1Sb_R1tz_C94Ct-l11O3EbMU1UZ_jvpL_AT3ObMU1Iw_jvya_CJ4Wb-l1Ck_R1yf_CJ4IK_y1B4_R11g1Yw-S1pg_AT3EKNX1YK-S1pn_Pr3TKMU1Uf-S1pE_AT3UbMU1U__jvpG_Fv45KNX1Ct-Tvyh_Jg4EKVx1CZ-TvyQ_U94YbMU1VB_jvyH_Jg4XKN722K_2vrl_Jg58bNX1253Wt-l1YI_Fvpk_CJ3RK-l1Uf_R1pG_NX45K_y1Ct_Fvyh_CJ4EK_y1CZ_FvyQ_NX4Ob-l1-o_R1rk_CJ58t-l22Z_Fv1s1Yw_Fvpj_NX3E__y1YB_FvpW_NX3OK_y1Ho_Fvyw_NX4Eb-l1CI_Fvym_NX4R_-l1Vw_FvyR_CJ4U_-l1V__R1yH_CJ4XK-l22K_R1rl_CJ58b_y11r4Q_-l1CI_R1ym_CJ4Yt-l12v3WtN71Yz_R1pj_Fv3E_N71YB_2vpx_CJ3YbN71Uk_R1pY_CJ3I_-l1Io_y1iq_Fv4Q_Ba1CR_y1yj_Pr4RbBa1Vw-S1yW_CJ4IK-91B8_y1tx_Fv57_NX22F_y1rm_Fv12ryh_NX4Ob_y1-o_Fvrk_NX58t_y11l3Eb-l1UZ_R1pL_CJ3Ob-l1Iw_R1yL_Fv4Ot_y11T3Eb_y1UZ_R1pL_NX3Ob_y1Iw_Fvya_NX4Wb_y1Ck_Fvyf_NX4Ot_y12i3WtNX1YI_R1pk_Fv3RKNX1Uf_y1pE_CJ3OK-l1Ho_R1yw_Fv4Eb-l1CI_y1ym_Fv4YtNX1Vf_R1yH_CJ4XK-l22K_R1rl_CJ58b-l12i3Wt-l1YI_R1pk_CJ3RK-l1Uf_R1pE_NX3OK-l1Ho_R1yw_Fv4Eb-l1CI_y1ym_Fv4YtNX1Vf_FvyH_CJ4XK-l22K_R1rl_CJ58b-l11r4Q__51CI_H1ym_Nr4Yt_511l3YK_y1Ct_R1yj_CJ4Rb-l1Vw_R1yW_NX4IK-l11r4Wt-l1Cf_R1yd_CJ4W_-l11v4Q__y1CI_Fvym_NX4R__y1Vw_FvyR_NX4U__y1V__Fv181WZ_R10W_CJ3kt-l1Rf_R1yS_AT4KKMU1MF_jv1f1QK_2v0t_Jg3aK-l1Wk_R10f_Jg3dbMU1WF_jv0b_AT3jt-l1EI_R10L_AT3k_MU1Ro_jv0F_CJ4P_MU1BF_R1t3_Jg4HKMU1NZ_R1ty_CJ4SKMU1-8_R1rn_CJ16v0o_D93w_M31Wo_R10d_CJ3s_M31WR_R10l_CJ3f_-l1Ez_R10U_CJ3kK-l1E__R10G_AT3l_-l1Bb_R1yN_NX4JKN71Nk_R1tu_NX4FKM-1Mk_R1rn_AT12J0m_CJ3hb-l1EF_R10S_CJ4PbN71BB_2vtl_Jg15v0o_Jg3w_N71Wk_Fv0f_Jg3dbMU1WF_jv0b_AT3jK_y1EB_jv0K_AT3lKMU1Rt_FvyN_NX4JKN71Nk_R1tu_NX4FK-l22B_R11o1WZ_jv0n_NX3gK-l1Ef_jv0O_AT3mbMU1Rb_FvyS_AT4KKMU1MR_R1tl_AT1210o_CJ3w_-l1Wb_R1t7_NX13J0o_Fv3w_NX1Wk_Fv0f_Fv3lK-l1Rt_FvyN_NX4JKNX1Nk_R1tu_NX4FK-J12v12bMU11I_jv1i_AT14bMU124_R121_AT1gtMU1oo_R13F_CJ1PtMU1of_jv3A_AT1P_MU1tk_R162_AT2rKMU1zw_R10m_ZX3fK_y1Eo_Fv0W_ZX3ktM-1Rf_bv0Z_NX1210m_NX3hb_y1EF_Fv0S_NX11J1i_CJ1rt-l174_R11d11__jv1r_AT15bMU1pK_jv3G_AT1O_MU1iw_jv46_AT1MKMU1zw_jv0o_HT3w_Nj1Wk_Fv0f_HT3db_y1WF_Fv0b_NX3jK_y1EB_Fv0K_NX3lK_y1Rt_Fv1o11F_R11t_Fv15bNX154_R12v_CJ1U_NX1iw_y146_Fv3q_-l1Q__R10f_CJ14v1t_AT15t-l128_jv3I_AT1OK-l1ot_R145_AT1HbMU1tk_R19D_CJ3q_MU1Q__jv0f_AT3lK_y12112b-l11I_R11i_CJ14b-l154_R12v_CJ1Pt-l1of_R13A_CJ1P_-l1a8_R163_CJ3fbMU1Ef_jv0O_AT3mbMU11a15tMU1oo_jv3F_AT1MKMU1zw_jv1f11F_R11t_AT15tMU128_jv21_CJ1gt-l1pK_jv3G_AT1O_MU1iw_jv46_AT1MKMU1zw_jv0o_Fv3w_NX1Wk_Fv0f_Fv3db-V1WF_Lv0b_BT3kK-V1E__Lv0F_NX19r16_AT13KMU11F_jv1u_AT15t-l154_jv2v_AT1OK-l1ot_R13D_AT1PbMU1ok_jv3Z_AT1MK-l1a8_jv63_AT3ut-l1TZ_bvpt_AT3QtMU1Yo_O1oe_B13D_-J1Jw_bvi6_ZX42KM-1JZ_jviy_B146KMU1Hb_jvig_AT47b-J1HK_bv1f11f_Fv1p_NX14tMU11Z_Fv21_AT1gtMU1ow_Fv3S_NX1PK_y1ob_Fv62_NX2rK_y1T__Fvpr_NX3QK_y1P8_Fvow_NX44b_y1JB_Fvid_NX46__y1Hz_Fvih_NX18116_AT13KMU11F_jv1u_AT1rtMU174_jv3D_AT1PbMU1ok_jv3Z_AT2rbMU1ao_jvpu_CJ3z__y1Y4_Fvpq_NX3Db_y1Pt_Fvi5_CJ42b-l1Jk_R1iu_NX44K_y1Hk_Fvif_NX47t_y1HR_Fvik_CJ16r1t_Jg15bN71pK_2v45_Jg1HbN71RI_jvp4_NX3cK_y1If_jvpA_AT3P_MU1Iz_jvpC_AT3LKMU1IK_jvoa_AT3SbMU1Pk_jvoL_NX45_MU1Hw_jv1B11F_R11t_AT15tMU128_jv21_CJ1gt-l1pK_jv3G_AT1O_MU1iw_jv46_AT1MKMU1zw_jv0V_Fv3bt-V1T4_Lvp4_CJ3cK_y1Tz_Lvpp_BT3zt_y1If_y1pA_Fv3P_NX1Iz_y1pC_Fv3LKNX1IK_jvpN_BT3H_-V1Oz_Lvo0_BT3GK-V1OK_Lvoi_BT3StNX1Pf_y1od_Fv3S_-V1Pz_Lvoh_BT3AK-V1Lo_Lvoz_BT3Ct-V1Lf_LvoL_CJ3-b-V1KI_LvoB_BT3_t-V1J4_Fvi2_NX41K_y1Jt_Fviw_Fv46tMU1Hf_Lvij_NX12r1r_CJ1OK-l1ot_R14A_CJ3ut-l13512bMU11I_jv1i_CJ14bMU124_jv21_CJ1gt-l1oo_jv3F_AT1PtMU1of_jv3A_AT1P_MU1tk_jv62_AT2rKMU1zw_jvpu_AT3z_-l1Y4_R1pq_CJ3Db-l1Pt_R1i5_AT42bMU1Jk_jviu_CJ44K-l1Hk_R1if_CJ47t-l1HR_R1ik_AT19r16_CJ13K-l11F_R11u_CJ15t_y154_R12v_CJ1OK_y1ot_Fv3D_CJ1Pb-l1ok_R13Z_CJ1MK_y1a8_R163_CJ3ut_y1TZ_Fvpt_NX3Qt_y1Yo_Fvoe_NX3D__y1Jw_Fvi6_NX42K_y1JZ_Fviy_NX46K_y1Hb_Fvig_NX47b_y1HK_Fv1n11F_R11t_Fv15bNX154_R12v_CJ1U_NX1iw_y146_Fv3nK-l1Tt_Fvp7_NX3zt_y1If_R1pA_CJ3P_-l1Iz_R1pC_CJ3LK-l1IK_jvoa_CJ3Sb-l1Pk_R1oL_NX41t_y1J8_Fvi3_NX41__y1Ht_R1ia_AT47K_y13114_MU124_jv1e_AT1U_MU1oo_jv3F_AT1HtMU1if_jv4A_AT3utMU1RI_7vp4_NX3cK_y1TF_FvpS_HT3PKNj1Ib_7vpX_HT3LbNj1II_7vpB_Fv3StNj1Pf_7vod_HT3BK_y1J4_Fvi2_NX41K_y1Jt_Fviw_HT46tNX1HI_Fv1911F_Fv1t_AT15bMU154_Fv2v_NX1U_MU1iw_jv46_AT17v1t_AT15t-l128_jv3I_AT1OK-l1ot_R145_AT1HbMU1tk_R19D_CJ3nKMU1Tt_Fvp7_NX3PbMU1Ik_jvpZ_AT3LtMU1IR_jvpV_AT3L_MU1Pw_jvos_AT3SKMU1LB_Fviw_AT46tMU13114_MU124_R11e_AT1U_MU1oo_R13F_CJ1HtMU1if_jv4A_CJ3ut-l1RI_jvp4_NX3cK_y1TF_FvpS_AT3PKMU1Ib_jvpX_AT3LbMU1II_jvpB_AT3StMU1Pf_jvod_AT3BK_y1J4_Fvi2_NX41K_y1Jt_Fviw_AT46tMU1HI_Fv1d11f_x11p_Xv14t_y11Z_x11r_NX1rt_y174_Fv3G_NX1O__y1ow_x13S_Xv1PK-91ob_x14A_NX2rb-91ao_x19D_NX3Eb-J1UZ_bvpL_B13Ob-J1Iw_O116124_Fv3G_NX1O__y1tk_Fv9D_NX11J1i_NX1rt_y174_Fv1s11__jv1r_NX15bMU1pK_jv3G_NX1O__y1iw_jv46_AT1MK_y1j__Fv9D_NX3WtMU1YI_Fvpk_AT3RKMU1Uf_jvpE_NX3OK_y1Ho_FvyW_NX58b_y12112b_y11I_Fv1i_NX14b_y154_Fv2v_NX1Pt_y1of_Fv3A_NX1P__y1a8_Fv63_NX3Eb_y1UB_FvpH_NX3Pt_y12a14_MU124_jv1e_AT1U_MU1oo_jv3F_AT1HtMU1if_jv4A_AT2I__y1zw_jvpa_Fv3EKMU1YK_y1pn_Fv3YbNX1Uk_FvpG_AT45KMU1Vf_Fvrm_AT10J16_AT13KMU11F_R11u_AT15t_y154_R12v_CJ1E__y1oo_Fv3F_NX1PtMU1of_jv3A_AT1P_MU1tk_Fv5X_NX2rbMU1ao_jv7v_NX2Tb_y1jo_Fv7Q_AT2PKMU1kb_Fv7C_NX2L__y1l8_H189_Nr3ut_y1YR_FvpP_CJ3IK_y1I8_FvpD_NX4Wt_y1Cf_Fvyd_NX4W__y1B4_Fv1o11F_Fv21_NX1gt_y1Yw_R1pj_NX3E_-l1YB_R1pW_CJ3OK_y1Ho_Fvrm_NX16r1i_AT14_MU128_jv21_AT1gtMU1pK_jv45_AT1HbMU1RI_H1pS_Nr3PK_51Ib_H1pX_Nr3Lb_51II_H1pB_CJ3St_51Pf_H1od_Nr45__51Hw_R12Y11f_jv1p_AT14bMU124_R12f_B11db-J16I_O12l_Nr1OK-l1ot_R13D_AT1PbMU1ok_jv3Z_AT1LK_51yR_R14D_Nr1MK-l1qk_O15T_B12rbMU1ao_jv6X_B12vK-J1gw_H17r_B12QK-J1hw_O17d_Nr3ut-l1QR_O1pu_NX3z_-l1Y4_R1pq_CJ3Db-l1Pt_R1i5_NX42b_y1Jk_Fviu_CJ44K-l1Hk_R1if_CJ47t-l1HR_R1ik_NX48v7r1HN2cviv1wg4pr4E1GT1KviI1sr4or6a1F12fviH_Fv4iKNX1FX2uvi_1wg4r15A1D52uvu71gg4eJ4E1Dv1Kvu01oX4qv3-1DO1Kvui1oX4wr3-1DX2fvut1sX4a16n1S52fvug1h14dr7r1ST2Q1uk1h14f1771SD2cvun1wg4fJ5A1A12uvuc1wg4gv5A1Zg1CvuZ1yg4n14E1ZT1KvuB1oX4b13-1ZD1Kvu-1sr4bJ6a1X12s1y91sX4xr6n1XT2fvyo1sX4z16n1XD2fvyy_Fv4Cr3-1-k_y1tR_Fv4VtNX1611yb-V14I_Lv72_BT2z_-V1h8_Lv7w_BT48r5g1HN2M1iv1nT49r5g1Gr2qviW_Jg4pr2Q1GT2qviI1br4or8D1GB_y1iK1tT4i18D1Fw_R1i-1nT4tJ8U1D12Vvu21nT4rv6p1Di2qvu51aT4er6p1Dg2M1u817r4q16p1DQ2qvup1aT4qJ6p1DJ2qvuu1aT4wv8D1DN2M1ur1br4ar8D1So_R1ua_CJ4f18D1SD2M1un1nT4fJ8U1A12Vvuc1nT4gv8U1AQ2qvuU1aT4jJ6p1AD2qvuK_Jg4mv2Q1Zl1h1uX17r4nv6p1ZO2qvuN1aT4br6p1ZX2M1u_1br4v18D1X8_y1y3_Fv4ctNX1Xa1-vy71tT4cJ4V1Xv2M1y01br4xv8D1XO2M1yi1br4zr8D1X__R1tW1aT4Vb-l1-O1-v1a1HD2L1ic1kv401831Gl221iI1Wv4or0g1D92Jvu41l94e1831Da2JvuY1l94jv831AO2JvuP1l94lr551Zi221uD1rr4bv0g1ZN3d1y11Wv14v16_CJ13K-l11F_R11u_CJ1rt-l174_R13D_CJ1Pb-l1ok_R13Z_CJ2rb-l1ao_R1im1u949r4q11l15t-l1oo_R13F_CJ1MK-l1zw_R1im1wg49r5A15i14_Ba124_R11e_Pr10tNX13Z_R11J_CJ1wb_y16K_O12x_Fv1g_NX104_y13I_Pr1IbNX1pB_y13G_CJ1O_-l1iw-S146_Pr1H_NX1iR_y14A_CJ23tNX1rI_y167_Fv2ht-l1df_Fv70_Fv2x_NX1zw_R10V_Fv3v_-l1Tk_R1pi_CJ3PbNX1Ik_y1pZ_Fv3LtNX1IR_y1pV_Fv3L_NX1Pw_y1os_Fv3SKNX1LB_R1i1_CJ41b-l1Jo_R1i4_CJ45_NX1Hw_y1ij_CJ48tNX1HD2r1ic1a14pt-l1Fk_y1iZ_Fv4ytNX1FR_y1iV_Fv4y_NX1Sf_y1ud_Fv4s_NX1-t_y1tQ_Fv5qK_y11948r2L1G51kv2w124_jv25_CJ1eK-l15b_R129_CJ1qb_y16o_R12a_CJ1sK_y16z_Fv2Y_CJ1jK-l17K_R12O_CJ1kb-l17B_R12K_CJ1lt-l188_R12G_CJ1l_-l18R_R12V_CJ1n_-l18F_R12M_CJ1bK_y18__Fv31_NX1vb_y1p4_R13c_CJ1Ob-l1oo_jv3F_AT1Jt_y1i8_Fv4Q_NX1MKMU1tF_Fv4-_CJ21t-l1r8_R150_CJ23_-l1rZ_R15r_CJ25K-l1eB_R15Q_NX2pK_y1qF_Fv68_CJ2qb-l1aK_R16u_CJ2w_-l1s8_R16J_CJ2lK-l1fk_Fv6V_NX2bt_y1fB_Fv71_NX2xK-l1gZ_R19D_AT3tt-l1Qb_Fvim1sX49r6n24R_R1rV_CJ5y_-l24F_R1rM_CJ5tK-l24__R1e1_CJ5rb-l25o_R1e4_CJ1B11t_Jg15tMU128_2v1m_CJ18K-l13w_2v1E_B11pK-J13Z_jv1J_ZX1iK-l14w_R11A_AT1et-l15k_R128_CJ1qt-l15R_R12p_CJ1aK-l16w_R12d_CJ1s__y16z_R12h_CJ1dK-l16K_R12l_NX1fb-l17o_2v2z_Jg1ht-J17b_R12Y_CJ1jK-l17K_R12O_CJ1kb-l17B_R12K_CJ1lt-l188_R12G_CJ1l_-l18R_R12V_CJ1n_-l18F_R12M_CJ1bK-l18__R131_CJ1vb-l104_y13e_CJ1Tt-l1p8_R13I_Jg1IbN71pB_2v3K_CJ1Ot-l1o8_R13G_AT1O_MU1oI_Fv41_CJ1Jb-l1iw_2v46_Jg1H_N71iR_2v4r_CJ1Db-l1uo_R14z_AT1Ct-l1yk_R14Y_Xv1Mt_y1tk_jv4X_B11-b-l1tK_jv4N_CJ1_b-J1tB_R14__B121t-l1r8_R159_Jg23b-l1rI_2v5o_CJ24b-l1e4_R15q_CJ28b-l1eB_R15z_AT20t-l1qk_Fv5T_NX2pK-l1qF_R15L_CJ2it-l1ak_2v68_CJ2qt-J1aR_R16p_B12q_-l1aZ_R16t_CJ2ab-l1so_O16w_CJ2st-J1sf_R16d_B12s_-l1dw_jv6K_CJ2lt-l1f8_R16G_CJ2mbMU1fk_R16X_NX2nK-l1fF_R16-_CJ2vt-l1go_R175_NX2xbN71gI_R17o_Fv2zt-l1gZ_R17r_CJ2QK-l1hw_R17d_NX3utMU1zF_R107_AT3e_-l1QR_Fv0V_D93bt-l1T4_R1p4_AT3cKMU1Tz_R1pp_CJ3ztMU1If_rvpA_D93P_M31Iz_rvpC_D93LKM31IK_y1pN_CJ3H_-l1Oz_R1o0_CJ3GK-l1OK_R1oi_CJ3StM31Pf_rvod_D93S_-l1Pz_R1oh_CJ3AK-l1Lo_R1oz_CJ3Ct-l1Lf_R1oL_AT3-b-l1KI_R1oB_CJ3_t-l1J4_jvi2_AT41KMU1Jt_jviw_D946tNX1Hf_R1ij_AT48tN71HD2r1ic1a149K-J1Gz_bviO_CJ4uKN71Fb_2viX_Jg4ybN71FI_2viB_Jg4tb-J1Sf_2vud_Jg4s_N71At_O1uQ_B14hb-J1Ak_O1y4_AT4X_N71-w_y1tU_AT5yb-l24I_R1rB_CJ5tt-l24Z_R1r-_CJ5t_-l254_R1e2_CJ5rK-l25t_R1e5_CJ5eb-l25k_R1e8_CJ5qt-l11l15t-l1oo_R13F_CJ1MK-l1zw_R1im1sX49r6n17O12b-l11I_R11u_CJ15tMU13w_Yv1Z_DJ1ybMU14I_jv2h_CJ1dK-l17o_Yv2z_Vg1Ib-E1pB_Yv3G_AT1O_MU1ow_R13S_CJ1PK-l1ob_R148_Vg1Gb-E1tk_jv59_Vg23K-E1qf_w15R_DJ2rb-l1ao_R167_Vg2m_Mi1g8_jv73_CJ2xb-E1g__jv7r_CJ2QbMU1ho_R17w_AT2Wt-l1zw_jv09_DJ3nK-l1RF_Fvp1_NX3xt_y1TI_Fvpi_NX3zb-l1T__R1pr_CJ3QK_51If_R1pA_CJ3P_-l1Iz_R1pC_CJ3LK-l1IK_R1pN_NX3H__y1Oz_Fvo0_NX3GK_y1OK_Fvoi_NX3Db_51Pt_H1oa_CJ3Sb-l1Pk_R1of_NX3At_y1PR_Fvoj_NX3XK_y1Lt_FvoQ_NX3Cb_y1KR_FvoV_NX3-__y1KF_Fvi1_NX41b_y1Jo_Fvi4_NX42t-l1Jf_R1i7_CJ44b-l1JB_H1iw_CJ46t-l1Hf_Fvid_CJ46_-l1Hz_R1ih_Nr47K_y1HK_R1in19J4s_-E1Sv1z1uh19J4dv3i1SO1z11A11f_R11p_CJ14b-l14b_jv1C_AT1yKMU14F_x12f_B11db-J16I_O13D_CJ1Pb-l1ok_R13Z_CJ1L_-91yI_x15W_AT20K-J1qb_jv5T_B12rb-l1ao_R16Z_AT2nt-J1g8_jv73_B12v_-91g__jv7r_B12QbMU1ho_O17w_AT2Wt-J1hf_x109_AT3qb-J1TZ_R1pt_CJ3Qt-l1Yo_O1oe_B13D_-J1Jw_R1i6_CJ42K-l1JZ_R1iy_B146K-l1Hb_R1ig_CJ47b-J1HK_R1im1oX49r3-11948r6G1G52lv131HD2s1ic1sr1wr1t_Pr15t-l128-S11Q_Fv1ob-l144_O11A_CJ1eK_y17o_y12z_Fv1k__y104_y13I_Pr1IbNX1pB_y13G_CJ1O_-l1iw-S146_Pr1H_NX1iR_y14z_CJ1MK-l1tK_R14-_NX21t_y1rz_y15p_Fv29_-l1ak_y160_NX2q__y1dw_R16S_CJ2xbNX1gK_y19D_CJ3eK-l1RI_y1p4_CJ3cK-l1TF_R1pS_Fv3PKNX1Ib_y1pX_Fv3LbNX1II_y1pB_Fv3StNX1Pf_y1od_Fv3BK-l1J4_R1i2_CJ41K-l1Jt_R1iw_Fv46tNX1HI_R1il_Jg48r7r1G52Q1iT_B14uKN71Fb_2viX_Jg4ybN71FI_2viB_Jg4sbN71Sk_2vuf_Fv4v_-l1-t_2vtQ_Fv4VK-l11948r5O1G52o1131HD29vic1q911vim19949r331iQ14_NX124_jv1e_Fv18bMU12B_jv1Q_Jg1ob-l144_R11A_CJ1et-l15k_jv28_AT1qtMU15R_Fv2p_AT1aKMU16w_R12d_CJ1dt-l16R_jv2j_AT1d_-l16F_Fv2m_AT1gKN717t_2v2Y_CJ1jK-l17K_R12O_CJ1kb-l17B_R12K_AT1ltMU188_jv2G_AT1l_MU18R_jv2V_AT1n_MU18F_jv2M_AT1bK-l18__R131_CJ1vb-l104_y13v_AT1TbMU1pI_R13I_Fv1IbN71pB_2v3H_AT1OKMU1ot_jv3V_NX1K_-l1i4_Fv42_NX1HtNX1if_y148_Jg1GbN71yt_R14Q_CJ1CKMU1tw_Fv4A_AT1-bMU1tK_R14N_CJ1_KMU1r4_jv52_AT23tN71rR_R15p_Jg23_-l1rZ_jv5r_AT25KMU1eB_jv5z_CJ20t-l1qI_R15O_CJ2oKMU1w4_jv67_Jg2e_-l1aR_jv6o_AT2wbMU1a__jv6e_AT2a_MU1sf_jv6f_AT2ht-l1f4_jv6G_AT2mb-l1fk_R16V_CJ2bt-l1fB_R171_CJ2vKMU1gw_Fv70_Jg2xK-l1gK_y17u_AT2QtMU1ho_jv7a_AT2WK_y1zw_jv9N_AT3eK-l1Qb_R10V_Jg3btMU1T4_jvp4_CJ3cKMU1Tz_jvpp_AT3zt-l1If_2vpA_Jg3P_N71Iz_2vpC_Jg3LKN71IK_2vpN_AT3H_MU1Oz_jvo0_AT3GKMU1OK_jvoi_AT3StN71Pf_2vod_Jg3S_MU1Pz_jvoh_AT3AKMU1Lo_jvoz_AT3CtMU1Lf_jvoL_CJ3-bMU1KI_jvoB_AT3_tMU1J4_R1i2_CJ41K-l1Jt_R1iw_Jg46tN71Hf_jvij_CJ48tNX1HD2Q1ic1h14pt-l1Fk_y1iZ_Fv4ytNX1FR_y1iV_Fv4y_NX1Sf_y1ud_Fv4s_N71Xt_R1tz_Fv4CtNX1-I_R1rC_CJ5yK-l24K_R1rN_CJ5tb-l24B_R1r__CJ5rtMU258_R1e3_CJ5r_-l25w_jve6_AT5eKMU25b_jve9_AT1Wr1t_AT15t-l128_jv1Q_AT1ob_y144_Fv1A_CJ1et-l15k_R128_CJ1qt-l15I_R12q_CJ1st-l16k_R12k_CJ1fb-l17o_jv2z_AT1jb-l17I_R12I_CJ1kt-l17Z_R12L_CJ1k_-l184_R12H_CJ1lK-l18t_R12C_CJ1nK-l18K_R12N_CJ1bb-l104_R13v_CJ1Tb-l1pK_jv3P_AT1IKMU1o8_R13G_CJ1O_-l1iw_jv46_AT1H_MU1iR_jv4z_CJ1Ct-l1yk_R14Y_Xv1MK-l1tR_R14B_CJ1_t-l1tB_R151_CJ21b-l1rz_jv50_CJ23KMU1rK_R15u_CJ25t-l1eo_R15n_CJ29_-l1qw_R15L_CJ2it-l1ak_jv68_CJ2qb-l1aK_R16u_CJ2w_-l1s8_R16w_CJ2sb-l1sb_R16Q_NX2lt-l1fo_R16S_CJ2mK-l1gR_jv7p_CJ2x_-l1gZ_R19D_CJ3tt-l1Qk_R108_CJ3nKMU1Tt_Lvp7_NX3zt-E1If_jvpA_AT3P_MU1Iz_jvpC_AT3LKMU1IK_jvoa_AT3SbMU1Pk_jvoL_BT41t-E1J8_Yvi3_Vg41_-E1Ht_jvia_AT47K-E1HF_y1im1sX49r6n1Gz_FviA_Fv4u_NX1Fz_y1iC_Fv4yKNX1FK_y1us_Fv4sKNX1Sb_jvy4_CJ4X_NX1-w_R1tU_CJ5yb-l24I_R1rB_CJ5tt-l24Z_R1r-_CJ5t_-l254_R1e2_CJ5rK-l25t_R1e5_CJ5eb-l25k_R1e8_CJ5qt-l11l15t_y1oo_Fv3F_NX1MK_y1zw_Fvim1a149r6119i14_NX124_R11e_Fv10tN715w_R127_CJ1e_-l15z_R12p_CJ1aK-l16w_R12d_NX1gKN717t_2v2Y_CJ1jK-l17K_R12O_CJ1kb-l17B_R12K_CJ1lt-l188_R12G_CJ1l_-l18R_R12V_CJ1n_-l18F_R12M_CJ1QtN71p4_R13c_CJ1U_NX1pZ_2v3L_Jg1Ob-l1oo_R13F_CJ1HtNX1if_y148_Jg1GbN71yw_Fv4A_CJ1-b-l1tF_Fv4-_CJ21t-l1r8_R159_Jg23b-l1rI_2v5o_CJ24b-l1e4_R15q_CJ28K-l1qw_Fv67_Jg2e_-l1aR_R16o_CJ2wb-l1a__R16e_CJ2a_-l1sf_R16f_CJ2lt-l1fo_R16A_NX2xbN71gI_R17o_Jg2zb-l1zw_R19N_CJ3e__y1RI_2vp4_AT3cKMU1TF_jvpS_Jg3PKN71Ib_2vpX_Jg3LbN71II_2vpB_Jg3StN71Pf_2vod_Jg3BKMU1J4_jvi2_AT41KMU1Jt_jviw_Jg46tN71HI_jvil_K948r6n1G52fviA_K94u_BG1Fz-NviC_K94yKBG1FK-Nvus_K94sKBG1Sb_2vtz_K94CtN724R_R1rV_CJ5y_-l24F_R1rM_CJ5tK-l24__R1e1_CJ5rb-l25o_R1e4_CJ5et-l25f_R1e7_CJ5e_-l25z_R110124_jv3G_AT1O_MU1tk_jv9D_AT3L_Vg1Hw-E1im1sX49r6n14914t-l11__2v1e_Jg10t-l154_R12v_CJ1gK-l17t_R13r_CJ1U_N71pZ_R13L_CJ1HtN71if_2v48_CJ1Gb-l1rz_R15p_CJ2eK-l1gR_R17o_CJ3nK-l1Tt_H1pS_CJ3PK-l1Ib_R1pX_CJ3Lb-l1II_R1pB_AT3St-l1Pf_R1od_CJ3BK_51Ht_R1ia_AT48t-q1HD2Evic1hT4uK-q1Fb_QviX_C94yb-q1FI_QviB_C94sb-q1Sk_Qvuf_CJ4X_-q1-w_R118124_jv3G_AT1O_MU1tk_jv9D_AT48r6p1G52qv1N11f_g11p_A114t_y11Z_g11r_CJ1u_Mi14R_jv1V_AT1tt-l154_Fv2h_NX1dK_y16F_Fv2v_NX1OK-l1ot_R13D_A11PbMv1ok_g13Z_A11LK_y1oK_R14U_CJ1Mt_y1tk_R15W_DJ20_Mi1a8_g163_A12m_Mi1g8_jv73_NX2v_-l1gw_Fv7t_AT2Qt_y1h8_jv7q_NX2Q_MU1hw_Fv7s_CJ2WK_y1zw_R109_DJ3zbNX1T__jvpr_AT3QKMU1P8_jvow_AT42tNX1Jf_y1i7_Fv44bMU1JB_jvid_AT46_MU1Hz_jvih_AT47_NX12a12bNX11I_y11u_Fv15t-l10K_Fv3G_CJ1O_-l1ow_y13S_Fv1PKNX1ob_y14A_CJ2yt_y1a8_y163_Fv3ut-l1YR_jvpP_AT3IKMU1I8_jvpD_AT12J1r_AT1E__y1oo_jv3F_AT1MKMU1wz_Fv9D_AT1811i_NX1rt_y174_Fv3b_CJ21_-l1rw_Fv7b_NX2Yb-l1jb_Fv7L_NX2H__y1Yw_R1pj_NX3E_-l1YB_R1pW_CJ3OK_y1Ho_Fvyw_NX4Eb-l1CI_Fvym_NX4Yt_y1B8_R1tx_CJ57_-l22F_R1rm_NX1iv1t_Pr15tMU128-S11m_NX18K_y10K_Fv3I_Pr1OKMU1ot_jv45_Pr1HbBa1tk_jv5D_NX2uK_y1wb_Fv5X_NX2yb_y1jk_Fv7K_NX2Kt_y1kZ_Fv7__NX2Hb_y1lI_Fv8i_NX2Fb_y1lB_Fv8t_NX2Dt_y1m8_Fv8q_NX2D__y1mw_Fv8s_NX3utMU1zZ_Fvpa_AT3Et_y1YI_R1pk_AT3RKMU1Uo_FvpW_AT3YK_y1UR_FvpK_NX3OK-l1Ho_R1yW_NX58b-l11T15t_y10K_Fv3G_NX1O__y1tk_Fv5F_NX2yt_y1jw_Fv9D_NX4IK_y11O1E__y10__Fv54_NX2yt_y1jw_R17W_NX4Eb_y1B8_Fvtx_NX57__y22F_Fv2i11__y11r_AT15bNX12Z_jv1n_AT1E_MU10__2v3U_CJ1U_NX1oo_jv3F_AT1K_-l1iw_y146_Fv1MKMU1rt_2v55_U92iK_y1wt_jv5D_Fv2uKNX1wb_y15X_AT2ybNX1h_-Tv7z_NX2YbN71jk_y17R_U92IKVx1j__jv7G_NX2KtNX1kZ_y17__Fv2JbNX1lw_Fv86_Fv2GtNX1lI_y18i_Fv2FbNX1lB_y18t_Fv2DtNX1m8_y18q_Fv2D_NX1mw_y18s_Fv3utMU1zZ_y1pa_Pr3EtMU1YI_y1pk_Pr3RKBa1Uo_jvpW_Pr3YKMU1UR_jvpK_AT3OKNX1Ho_y1yw_U94EbN71CI-Tvym_U94YtVx1Vf_jvyL_AT4ObN71-o_2vrk_Jg58tN722Z_y11Y11f-S11p_Pr14t-l11Z-S11r_CJ1rt-l174_R13k_NX1OK-l1ot_R13D_Pr1PbBa1ok-S13Z_Pr1MK-l1wt_Fv5X_NX2rbBa1ao-S17v_CJ2Tb-l1jo_R17Q_Jg2PKMU1kb_x17C_CJ2L_-91l8_H189_Nr3ut-l1YR_jvpP_AT3IKMU1I8_jvpD_AT4Wt-l1Cf_R1yd_CJ4W_-l1VB_FvyJ_CJ1311r_NX1OK_y1ot_Fv4A_NX2ur2X1l11n18018v3ut_y12g1E__y1ww_Fv5A_NX2u__y1wz_Fv5C_NX2YK_y1kF_Fv7M_NX2K__y1lf_Fv8p_NX2Ft_y1lZ_Fv8t_NX2Dt_y1m8_Fv8q_NX2D__y1mw_Fv8s_NX3tb_y11l15t-l10K_Fv3G_CJ1O_-l1tk_R15X_NX3ut-l12l15tNX10K_R13G_Fv1O_NX1tk_y15G_CJ2i_NX1wz_R17z_CJ2Yt-l1ko_R17C_NX2Jb_y1lw_R189_NX3utNX1YR_R1pP_CJ3IK-l1I8_R1pD_CJ4IKNX1B4_Fv1W11_-S11r_CJ15bBa10__R13I_Pr1OK-l1ot_R145_Pr1HbBa1tk_R154_CJ22tNX1h__y17W_CJ2Y_NX1jB_y17K_CJ3ut-l1Yw_y1pj_CJ3E_NX1YB_y1pW_Fv3YK-l1Io_R1iq_CJ4Q_NX1CR_R1yj_Fv4RbNX1Vw_y1yW_CJ4Ob-l1-o_R1rk_CJ58t-l22Z_R11c10__R154_CJ22t_y1h__Fv7W_CJ2Y__y1jI_R17L_NX2Ob-l1kf_R17X_CJ2H__y1Yw_Fvpj_NX3E__y1YB_FvpW_NX3OK_y1Ho_Fvyw_NX4Eb-l1CI_Fvym_NX4R_-l1Vw_FvyR_CJ4U_-l1V__R1yH_CJ4XK-l22K_R1rl_CJ58b_y13a14_NX124_Fv1e_Fv1R_-l1pK_y13G_NX1O__y1iw_y146_Fv1MK_y1rt_R155_Fv2R_NX1jf_R17R_Fv2IKNX1j__Fv9D_NX3Wt-l1YI_R1pk_CJ3RK-l1Uf_R1pE_NX3OK-l1Ho_R1yw_Fv4Eb-l1CI_y1ym_Fv4YtNX1Vf_FvyH_CJ4XK-l22K_R1rl_CJ58b-l11O2S_MU1n4_jv8A_AT2_KMU1WZ_R10W_CJ3kt-l1Rf_R1yS_AT4KKMU1MF_jv2911__y11r_AT15bNX12Z_jv1n_AT1U_NX1oo_jv3F_AT1HtNX1if_y14A_AT2AbMU1mI_jv8m_CJ2ZK-l1nw_2v8T_AT2B_-l1b4_R18G_AT2MbMU1bz_jv94_CJ32t-l1vf_Fv99_NX33b-l1vI_R19o_CJ34_NX1c4_jv9q_CJ36b-l1ck_Fv9f_NX37t-l1cR_R19k_NX38K_y1x8_R19z_AT30t-l1xa1h19R_CJ3pt-l1xF_y19L17r3it_y1zw_jv0o_Jg3w_N71Wo_R10d_CJ3s_N71WR_jv0l_AT3f_MU1Ez_R10U_CJ3kKMU1E__jv0G_AT3l_-l1Bb_jvyN_CJ4JKN71Nk_jvtu_CJ4FK-l1Mk_jvtc_CJ58K-l11930r2Q1xX1h11l124_jv3G_AT1O_MU1tk_jv95_CJ33b-l1vI_Fv9o_NX34__y1co_R19s_CJ36K_y1cb_Fv9g_CJ37b_y1cK_Fv9n_NX39b_y1xw_R19W17r30_-l1xz_R19I15g3ot_y1xX1h19J_NX3utMU22B_R12511__2v1r_AT15bN71pK_2v3G_AT1O_MU1iw_2v46_Jg1MKMU1mR_R18j_CJ2ZbMU1mB_Fv8Q_Jg2Vt-l1n__Fv8J_ZX2NK-l1bf_R18X_CJ32tMU1vf_R199_NX33bMU1vI_jv9o_AT34_NX1c4_jv9q_AT36bMU1ck_Fv9f_NX37t-l1cR_jv9k_NX38K_y1x8_jv9z_CJ30tMU1xa1h19R_AT3ptMU1xF_y19L17r3it_y1zw_jv0o_D93w_M31Wo_R10d_CJ3s_M31WR_R10l_CJ3f_-l1Ez_R10U_CJ3kK-l1E__R10G_AT3l_-l1Bb_R1yN_NX4JKN71Nk_R1tu_NX4FKM-1Mk_R1rn_AT17r16_CJ13K-l11F_R11u_CJ1rt-l174_R13D_CJ1Pb-l1ok_R13Z_CJ2rb-l1ao_R18f_Jg2XtN71bk_2v8-_Jg36K_y1cB_Fv0m_CJ3hb-l1EF_R10S_CJ4PbN71BB_2vtl_Jg1uv1t_Pr15tMU128-S11m_NX18K_y1pK-S13G_AT1O_MU1iw-S146_Pr1MKMU1mZ_R18n_NX2CtN71nz_R18K_NX2Nt-l1vw_R190_CJ33K_y1vK_Fv9t_CJ35t-l1co_R19s_CJ37t-l1cR_Fv9c_NX39_-l1xw_R19W18v30_-l1xz_R19O_CJ3ov2X1zw_jv0o_Jg3w_N71Wk_Fv0f_Jg3dbMU1WF_jv0b_AT3jK_y1EB_jv0K_AT3lKMU1Rt_FvyN_NX4JKN71Nk_R1tu_NX4FK-l22B_R11a11f_R11p_CJ14b-l124_Fv3G_NX1O__y1ow_R13S_CJ1PK-l1ob_R14A_NX2rb-l1ao_R19d_B138K-J1zw_Fv0m_CJ3hb-l1EF_R10S_CJ1411t_NX15b_y1pK_Fv45_NX1Hb_y1nz_Fv9t_NX3ot_y1QK_R10t_CJ3s_-l1Nk_Fv1c11_-S11r_CJ15bBa1pK-S13G_CJ1O_-l1iw-S146_Pr1MK-l1mZ_R18n_NX2CtNX1nz_R18K_NX2Nt-J1v__R19r_CJ39__y1xa1h19O_CJ3ov2Q1zw_R10o_Fv3w_NX1Wk_Fv0f_Fv3lK-l1Rt_FvyN_NX4JKNX1Nk_R1tu_NX4FK-J1191Y11611a1111p11D11r1t12512r1m12X1311Q13D13v1K14r1611A14T17v1N14J18J1-14X1912115119r2n16X19v2v17119J2x17v1013e1051pJ3k10O1o13b10N1or3Y1pO1ov3P1o11ir3G1ol1ur3B1oO1yJ3-1oN1t1451ia1tv481ua1r14c1y51wJ4z1yi1a14T1yv1ar4U1yO1av4A1tg1s14X1tv1sr4V1tO1sv4M1tD1d14_1tN1dr541rr1dv591rv1f15p1rT1fr5i1rJ1fv5y1rN1fJ5e1e51gr5w1ei1gv5s1ea1gJ5f1el1h15h1eQ1hr5k1eO1hv5m1eD1hJ5z1qi1j15W1qa1jr5R1ql1jv5Y1qQ1jJ5I1qO1k15H1wi1kr5Z1wv1l15-1wX1lv621a91lJ671ag1mr691av1mv6p1aT1mJ6i1aJ1n16y1aX1nr6r1s11nv6q1s91nJ6a1sr1b16d1sg1br6g1sv1bv6j1sT1bJ6l1sJ1v16n1sX1vr6v1d11vv6x1d91vJ6Q1dr1c16Y1dQ1cr6I1dO1cv6P1dD1cJ6K1dN1x16H1f51xr6S1fa1xv6Z1fl1xJ6C1fQ1z16B1fO1zr6M1fD1zv6_1fN1zJ721g51Q1741gi1Qr701gQ1Qv7i1gJ1QJ7t1gN1W17e1h51Wr7w1hi1Wv7s1ha1WJ7b1hN1E17z1ja1Er7R1jv1R17U1jT1Rv7P1jN1RJ7H1k91Tv7D1kQ1Y17B1kO1Uv821l91UJ851lr1Ir881lQ1Iv8i1lJ1Or8f1mv1Ov8m1n11P18x1n91L18Q1na1Lr8R1nl1LJ8J1b11K18G1b91Kr8D1br1Kv8A1bv1KJ8-1bX1Jv911v91JJ9G1z91Hv9D1zr1HJ071Qg1G1091Qv1Gr0o1QX1Gv0q1W91Fv0f1Wl1FJ0h1WQ1D10k1WO1Dr0m1WN1Dv0W1Ea1Sr0R1EQ1Sv0O1ED1Ar0K1Ra1AJ0Z1Rl1Xv0C1RO1XJ0M1RD1Cv0_1RN1CJp31Tg1V1p91Yr1Brpf1YO1-vpm1YX1_Jpx1Ui21rpW1Ug21JpY1UQ22rpI1UO22vpP1UN22JpH1IT23vo21Oa261o81Pg27rok1PJ2proT1Kr2pJoC1KO2y1oM1Hi2yJis1Ci2avyd1CD2Dryb1CN2Aryc1Va2AvyR1Vv2ZJyU1Bi2XryS1Bl2VJyC1BX2Bvt11N12M1t31Ni2Mrt61Na2MJti1NJ2-1ty1M12-rtq1Ml2_1tl1MJ31vtn1-131Jtx1-O32vrk22D351e125135J1211113v4i1Vr11AuClEJ167mGhdO1u7Hcm7X1s11511111t__11O1311t12r18v1112Q19J1T13D1iv1Z11r11111__N13J1012116r1b11517v1Q13Q1ov1F14v15113w6e9911LaQMu912y114__J1i11a13v1e12g1911312O10r1U13N1u11C114__J1u11g13J1u12916J1c11i1811E13O1i11S14T11t__11D12J1i11X15J1g1391211m13l1o11H14g1yJ1NgF0FgJ6UgF0FgJ6JgF0FgJ6AgF0FgJ6NgF0FgJ73h7HYhJ79h7HYhJ7yh7HYhJ7ak7CSkr7jk7CSkr7vk7CSkr7Ek7CSkr7Ok7CSkr7Gk7Mzk17Xk7Mzk17-kACSkr85kACSkr8pkACSkr8rkACSkr8dkACSkr8ll7CSkr8xl7CSkr8Tl7CSkr8Ll7CSkr8Dl7CSkr8VlA6Om191lA6Om197lA6Om19ilA6Om19qlA6Om19glASzl19nlASzl19QlASzl19UlASzl19JlASzl19AlZiJir9NlZiJir03lZiJir09lZiJir0ylZiJir0alZiJiv0jlZiJiv0xlZiJiv0UlZiJiv0GlZiJiv0XlZiJiJ0-lZiJiJp5lZiJiJpplZiJiJprlZiJiJpdlZmFj1pllZmFj1pxlZmFj1pTlZmFj1pLlZmFj1pDm7CSkrpVm7CSkro1m7CSkro7m7CSkroim7CSkroq11111r1511111r1411111r1311111r1311111r1311111r1q11111r1q11111r1q11111r1011111r1011111r1011111r1011111r1011111r1111111r1211111r1911111r1911111r1911111r1911111r1911111r1p11111r1p11111r1p11111r1p11111r1p11111r1e11111r1r11111r1t11111r1t11111r1t11111r1811111r1711111r1611111r1611111r1611111r1y11111r1u11111r1i11111r1i11111r1i11111v1811X1111311g14r1111912r1i11111r1611111r1611111r1e11111r1r11111r1t11111r1t11111r1t11111r1y11111r1u11111r1i11111r1i11111r1i11111r1o11111r1o11111r1o11111r1o11111r1o12i1p11J14v1r1291611d12v17v1l12X1911x13r10v1T13T1o11L11211111r3g1151111210X11r111151P11211111ruX115111121-911r111155wv1211111rln115111122Xv11r111158M11211111rvr1151111233J11r111159f11211111rxq115111123Sg11r11115oL11211111rJl1151111249111r11115iTv1511111rGT119131121QT11r1218r11v1y11r3ev081qa20v131191-J4N1113q10011911v571913nv0B1RJ3br0-1RN3v1p21T93vJp51Ta3cvp81Tv3xrpp1TO3z1pu1TX3zJpr1Y53Qvpw1IQ3LvpN1IX3Hvoo1P13LJoi1Ia3L1op1KJ3DJpZ1IN3Pvo11ID3Jvo41Or3Jro91OQ3HJoy1ON3FroD1Ji451o61P53Dvoz1LJ41vof1PT3Srod1PO3Z1ov1L53N1oG1Ki3MroZ1KO3_ro_1J1421i61JT43Jit1H53Broa1Pv3Arom1PX3ZJox1Lr3CroE1Ll3V1oY1LT3VJoL1LN3NroA1Kv3-roV1KX41ri71Jl431i01JJ44riy1Hi461is1Hg46Jig1HQ47vik1191qJ1Q14D1112x17v17v3r10519r3P1o119J3B1oO10J481ua1p14c1y51uJ4z1yi1y14W1ya1yr4T1yv1yv4U1yO1yJ4X1tv1tr4V1tO1tv4M1tD1r14_1tN1rr591rv1rv5p1rT1rJ5i1rJ1e15y1rN1er5e1e51eJ5w1ei1q15s1ea1qr5f1el1qv5h1eQ1qJ5k1eO1w15m1eD1wr5b1eN1wv5c1q51wJ5z1qi1a15W1qa1ar5R1ql1av5Y1qQ1aJ5I1qO1s15P1qD1sr5K1qN1sv5-1wX1sJ671ag1d1691av1dr6p1aT1dv6i1aJ1dJ6y1aX1f16r1s11fr6q1s91fv6a1sr1fJ6d1sg1g16g1sv1gr6j1sT1gv6l1sJ1gJ6n1sX1h16v1d11hr6x1d91hv6Q1dr1hJ6E1dg1j16Y1dQ1jr6I1dO1jv6P1dD1jJ6K1dN1k16H1f51kr6F1fi1kv6S1fa1kJ6Z1fl1l16C1fQ1lr6B1fO1lv6M1fD1lJ6_1fN1m1721g51mr741gi1mv701gQ1mJ7o1gJ1n17t1gN1nv7e1h51nJ7w1hi1b17s1ha1br071Qg1bv091Qv1bJ1315T19vpG1YX3Rrpx1UN2Prpa1Ya3Wvpf1Yv3Erpj1YO3R1pb1U13Trpz1Ur3YrpE1Ul3U1pY1UT3UJpO1UD3IvpJ1I53OJpD11912v3b10N1113T1pv11r5H1wi11v5Z1wl12r7b1ja12v7R1kO14r1317r1oJ0I1EJ3kr0L1EN3l10H1R93lJ0D1Ra3mv0Z1Rv3qJ0i1QD3wv0t1W13ar0q1Wi3s10s1Wg3sJ0g1WQ3dv0k1WJ3fr0n1WN3g10c1E93gJ0Q1Ea3hv0R1Ev3jr0U1RQ11v131mg31J111z93iv1L11922v311RT3nJ0N1RD3bv0_1T13vrp31Ti3c1p61Tg3cJp91TQ3xvpo1TJ3zrpy1TN3Q1pe1Y93QJpA1Ia3PJpC1Iv3LvpN1IX3Krp_1O13Jvo21Oi3H1o71Ov3HJo01OO3Gvoy1OD3FJor1IO3F1oN1Pi3B1oD1Ji451o61P93Droz1J93SJoj1PJ3Srod1PO3X1oc1K13NvoF1Ka3MJoB1KD3_Ji11Jr42rip1JO44Jie1LD3S1og1PQ3Zron1PN3XvoQ1La3CvoR1Lv3VroU1LO3BvoK1K53MvoX1KQ3-vo-1J542vi81Jv43rii1JD44viw1Ha46vif1Hv47ria1HT47J1315D1e12m1111jr3212T1T13c14i1Or3H14a1Lv3V14g1Sv4d14l1Xv4x14v1C14Q14Q1Cv4E14T1Vr4Y14O1B14O14J1M14D14D1-r4C14X1_14N14N1_v4-1512115215523r5015i23J5o15r24r5u15a2515r15g25v5q15l2615a15v26v5d15Q2715g15T27v5j15O2815l15J28v5n15D2915v15X29v5x15N2015Q16120v5E1652p15T1692pv5U16i2o15O16r2ov5L16a2i15J16g2tJ5_16l2eJ6816v2qr6016Q2qJ6o16T2wr6u16O2wJ6t16J2ar6e16D2aJ6w16X2sr6s16N2sJ6f1712dr6h1752dJ6k1792fr6m17i2fJ6b17r2gr6c17a2gJ6z17g2hr6W17l2hJ6R17v2jv6U17Q2k16O17T2kv6L17O2l16J17J2lv6G17D2m16D17X2mv6A17N2n16X1812nv6V1852b16N1892bv6-18i2v17118r2vv7318a2c17518g2xv7p18l2zr7u18v2Q17r18Q2Qv7q18T2W17a18O2Wv7d18J3t19N18D3eJ0818X3qr0018N11v2p1393UvpE1YO3Rvpb1UJ3IrpK1Yr3Wrpd1YJ3Rrpv1U53Tvpz1Ur3YrpR1Uv3UrpI1UJ3IvpJ1I53OvpF1Ir3E1ph1YT3WJ1311g1EJ3k11121v531152u15C1192K17-11v2J18s11O3tr9M13511v2Q13N3qJ0i1QD3wv0t1W13ar0q1Wi3s10s1Wg3sJ0g1WQ3dv0k1WJ3fr0n1WN3g10c1E93gJ0Q1Ea3hv0R1Ev3jr0U1EO3k10P1EX3kJ0J1R53lv0F1Rr3mr0A1Rl3n10C11911v951z51119F1zi1ov1312T13vtO1-D4BvtK1_14NrtG1_i4M1tS11911r1w12J1111312T13v1w12r16r1d12l1711h12T17J1l11911rtO1_a1111313X161tO1-D4BvtK1_14NrtG1_i4M1tS12i1611s12g16J1g12Q17v1k12J11v121_g53r111191ov1a21151rr321i521r621g52Jr921Q4MvtZ1_v4-rtV1_O4_1tM1_X4_J1311915J1l1114B1tS11T11v57191481im1HX48Jiv1G549viz1Gr40riE1Gl4p1iY1GT4pJiO1GD4oviK1F14iriG1Fi4u1iS1FT4yJiM1FN4eJui1S54t1uu1Fg4yruo1ZD4s1iX1D14uJu21FX4rJu51Da4rvu01DT4q1ut1S14wvuS1Xr4Qvu71S94aJuQ1AD4vJug1SO4svuf1SJ4fruc1A94lruF1Zr4mvuX1ZJ4bvy11X54cry71XO4z1yr1C54kvus1SQ4dvun1SN4g1uz1Aa4hvuR1Av4jruU1AO4k1uK1Z14lvuZ1ZQ4nvuB1ZN4vvy81Xv4xryp1XD4zvyt1-i4C1tW1-g4CJtT1-Q4VvtI1191qJ1Q14D1112x17v17v3r10519r3P1o119J3B1oO10J481ua1p14c1y51uJ4z1yi1y14W1ya1yr4T1yv1yv4U1yO1yJ4X1tv1tr4V1tO1tv4M1tD1r14_1tN1rr591rv1rv5p1rT1rJ5i1rJ1e15y1rN1er5e1e51eJ5w1ei1q15s1ea1qr5f1el1qv5h1eQ1qJ5k1eO1w15m1eD1wr5b1eN1wv5c1q51wJ5z1qi1a15W1qa1ar5R1ql1av5Y1qQ1aJ5I1qO1s15P1qD1sr5K1qN1sv5-1wX1sJ671ag1d1691av1dr6p1aT1dv6i1aJ1dJ6y1aX1f16r1s11fr6q1s91fv6a1sr1fJ6d1sg1g16g1sv1gr6j1sT1gv6l1sJ1gJ6n1sX1h16v1d11hr6x1d91hv6Q1dr1hJ6E1dg1j16Y1dQ1jr6I1dO1jv6P1dD1jJ6K1dN1k16H1f51kr6F1fi1kv6S1fa1kJ6Z1fl1l16C1fQ1lr6B1fO1lv6M1fD1lJ6_1fN1m1721g51mr741gi1mv701gQ1mJ7o1gJ1n17t1gN1nv7e1h51nJ7w1hi1b17s1ha1br071Qg1bv091Qv1bJ1315v19ryH1CD4R1yc1VX4QJya1Ca4Wvyf1Cv4Eryj1CO4Rvyb1V14Tvyz1Vr4YryE1Vl4U1yY1VT4UJyO1VD4IJyJ1B94OJ1311a1RJ3b1111U13T1152ir5F1192RJ7W11a2YJ7B11J11v2x13X4P1yS1Bg4PJyX1BQ4LvyB1BJ4Kry-1BN4J1t21N94JJt51Na4Hvt81Nv4Grtp1NO4F1tu1NX4FJtr1M54Dvtw1Mr4Srtd1Ml4A1th1MT4AJtl1MD4Zvtb1-14Xr131152Sv9411111v1E1215yre524O5yvrN24X5trr_2515eve325i5rre625l5q11311O1e1251111qv2p1151jr2L1191T13v11v1-r4C11Q23r5011T23J5o11O2eJ6811J2aJ6w11D2sr6s11X2sJ6f11N11v1y11r57Jrk22J58r1311r1RJ3b11121J541152Yr7W1193OvpG11i11v1911558v121153311212T11r1911912v1i1i111v2i1i511v2t11511r20"
\ No newline at end of file
diff --git a/at-admin/app/controllers/login.go b/at-admin/app/controllers/login.go
new file mode 100644
index 0000000..e2e514a
--- /dev/null
+++ b/at-admin/app/controllers/login.go
@@ -0,0 +1,96 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/models"
+ "anytunnel/at-admin/app/utils"
+ "image/color"
+ "image/png"
+ "strings"
+
+ "github.com/afocus/captcha"
+ "github.com/astaxie/beego"
+)
+
+var (
+ cap = captcha.New()
+)
+
+func init() {
+ bs, _ := utils.NewEncrypt().Base64DecodeBytes(fontData)
+ cap.AddFontFromBytes(bs)
+}
+
+type LoginController struct {
+ BaseController
+}
+
+func (this *LoginController) Index() {
+ this.Layout = "layout/login.html"
+ this.TplName = "login/login.html"
+ this.Data["title"] = beego.AppConfig.String("sys.name") + "登录"
+ this.Render()
+}
+
+//login
+func (this *LoginController) Login() {
+ if this.isLogin() {
+ return
+ }
+ userModel := models.User{}
+ name := strings.TrimSpace(this.GetString("username"))
+ password := strings.TrimSpace(this.GetString("password"))
+ captcha := strings.TrimSpace(this.GetString("captcha"))
+ captchaSession := this.GetSession("captcha")
+ if captchaSession == nil || captcha == "" || captchaSession != strings.ToLower(captcha) {
+ this.SetSession("captcha", "")
+ this.jsonError("验证码错误!")
+ }
+ this.SetSession("captcha", "")
+ user, err := userModel.GetUserByName(name)
+ if err != nil {
+ this.jsonError(err)
+ return
+ }
+ if len(user) == 0 {
+ this.jsonError("账号错误!")
+ }
+ encrypt := new(utils.Encrypt)
+ password = userModel.EncodePassword(password)
+
+ if user["password"] != password {
+ this.jsonError("账号或密码错误!")
+ }
+ //加载权限列表
+
+ //保存 session
+ this.SetSession("author", user)
+ //保存 cookie
+ identify := encrypt.Md5Encode(this.Ctx.Request.UserAgent() + this.getClientIp() + password)
+ passportValue := encrypt.Base64Encode(name + "@" + identify)
+ passport := beego.AppConfig.String("author.passport")
+ //fmt.Println("set cookie " + passportValue)
+ this.Ctx.SetCookie(passport, passportValue, 3600)
+
+ this.jsonSuccess("登录成功", "", "/main/index.html")
+}
+
+//logout
+func (this *LoginController) Logout() {
+ passport := beego.AppConfig.String("author.passport")
+ this.Ctx.SetCookie(passport, "")
+ this.SetSession("author", "")
+ this.Redirect("/login/index.html", 302)
+ this.StopRun()
+}
+
+func (this *LoginController) Captcha() {
+ //bs, _ := ioutil.ReadFile("static/index/comic.ttf")
+ //ioutil.WriteFile("a.txt", utils.NewEncrypt().Base64EncodeBytes(bs), os.ModeAppend)
+ cap.SetSize(80, 28)
+ cap.SetDisturbance(captcha.NORMAL)
+ cap.SetFrontColor(color.RGBA{255, 255, 255, 255})
+ cap.SetBkgColor(color.RGBA{255, 100, 100, 100})
+ img, str := cap.Create(4, captcha.ALL)
+ this.SetSession("captcha", strings.ToLower(str))
+ png.Encode(this.Ctx.ResponseWriter, img)
+}
diff --git a/at-admin/app/controllers/main.go b/at-admin/app/controllers/main.go
new file mode 100644
index 0000000..b47617a
--- /dev/null
+++ b/at-admin/app/controllers/main.go
@@ -0,0 +1,103 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/models"
+ "fmt"
+ "strconv"
+ "time"
+
+ "github.com/dustin/go-humanize"
+
+ "github.com/astaxie/beego"
+)
+
+type MainController struct {
+ BaseAdminController
+}
+
+func (this *MainController) Default() {
+ if this.Ctx.Input.IsGet() {
+ this.view("main/default")
+ } else {
+ data := map[string]interface{}{}
+ db := models.G.DB("base")
+ rs, err := db.Query(db.AR().Select("count(*) as total,cs_type").From("online").GroupBy("cs_type"))
+ if err != nil {
+ this.jsonError(err.Error())
+ }
+ d := rs.MapValues("cs_type", "total")
+ clients := "0"
+ servers := "0"
+ if v, ok := d["client"]; ok {
+ clients = v
+ }
+ if v, ok := d["server"]; ok {
+ servers = v
+ }
+ rs, err = db.Query(db.AR().Select("count(*) as total").From("cluster").Where(map[string]interface{}{
+ "update_time >": time.Now().Unix() - 60,
+ "is_disable": 0,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ this.jsonError(err.Error())
+ }
+ clusters := rs.Value("total")
+
+ now := time.Now().Unix()
+
+ rs, err = db.Query(db.AR().Select("sum(bytes_total) as total").From("package").Where(map[string]interface{}{
+ "start_time <=": now,
+ "end_time >=": now,
+ }))
+ if err != nil {
+ this.jsonError(err.Error())
+ }
+ traffic := rs.Value("total")
+ if traffic == "" {
+ traffic = "0"
+ }
+ rs, err = db.Query(db.AR().Select("sum(bytes_left) as total").From("package").Where(map[string]interface{}{
+ "start_time <=": now,
+ "end_time >=": now,
+ }))
+ if err != nil {
+ this.jsonError(err.Error())
+ }
+ trafficLeft := rs.Value("total")
+ if trafficLeft == "" {
+ trafficLeft = "0"
+ }
+ data["online"] = map[string]interface{}{
+ "client": clients,
+ "server": servers,
+ "cluster": clusters,
+ }
+ _traffic, _ := strconv.Atoi(traffic)
+ _trafficLeft, _ := strconv.Atoi(trafficLeft)
+ _trafficUse := _traffic - _trafficLeft
+ data["traffic"] = map[string]interface{}{
+ "total": traffic,
+ "total_human": humanize.Bytes(uint64(_traffic)),
+ "total_left": _trafficLeft,
+ "total_left_human": humanize.Bytes(uint64(_trafficLeft)),
+ "total_use": _trafficUse,
+ "total_use_human": humanize.Bytes(uint64(_trafficUse)),
+ }
+ this.jsonSuccess("", data)
+ }
+}
+func (this *MainController) Index() {
+ this.Layout = "layout/main.html"
+ this.TplName = "main/index.html"
+ this.Data["title"] = fmt.Sprintf("%s - %s", beego.AppConfig.String("sys.name"), beego.AppConfig.String("sys.fullname"))
+ privilege := models.Privilege{}
+ navigators, menus, controllers, err := privilege.GetTypedPrivileges(this.loginUser["user_id"], "1")
+ if err != nil {
+ this.jsonError(err, "")
+ }
+ this.Data["navigators"] = navigators
+ this.Data["menus"] = menus
+ this.Data["controllers"] = controllers
+ this.Render()
+}
diff --git a/at-admin/app/controllers/privilege.go b/at-admin/app/controllers/privilege.go
new file mode 100644
index 0000000..969377e
--- /dev/null
+++ b/at-admin/app/controllers/privilege.go
@@ -0,0 +1,144 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/models"
+ "regexp"
+ "time"
+
+ "github.com/go-ozzo/ozzo-validation"
+)
+
+type PrivilegeController struct {
+ BaseAdminController
+}
+
+func (this *PrivilegeController) Delete() {
+ privilegeModel := models.Privilege{}
+ privilegeId := this.GetString("privilege_id")
+ privilege, err := privilegeModel.GetPrivilegeByPrivilegeId(privilegeId)
+ if err != nil {
+ this.jsonError(err)
+ }
+ hasSub, err := privilegeModel.HasSub(privilegeId)
+ if err != nil {
+ this.jsonError(err)
+ }
+ if privilege["type"] != "controller" && hasSub {
+ this.jsonError("子菜单非空,不能删除")
+ }
+ err = privilegeModel.Delete(privilegeId)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+
+}
+func (this *PrivilegeController) Add() {
+ privilegeModel := models.Privilege{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getPrivilegeFromPost(false)
+ _, err := privilegeModel.Insert(data)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+ } else {
+ navigators, menus, _, err := privilegeModel.GetTypedPrivileges("1", "-1")
+ if err != nil {
+ this.jsonError(err, "")
+ }
+ this.Data["navigators"] = navigators
+ this.Data["menus"] = menus
+ this.Data["action"] = "add"
+ this.viewLayout("privilege/form", "form")
+ }
+
+}
+func (this *PrivilegeController) Edit() {
+ privilegeModel := models.Privilege{}
+ privilegeId := this.GetString("privilege_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getPrivilegeFromPost(true)
+ _, err := privilegeModel.Update(privilegeId, data)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+ } else {
+ navigators, menus, _, err := privilegeModel.GetTypedPrivileges("1", "-1")
+ if err != nil {
+ this.jsonError(err, "")
+ }
+ privilege, err := privilegeModel.GetPrivilegeByPrivilegeId(privilegeId)
+ if err != nil {
+ this.jsonError(err, "")
+ }
+ if len(privilege) == 0 {
+ this.jsonError("权限不存在")
+ }
+ this.Data["privilege"] = privilege
+ this.Data["navigators"] = navigators
+ this.Data["menus"] = menus
+ this.Data["action"] = "edit"
+ this.viewLayout("privilege/form", "form")
+ }
+
+}
+func (this *PrivilegeController) getPrivilegeFromPost(isUpdate bool) (privilegeId string, privilege map[string]interface{}) {
+ parentId := 0
+ if this.GetString("type") == "menu" {
+ parentId, _ = this.GetInt("parent_n")
+ } else if this.GetString("type") == "controller" {
+ parentId, _ = this.GetInt("parent_m")
+ }
+ privilege = map[string]interface{}{
+ "name": this.GetString("name"),
+ "parent_id": parentId,
+ "type": this.GetString("type"),
+ "controller": this.GetString("controller"),
+ "action": this.GetString("action"),
+ "icon": this.GetString("icon"),
+ "is_display": this.GetString("is_display"),
+ "sequence": this.GetString("sequence"),
+ "target": this.GetString("target"),
+ }
+ err := validation.Errors{
+ "名称": validation.Validate(privilege["name"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("长度必须是1-15字符")),
+ "类型": validation.Validate(privilege["type"],
+ validation.Required.Error("不能为空"),
+ validation.In("navigator", "menu", "controller").Error("错误")),
+ "排序": validation.Validate(privilege["sequence"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^[1-9]{1}[0-9]*$")).Error("必须是大于0的数字")),
+ }.Filter()
+ if err != nil {
+ this.jsonError(err)
+ }
+ if isUpdate {
+ privilege["update_time"] = time.Now().Unix()
+ } else {
+ privilege["create_time"] = time.Now().Unix()
+ }
+ if this.GetString("type") != "controller" {
+ privilege["is_display"] = 1
+ }
+ return
+}
+
+// 权限列表
+func (this *PrivilegeController) List() {
+ privilegeModel := new(models.Privilege)
+
+ navigators, menus, controllers, err := privilegeModel.GetTypedPrivileges("1", "-1")
+ if err != nil {
+ this.viewError(err.Error())
+ }
+
+ this.Data["navigators"] = navigators
+ this.Data["menus"] = menus
+ this.Data["controllers"] = controllers
+
+ this.view("privilege/list")
+}
diff --git a/at-admin/app/controllers/role.go b/at-admin/app/controllers/role.go
new file mode 100644
index 0000000..719053f
--- /dev/null
+++ b/at-admin/app/controllers/role.go
@@ -0,0 +1,102 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/models"
+ "regexp"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+)
+
+type RoleController struct {
+ BaseAdminController
+}
+
+func (this *RoleController) Delete() {
+ roleModel := models.Role{}
+ roleId := this.GetString("role_id")
+ hasUser, err := roleModel.HasUser(roleId)
+ if err != nil {
+ this.jsonError(err)
+ }
+ if hasUser {
+ this.jsonError("角色用户非空,不能删除")
+ }
+ err = roleModel.Delete(roleId)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+
+}
+func (this *RoleController) Add() {
+ roleModel := models.Role{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getRoleFromPost(false)
+ _, err := roleModel.Insert(data)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+ } else {
+
+ this.Data["action"] = "add"
+ this.viewLayout("role/form", "form")
+ }
+
+}
+func (this *RoleController) Edit() {
+ roleModel := models.Role{}
+ roleId := this.GetString("role_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getRoleFromPost(true)
+ _, err := roleModel.Update(roleId, data)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+ } else {
+ role, err := roleModel.GetRoleByRoleId(roleId)
+ if err != nil {
+ this.jsonError(err, "")
+ }
+ if len(role) == 0 {
+ this.jsonError("角色不存在")
+ }
+ this.Data["role"] = role
+ this.Data["action"] = "edit"
+ this.viewLayout("role/form", "form")
+ }
+
+}
+
+func (this *RoleController) List() {
+ roleModel := models.Role{}
+
+ roles, err := roleModel.GetAllRoles()
+ if err != nil {
+ this.viewError(err.Error())
+ }
+
+ this.Data["roles"] = roles
+ this.view("role/list")
+}
+
+func (this *RoleController) getRoleFromPost(isUpdate bool) (roleId string, role map[string]interface{}) {
+ role = map[string]interface{}{
+ "name": this.GetString("name"),
+ "is_delete": 0,
+ }
+ err := validation.Validate(role["name"],
+ validation.Required.Error("名称不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("名称长度必须是1-15字符"))
+ if err != nil {
+ this.jsonError(err.Error())
+ }
+ if isUpdate {
+ role["update_time"] = time.Now().Unix()
+ } else {
+ role["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/controllers/role_privilege.go b/at-admin/app/controllers/role_privilege.go
new file mode 100644
index 0000000..c4e9324
--- /dev/null
+++ b/at-admin/app/controllers/role_privilege.go
@@ -0,0 +1,62 @@
+package controllers
+
+import "anytunnel/at-admin/app/models"
+
+type Role_PrivilegeController struct {
+ BaseAdminController
+}
+
+//角色授权
+func (this *Role_PrivilegeController) Add() {
+
+ roleId, err := this.GetInt("role_id", 0)
+ if roleId == 0 {
+ this.viewError("role_id is error! ")
+ }
+
+ rolePrivilegeModel := models.RolePrivilege{}
+ rolePrivileges, err := rolePrivilegeModel.GetRolePrivilegesByRoleId(roleId)
+ if err != nil {
+ this.viewError(err.Error())
+ }
+
+ privilegeModel := models.Privilege{}
+ navigators, menus, controllers, err := privilegeModel.GetTypedPrivileges("1", "-1")
+ if err != nil {
+ this.viewError(err.Error())
+ }
+
+ this.Data["navigators"] = navigators
+ this.Data["menus"] = menus
+ this.Data["controllers"] = controllers
+ this.Data["rolePrivileges"] = rolePrivileges
+ this.Data["privileges"] = rolePrivileges
+ this.Data["role_id"] = roleId
+
+ this.viewLayout("role/privilege", "form")
+}
+
+func (this *Role_PrivilegeController) Save() {
+
+ privilegeIds := this.GetStrings("privilege_id", []string{})
+ roleId, err := this.GetInt("role_id", 0)
+
+ if err != nil {
+ this.jsonError("角色授权失败:role_id error " + err.Error())
+ }
+ if roleId == 0 {
+ this.jsonError("角色授权失败:role_id is error!")
+ }
+ if len(privilegeIds) == 0 {
+ this.jsonError("角色授权失败:no select privilege!")
+ }
+
+ rolePrivilegeModel := models.RolePrivilege{}
+
+ res, err := rolePrivilegeModel.GrantRolePrivileges(roleId, privilegeIds)
+ if !res {
+ this.jsonError("角色授权失败:" + err.Error())
+ }
+
+ this.jsonSuccess("角色授权成功")
+}
diff --git a/at-admin/app/controllers/system.go b/at-admin/app/controllers/system.go
new file mode 100644
index 0000000..ebb3f9a
--- /dev/null
+++ b/at-admin/app/controllers/system.go
@@ -0,0 +1,11 @@
+package controllers
+
+type SystemController struct {
+ BaseAdminController
+}
+
+func (this *SystemController) Base() {
+ this.Layout = "layout/page.html"
+ this.TplName = "system/base.html"
+ this.Render()
+}
diff --git a/at-admin/app/controllers/user.go b/at-admin/app/controllers/user.go
new file mode 100644
index 0000000..1937c60
--- /dev/null
+++ b/at-admin/app/controllers/user.go
@@ -0,0 +1,299 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/models"
+ "anytunnel/at-admin/app/utils"
+ "regexp"
+ "strings"
+ "time"
+
+ "fmt"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+ "github.com/go-ozzo/ozzo-validation/is"
+)
+
+type UserController struct {
+ BaseAdminController
+}
+
+func (this *UserController) Forbidden() {
+ userModel := models.User{}
+ userId := this.GetString("user_id")
+ if userId == "1" {
+ this.jsonError("系统用户不能禁用")
+ }
+ err := userModel.Forbidden(userId)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+
+}
+
+func (this *UserController) Review() {
+ userModel := models.User{}
+ userId := this.GetString("user_id")
+ if userId == "1" {
+ this.jsonError("系统用户不能操作")
+ }
+ err := userModel.Review(userId)
+ if err != nil {
+ this.jsonError(err)
+ }
+ this.jsonSuccess("")
+
+}
+func (this *UserController) ChangePassword() {
+ userModel := models.User{}
+ if this.Ctx.Input.IsPost() {
+ newpassword := this.GetString("password")
+ oldpassword := this.GetString("password_old")
+ errs := validation.Errors{
+ "旧密码": validation.Validate(oldpassword,
+ validation.Required.Error("不能为空")),
+ "新密码": validation.Validate(newpassword,
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^([0-9]+[a-zA-Z]+[_]*){1,16}$")).Error("必须同时包含数字和字母,且1-15字符")),
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.jsonError(err)
+ }
+ err = userModel.ChangePassword(this.loginUser["user_id"], newpassword, oldpassword)
+ if err != nil {
+ this.jsonError("修改密码失败:" + err.Error())
+ }
+ this.jsonSuccess("")
+ } else {
+ this.viewLayout("user/changepassword", "form")
+ }
+}
+func (this *UserController) Add() {
+ userModel := models.User{}
+ roleModel := models.Role{}
+ userRoleModel := models.UserRole{}
+
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getUserFromPost(false)
+ username := this.GetString("username")
+ roleIds := this.GetStrings("role_ids", []string{})
+ if len(roleIds) == 0 {
+ this.jsonError("没有选择角色")
+ }
+ HasUsername, err := userModel.HasUsername(username)
+ if err != nil {
+ this.jsonError(err)
+ }
+ if HasUsername {
+ this.jsonError("用户名已经存在")
+ }
+ userId, err := userModel.Insert(data)
+ if err != nil {
+ this.jsonError("添加用户失败:" + err.Error())
+ }
+
+ //添加用户与角色对应关系
+ _, err = userRoleModel.Insert(utils.NewConvert().IntToString(userId, 10), roleIds)
+ if err != nil {
+ this.jsonError("添加用户角色失败:" + err.Error())
+ }
+
+ this.jsonSuccess("")
+ } else {
+
+ roles := []map[string]string{}
+ allRoles, _ := roleModel.GetAllRoles()
+ for _, allRole := range allRoles {
+ role := allRole
+ role["is_default"] = "0"
+ roles = append(roles, role)
+ }
+ this.Data["action"] = "add"
+ this.Data["roles"] = roles
+ this.viewLayout("user/form", "form")
+ }
+
+}
+func (this *UserController) Edit() {
+ userModel := models.User{}
+ roleModel := models.Role{}
+ userRoleModel := models.UserRole{}
+
+ userId := this.GetString("user_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getUserFromPost(true)
+ username := this.GetString("username")
+ roleIds := this.GetStrings("role_ids", []string{})
+ if len(roleIds) == 0 {
+ this.jsonError("没有选择角色")
+ }
+ HasSameUsername, err := userModel.HasSameUsername(userId, username)
+ if err != nil {
+ this.jsonError(err)
+ }
+ if HasSameUsername {
+ this.jsonError("用户名已经存在")
+ }
+ _, err = userModel.Update(userId, data)
+ if err != nil {
+ this.jsonError("修改用户失败:" + err.Error())
+ }
+
+ //添加用户与角色对应关系
+ _, err = userRoleModel.Insert(userId, roleIds)
+ if err != nil {
+ this.jsonError("修改用户角色失败:" + err.Error())
+ }
+
+ this.jsonSuccess("")
+ } else {
+ roles := []map[string]string{}
+ user, err := userModel.GetUserByUserId(userId)
+ allRoles, _ := roleModel.GetAllRoles()
+ userRoles, _ := userRoleModel.GetUserRolesByUserId(userId)
+ for _, allRole := range allRoles {
+ role := allRole
+ if len(userRoles) == 0 {
+ role["is_default"] = "0"
+ } else {
+ for _, userRoles := range userRoles {
+ if allRole["role_id"] == userRoles["role_id"] {
+ role["is_default"] = "1"
+ break
+ }
+ role["is_default"] = "0"
+ }
+ }
+ roles = append(roles, role)
+ }
+ if err != nil {
+ this.jsonError(err, "")
+ }
+ if len(user) == 0 {
+ this.jsonError("用户不存在")
+ }
+ this.Data["user"] = user
+ this.Data["roles"] = roles
+ this.Data["action"] = "edit"
+ this.viewLayout("user/form", "form")
+ }
+
+}
+func (this *UserController) getUserFromPost(isUpdate bool) (userId string, user map[string]interface{}) {
+ userModel := models.User{}
+ user = map[string]interface{}{
+ "username": this.GetString("username"),
+ "given_name": this.GetString("given_name"),
+ "email": this.GetString("email"),
+ "mobile": this.GetString("mobile"),
+ }
+ errs := validation.Errors{
+ "手机号": validation.Validate(user["mobile"],
+ validation.Match(regexp.MustCompile("^1[3|4|5|7|8][0-9]{9}$")).Error("格式错误")),
+ "邮箱": validation.Validate(user["email"],
+ validation.Required.Error("不能为空"),
+ is.Email.Error("格式错误")),
+ "姓名": validation.Validate(user["given_name"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("长度必须是1-15字符")),
+
+ //"角色": validation.Validate(user["role_ids"]),
+ // validation.Required.Error("没有选择角色"),
+ }
+ if !isUpdate {
+ errs["用户名"] = validation.Validate(user["username"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^[0-9_a-zA-Z]{1,15}$")).Error("只能包含数字字母和下划线,且1-15字符"))
+ // errs["密码"] = validation.Validate(this.GetString("password"),
+ // validation.Required.Error("不能为空"),
+ // validation.Match(regexp.MustCompile("^([0-9]+[a-zA-Z]+[_]*){1,16}$")).Error("必须同时包含数字和字母,且1-15字符"))
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.jsonError(err)
+ }
+ if isUpdate {
+ // if this.GetString("password") != "" {
+ // user["password"] = userModel.EncodePassword(this.GetString("password"))
+ // }
+ user["update_time"] = time.Now().Unix()
+ delete(user, "username")
+ } else {
+ user["is_forbidden"] = 0
+ user["password"] = userModel.EncodePassword(this.GetString("password"))
+ user["create_time"] = time.Now().Unix()
+ }
+ return
+}
+
+func (this *UserController) List() {
+
+ keyword := strings.Trim(this.GetString("keyword", ""), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ userModel := models.User{}
+ var users = []map[string]string{}
+ var userCount = 0
+
+ if keyword == "" {
+ userCount, err = userModel.CountUsers()
+ users, err = userModel.GetUsersByLimit(limit, pageSize)
+ } else {
+ userCount, err = userModel.CountUsersByKeyword(keyword)
+ users, err = userModel.GetUsersByKeywordAndLimit(keyword, limit, pageSize)
+ }
+ if err != nil {
+ this.viewError(err.Error())
+ }
+
+ roleModel := models.Role{}
+ userRoles := map[string]string{}
+
+ //用户角色
+ for _, user := range users {
+ userId := user["user_id"]
+ var names = ""
+ roles, err := roleModel.GetRolesByUserId(userId)
+ if err != nil {
+ this.viewError(err.Error())
+ }
+ for _, role := range roles {
+ names += "," + role["name"]
+ }
+ userRoles[user["user_id"]] = strings.Replace(names, ",", "", 1)
+ }
+
+ this.Data["users"] = users
+ this.Data["userRoles"] = userRoles
+ this.Data["keyword"] = keyword
+ this.Data["page"] = utils.NewMisc().Page(userCount, page, pageSize, "/user/list?page={page}")
+ this.viewLayoutTitle("用户列表", "user/list", "form")
+}
+
+//个人资料
+func (this *UserController) Profile() {
+
+ userModel := models.User{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getUserFromPost(true)
+ fmt.Println(data)
+ userId := this.GetString("user_id")
+ _, err := userModel.Update(userId, data)
+ if err != nil {
+ this.jsonError("修改个人资料失败:" + err.Error())
+ }
+ this.jsonSuccess("")
+
+ } else {
+ user := this.GetSession("author").(map[string]string)
+ this.Data["user"] = user
+ this.viewLayout("user/profile", "form")
+ }
+}
diff --git a/at-admin/app/models/init.go b/at-admin/app/models/init.go
new file mode 100644
index 0000000..417672f
--- /dev/null
+++ b/at-admin/app/models/init.go
@@ -0,0 +1,44 @@
+package models
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/astaxie/beego"
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+var G *mysql.DBGroup
+
+func init() {
+ host := beego.AppConfig.String("db_host")
+ port, _ := beego.AppConfig.Int("db_port")
+ user := beego.AppConfig.String("db_user")
+ pass := beego.AppConfig.String("db_pass")
+ dbname := beego.AppConfig.String("db_name")
+ dbTablePrefix := beego.AppConfig.String("db_table_prefix")
+ maxIdle, _ := beego.AppConfig.Int("db_conn_max_idle")
+ maxConn, _ := beego.AppConfig.Int("db_conn_max_connection")
+ G = mysql.NewDBGroup("default")
+ cfg := mysql.NewDBConfigWith(host, port, dbname, user, pass)
+ cfg.SetMaxIdleConns = maxIdle
+ cfg.SetMaxOpenConns = maxConn
+ cfg.TablePrefix = dbTablePrefix
+ cfg.TablePrefixSqlIdentifier = "__PREFIX__"
+
+ //add database anytunnel_system
+ err := G.Regist("default", cfg)
+ if err != nil {
+ beego.Error(fmt.Errorf("regist db error:%s,with config : %v", err, cfg))
+ os.Exit(100)
+ }
+
+ //add database anytunnel_base
+ cfg.Database = beego.AppConfig.String("db.base.name")
+ cfg.TablePrefix = beego.AppConfig.String("db.base.table_prefix")
+ err = G.Regist("base", cfg)
+ if err != nil {
+ beego.Error(fmt.Errorf("regist db error:%s,with config : %v", err, cfg))
+ os.Exit(100)
+ }
+}
diff --git a/at-admin/app/models/privilege.go b/at-admin/app/models/privilege.go
new file mode 100644
index 0000000..f779886
--- /dev/null
+++ b/at-admin/app/models/privilege.go
@@ -0,0 +1,127 @@
+package models
+
+import "github.com/snail007/go-activerecord/mysql"
+
+type Privilege struct {
+}
+
+func (p *Privilege) GetTypedPrivileges(userId string, isDisplay string) (navigators, menus, controllers []map[string]string, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ if userId != "1" {
+ roldIds := []string{}
+ rs, err = db.Query(db.AR().Select("role_id").From("user_role").Where(map[string]interface{}{
+ "user_id": userId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ roldIds = rs.Values("role_id")
+
+ privilegeIds := []string{}
+ rs, err = db.Query(db.AR().Select("privilege_id").From("role_privilege").Where(map[string]interface{}{
+ "role_id": roldIds,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ privilegeIds = rs.Values("privilege_id")
+
+ rs, err = db.Query(db.AR().From("privilege").Where(map[string]interface{}{
+ "privilege_id": privilegeIds,
+ }).OrderBy("parent_id", "ASC").
+ OrderBy("sequence", "ASC"))
+
+ if err != nil {
+ return
+ }
+ } else {
+ rs, err = db.Query(db.AR().From("privilege").OrderBy("parent_id", "ASC").OrderBy("sequence", "ASC"))
+ if err != nil {
+ return
+ }
+ }
+ navigators = []map[string]string{}
+ menus = []map[string]string{}
+ controllers = []map[string]string{}
+ allPrivileges := rs.MapRows("privilege_id")
+ for _, row := range rs.Rows() {
+ if isDisplay != "-1" {
+ if row["is_display"] != isDisplay {
+ continue
+ }
+ }
+ switch row["type"] {
+ case "navigator":
+ navigators = append(navigators, row)
+ case "menu":
+ row["parent"] = allPrivileges[row["parent_id"]]["name"]
+ menus = append(menus, row)
+ case "controller":
+ row["parent"] = allPrivileges[row["parent_id"]]["name"]
+ controllers = append(controllers, row)
+ }
+ }
+ return
+}
+func (p *Privilege) GetPrivilegeByPrivilegeId(privilegeId string) (privilege map[string]string, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("privilege").Where(map[string]interface{}{
+ "privilege_id": privilegeId,
+ }))
+ if err != nil {
+ return
+ }
+ privilege = rs.Row()
+ return
+}
+func (p *Privilege) HasSub(privilegeId string) (has bool, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("privilege").Where(map[string]interface{}{
+ "parent_id": privilegeId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Privilege) Delete(privilegeId string) (err error) {
+ db := G.DB()
+ _, err = db.Exec(db.AR().Delete("privilege", map[string]interface{}{
+ "privilege_id": privilegeId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Privilege) Insert(privilege map[string]interface{}) (id int64, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("privilege", privilege))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Privilege) Update(privilegeId string, privilege map[string]interface{}) (id int64, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("privilege", privilege, map[string]interface{}{
+ "privilege_id": privilegeId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
diff --git a/at-admin/app/models/role.go b/at-admin/app/models/role.go
new file mode 100644
index 0000000..dca605d
--- /dev/null
+++ b/at-admin/app/models/role.go
@@ -0,0 +1,98 @@
+package models
+
+import "github.com/snail007/go-activerecord/mysql"
+
+type Role struct {
+}
+
+func (p *Role) GetRoleByRoleId(roleId string) (role map[string]string, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("role").Where(map[string]interface{}{
+ "role_id": roleId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ role = rs.Row()
+ return
+}
+func (p *Role) HasUser(roleId string) (has bool, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user_role").Where(map[string]interface{}{
+ "role_id": roleId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Role) Delete(roleId string) (err error) {
+ db := G.DB()
+ _, err = db.Exec(db.AR().Update("role", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Role) Insert(role map[string]interface{}) (id int64, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("role", role))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Role) Update(roleId string, role map[string]interface{}) (id int64, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("role", role, map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//获取所有的角色
+func (this *Role) GetAllRoles() (roles []map[string]string, err error) {
+
+ db := G.DB();
+ res, err := db.Query(db.AR().From("role").OrderBy("role_id", "ASC"));
+ if(err != nil) {
+ return
+ }
+ roles = res.Rows()
+ return
+}
+
+// 根据用户名查找所有的角色
+func (this *Role) GetRolesByUserId (userId string) (roles []map[string]string, err error) {
+
+ userRoleModel := UserRole{}
+ userRoles, err := userRoleModel.GetUserRolesByUserId(userId)
+ if(err != nil) {
+ return
+ }
+
+ for _, userRole := range userRoles {
+ role, _ := this.GetRoleByRoleId(userRole["role_id"])
+ roles = append(roles, role)
+ }
+
+ return
+}
\ No newline at end of file
diff --git a/at-admin/app/models/role_privilege.go b/at-admin/app/models/role_privilege.go
new file mode 100644
index 0000000..34e6d93
--- /dev/null
+++ b/at-admin/app/models/role_privilege.go
@@ -0,0 +1,56 @@
+package models
+
+type RolePrivilege struct {
+ RolePrivilegeID uint `orm:"pk"` // role_privilege_id
+ RoleID uint // role_id
+ PrivilegeID uint // privilege_id
+ IsDelete int8 // is_delete
+ CreateTime uint // create_time
+ UpdateTime uint // update_time
+
+}
+
+//根据 role_id 获取权限
+func (rolePrivilege *RolePrivilege) GetRolePrivilegesByRoleId(roleId int) (rolePrivileges []map[string]string, err error) {
+
+ db := G.DB()
+ res, err := db.Query(db.AR().From("role_privilege").Where(map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if(err != nil) {
+ return
+ }
+
+ rolePrivileges = res.Rows()
+ return
+}
+
+//角色授权
+func (rolePrivilege *RolePrivilege) GrantRolePrivileges(roleId int, privilegeIds []string) (res bool, err error) {
+
+ res = false
+ db := G.DB()
+ //先删除
+ _, err = db.Exec(db.AR().Delete("role_privilege", map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if(err != nil) {
+ return
+ }
+
+ rolePrivileges := []map[string]interface{}{}
+ for _, privilegeId := range privilegeIds {
+ rolePrivilege := map[string]interface{}{
+ "role_id": roleId,
+ "privilege_id": privilegeId,
+ }
+ rolePrivileges = append(rolePrivileges, rolePrivilege)
+ }
+ //批量插入
+ _, err = db.Exec(db.AR().InsertBatch("role_privilege", rolePrivileges))
+ if err != nil {
+ return
+ }
+ res = true
+ return
+}
\ No newline at end of file
diff --git a/at-admin/app/models/user.go b/at-admin/app/models/user.go
new file mode 100644
index 0000000..2a5d5fb
--- /dev/null
+++ b/at-admin/app/models/user.go
@@ -0,0 +1,206 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+ "crypto/md5"
+ "encoding/hex"
+ "errors"
+ "strings"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type User struct {
+}
+
+func (p *User) GetUserByUserId(userId string) (user map[string]string, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ user = rs.Row()
+ return
+}
+
+func (p *User) HasSameUsername(userId, username string) (has bool, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "user_id <>": userId,
+ "username": username,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *User) HasUsername(username string) (has bool, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "username": username,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *User) GetUserByName(username string) (user map[string]string, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "username": username,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ user = rs.Row()
+ return
+}
+
+//禁用
+func (p *User) Forbidden(userId string) (err error) {
+ db := G.DB()
+ _, err = db.Exec(db.AR().Update("user", map[string]interface{}{
+ "is_forbidden": 1,
+ }, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+
+//恢复
+func (p *User) Review(userId string) (err error) {
+ db := G.DB()
+ _, err = db.Exec(db.AR().Update("user", map[string]interface{}{
+ "is_forbidden": 0,
+ }, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+
+func (p *User) Insert(user map[string]interface{}) (id int64, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("user", user))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *User) Update(userId string, user map[string]interface{}) (id int64, err error) {
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("user", user, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *User) ChangePassword(userId, newpassword, oldpassword string) (err error) {
+ db := G.DB()
+ user, err := p.GetUserByUserId(userId)
+ if user["password"] != p.EncodePassword(oldpassword) {
+ return errors.New("旧密码错误")
+ }
+ if err != nil {
+ return
+ }
+ _, err = db.Exec(db.AR().Update("user", map[string]interface{}{
+ "password": p.EncodePassword(newpassword),
+ }, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *User) EncodePassword(password string) (passwordHash string) {
+ hasher := md5.New()
+ hasher.Write([]byte(password))
+ passwordHash = strings.ToLower(hex.EncodeToString(hasher.Sum(nil)))
+ return
+}
+
+//根据关键字分页获取用户
+func (user *User) GetUsersByKeywordAndLimit(keyword string, limit int, number int) (users []map[string]string, err error) {
+
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "username LIKE": "%" + keyword + "%",
+ }).Limit(limit, number))
+ if err != nil {
+ return
+ }
+ users = rs.Rows()
+
+ return
+}
+
+//分页获取用户
+func (user *User) GetUsersByLimit(limit int, number int) (users []map[string]string, err error) {
+
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ users = rs.Rows()
+
+ return
+}
+
+func (user *User) CountUsers() (count int, err error) {
+
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").From("user"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (user *User) CountUsersByKeyword(keyword string) (count int, err error) {
+
+ db := G.DB()
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("user").
+ Where(map[string]interface{}{
+ "username LIKE": "%" + keyword + "%",
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/models/user_role.go b/at-admin/app/models/user_role.go
new file mode 100644
index 0000000..b9bfd15
--- /dev/null
+++ b/at-admin/app/models/user_role.go
@@ -0,0 +1,64 @@
+package models
+
+import (
+ "github.com/snail007/go-activerecord/mysql"
+ "time"
+)
+
+type UserRole struct {
+ UserRoleID uint `orm:"pk"` // user_role_id
+ UserID uint64 // user_id
+ RoleID uint // role_id
+ IsDelete int8 // is_delete
+ CreateTime uint // create_time
+ UpdateTime uint // update_time
+}
+
+func (this *UserRole) GetUserRolesByUserId(userId string) (userRoles []map[string]string, err error) {
+
+ db := G.DB();
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user_role").Where(map[string]interface{}{
+ "user_id": userId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ userRoles = rs.Rows()
+
+ return
+}
+
+// 插入 user_id 和 role_id 对应关系
+func (this *UserRole) Insert(userId string, roleIds []string) (res bool, err error) {
+
+ res = false
+ db := G.DB()
+ //先删除
+ _, err = db.Exec(db.AR().Delete("user_role", map[string]interface{}{
+ "user_id": userId,
+ }))
+ if(err != nil) {
+ return
+ }
+ //添加
+ userRoles := []map[string]interface{}{}
+ for _, roleId := range roleIds {
+ userRole := map[string]interface{}{
+ "role_id" : roleId,
+ "user_id" : userId,
+ "is_delete" : 0,
+ "create_time": time.Now().Unix(),
+ "update_time": time.Now().Unix(),
+ }
+ userRoles = append(userRoles, userRole)
+ }
+
+ _, err = db.Exec(db.AR().InsertBatch("user_role", userRoles))
+ if err != nil {
+ return
+ }
+ res = true
+ return
+}
\ No newline at end of file
diff --git a/at-admin/app/modules/web/controllers/area.go b/at-admin/app/modules/web/controllers/area.go
new file mode 100644
index 0000000..c581126
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/area.go
@@ -0,0 +1,135 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "fmt"
+ "strings"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+)
+
+type AreaController struct {
+ BaseController
+}
+
+func (this *AreaController) Delete() {
+ areaModel := models.Area{}
+ areaId := this.GetString("area_id")
+ err := areaModel.Delete(areaId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *AreaController) Add() {
+ areaModel := models.Area{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getAreaFromPost(false)
+ _, err := areaModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ regionModel := models.Region{}
+ regions, err := regionModel.GetSubRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["action"] = "add"
+ this.viewLayout("area/form", "form")
+ }
+
+}
+func (this *AreaController) Edit() {
+ areaModel := models.Area{}
+ areaId := this.GetString("area_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getAreaFromPost(true)
+ _, err := areaModel.Update(areaId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ area, err := areaModel.GetAreaByAreaId(areaId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(area) == 0 {
+ this.ViewError("Area不存在")
+ }
+ regionModel := models.Region{}
+ regions, err := regionModel.GetSubRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["area"] = area
+ this.Data["action"] = "edit"
+ this.viewLayout("area/form", "form")
+ }
+
+}
+func (this *AreaController) List() {
+ column := strings.Trim(this.GetString("type", ""), " ")
+ keyword := strings.Trim(this.GetString("id", ""), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ areaModel := models.Area{}
+ var areas = []map[string]string{}
+ var areaCount = 0
+
+ if keyword == "" {
+ areaCount, err = areaModel.CountAreas()
+ areas, err = areaModel.GetAreasByLimit(limit, pageSize)
+ } else {
+ areaCount, err = areaModel.CountAreasByID(column, keyword)
+ areas, err = areaModel.GetAreasByIDAndLimit(column, keyword, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["areas"] = areas
+ this.Data["page"] = utils.NewMisc().Page(areaCount, page, pageSize, fmt.Sprintf("/web/area/list?page={page}&type=%s&id=%s", column, keyword))
+ this.viewLayoutTitle("用户列表", "area/list", "form")
+}
+func (this *AreaController) getAreaFromPost(isUpdate bool) (areaId string, area map[string]interface{}) {
+ area = map[string]interface{}{
+ "name": this.GetString("name"),
+ "cs_type": this.GetString("cs_type"),
+ "is_forbidden": this.GetString("is_forbidden"),
+ }
+ errs := validation.Errors{
+ "区域名称": validation.Validate(area["name"],
+ validation.Required.Error("不能为空")),
+ "类型": validation.Validate(area["cs_type"],
+ validation.Required.Error("不能为空"),
+ validation.In("server", "client").Error("错误"),
+ ),
+ "访问控制": validation.Validate(area["is_forbidden"],
+ validation.Required.Error("不能为空"),
+ validation.In("0", "1").Error("错误"),
+ ),
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.JsonError(err)
+ }
+ if isUpdate {
+ area["update_time"] = time.Now().Unix()
+ } else {
+ area["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/base.go b/at-admin/app/modules/web/controllers/base.go
new file mode 100644
index 0000000..507c109
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/base.go
@@ -0,0 +1,24 @@
+package controllers
+
+import (
+ system "anytunnel/at-admin/app/controllers"
+)
+
+const moduleName = "web"
+
+type BaseController struct {
+ system.BaseAdminController
+}
+
+func (this *BaseController) viewLayoutTitle(title, viewName, layout string) {
+ this.ViewLayoutTitle(moduleName, title, viewName, layout)
+}
+func (this *BaseController) viewLayout(viewName, layout string) {
+ this.ViewLayout(moduleName, viewName, layout)
+}
+func (this *BaseController) view(viewName string) {
+ this.View(moduleName, viewName)
+}
+func (this *BaseController) viewTitle(title, viewName string) {
+ this.ViewTitle(moduleName, title, viewName)
+}
diff --git a/at-admin/app/modules/web/controllers/client.go b/at-admin/app/modules/web/controllers/client.go
new file mode 100644
index 0000000..1f8c551
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/client.go
@@ -0,0 +1,148 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "regexp"
+ "strings"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+)
+
+type ClientController struct {
+ BaseController
+}
+
+func (this *ClientController) Reset() {
+ clientModel := models.Client{}
+ clientId := this.GetString("client_id")
+ err := clientModel.Offline(clientId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ err = clientModel.Reset(clientId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+}
+func (this *ClientController) Delete() {
+ clientModel := models.Client{}
+ clientId := this.GetString("client_id")
+ hasTunnel, err := clientModel.HasTunnelRef(clientId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if hasTunnel {
+ this.JsonError("Tunnel引用,不能删除")
+ }
+ err = clientModel.Delete(clientId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *ClientController) Add() {
+ clientModel := models.Client{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getClientFromPost(false)
+ _, err := clientModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ this.Data["action"] = "add"
+ this.viewLayout("client/form", "form")
+ }
+
+}
+func (this *ClientController) Edit() {
+ clientModel := models.Client{}
+ clientId := this.GetString("client_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getClientFromPost(true)
+ _, err := clientModel.Update(clientId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ client, err := clientModel.GetClientByClientId(clientId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(client) == 0 {
+ this.ViewError("Client不存在")
+ }
+ this.Data["client"] = client
+ this.Data["action"] = "edit"
+ this.viewLayout("client/form", "form")
+ }
+
+}
+
+func (this *ClientController) List() {
+
+ userID := strings.Trim(this.GetString("user_id"), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ clientModel := models.Client{}
+ var clients = []map[string]string{}
+ var clientCount = 0
+
+ if userID == "" {
+ clientCount, err = clientModel.CountClients()
+ clients, err = clientModel.GetClientsByLimit(limit, pageSize)
+ } else {
+ clientCount, err = clientModel.CountClientsByUserID(userID)
+ clients, err = clientModel.GetClientsByUserIDAndLimit(userID, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["userID"] = userID
+ this.Data["clients"] = clients
+ this.Data["page"] = utils.NewMisc().Page(clientCount, page, pageSize, "/web/client/list?page={page}&user_id="+userID)
+ this.viewLayoutTitle("Client列表", "client/list", "form")
+}
+func (this *ClientController) getClientFromPost(isUpdate bool) (clientId string, client map[string]interface{}) {
+ port, _ := this.GetInt("local_port")
+ client = map[string]interface{}{
+ "name": this.GetString("name"),
+ "local_host": this.GetString("local_host"),
+ "local_port": port,
+ "user_id": 0,
+ "is_delete": 0,
+ }
+ errs := validation.Errors{
+ "名称": validation.Validate(client["name"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("名称长度必须是1-15字符")),
+ "本地网络Host": validation.Validate(client["local_host"],
+ validation.Required.Error("不能为空")),
+ "本地网络端口": validation.Validate(client["local_port"],
+ validation.Required.Error("不能为空"),
+ validation.Min(1).Error("最小值1"),
+ validation.Max(65535).Error("最大值65535")),
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.JsonError(err)
+ }
+ if isUpdate {
+ client["update_time"] = time.Now().Unix()
+ } else {
+ client["token"] = utils.NewMisc().RandString(32)
+ client["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/cluster.go b/at-admin/app/modules/web/controllers/cluster.go
new file mode 100644
index 0000000..769fcbe
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/cluster.go
@@ -0,0 +1,202 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ common "anytunnel/at-common"
+ "encoding/json"
+ "fmt"
+ "regexp"
+ "time"
+
+ "github.com/astaxie/beego"
+ validation "github.com/go-ozzo/ozzo-validation"
+ is "github.com/go-ozzo/ozzo-validation/is"
+)
+
+type ClusterController struct {
+ BaseController
+}
+
+func (this *ClusterController) Statistic() {
+ clusterID := this.GetString("cluster_id")
+ if this.Ctx.Input.IsGet() {
+ this.Data["clusterID"] = clusterID
+ this.viewLayout("cluster/statistic", "default")
+ } else {
+ clusterModel := models.Cluster{}
+ cluster, err := clusterModel.GetClusterByClusterId(clusterID)
+ if err != nil {
+ this.JsonError(err)
+ }
+ clusterIP := cluster["ip"]
+ url := fmt.Sprintf("https://%s:%s/traffic/count", clusterIP, beego.AppConfig.String("cluster.api.port"))
+ body, _, err := common.HttpGet(url)
+ if err != nil {
+ this.JsonError(err)
+ }
+ status := map[string]interface{}{}
+ err = json.Unmarshal(body, &status)
+ if err != nil {
+ this.JsonError(err)
+ }
+ _data, ok := status["data"]
+ if !ok {
+ this.JsonError("no data")
+ }
+ data := _data.(map[string]interface{})
+ rs, err := models.DB.Query(models.DB.AR().From("cluster").Where(map[string]interface{}{
+ "cluster_id": clusterID,
+ }))
+ if err != nil {
+ this.JsonError(err)
+ }
+ if rs.Len() == 0 {
+ this.JsonError("no cluster")
+ }
+ data["cluster"] = rs.Row()
+ status["data"] = data
+ bytes, _ := json.Marshal(status)
+ this.Ctx.WriteString(string(bytes))
+ }
+
+}
+func (this *ClusterController) Forbidden() {
+ clusterModel := models.Cluster{}
+ clusterId := this.GetString("cluster_id")
+ err := clusterModel.Forbidden(clusterId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+
+func (this *ClusterController) Review() {
+ clusterModel := models.Cluster{}
+ clusterId := this.GetString("cluster_id")
+ err := clusterModel.Review(clusterId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+
+func (this *ClusterController) Delete() {
+ clusterModel := models.Cluster{}
+ clusterId := this.GetString("cluster_id")
+ HasTunnel, err := clusterModel.HasTunnel(clusterId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if HasTunnel {
+ this.JsonError("Tunnel引用非空,不能删除")
+ }
+ err = clusterModel.Delete(clusterId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *ClusterController) Add() {
+ clusterModel := models.Cluster{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getClusterFromPost(false)
+ _, err := clusterModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ regionModel := models.Region{}
+ regions, err := regionModel.GetSubRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["action"] = "add"
+ this.viewLayout("cluster/form", "form")
+ }
+
+}
+func (this *ClusterController) Edit() {
+ clusterModel := models.Cluster{}
+ clusterId := this.GetString("cluster_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getClusterFromPost(true)
+ _, err := clusterModel.Update(clusterId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ cluster, err := clusterModel.GetClusterByClusterId(clusterId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(cluster) == 0 {
+ this.ViewError("Cluster不存在")
+ }
+ regionModel := models.Region{}
+ regions, err := regionModel.GetSubRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["cluster"] = cluster
+ this.Data["action"] = "edit"
+ this.viewLayout("cluster/form", "form")
+ }
+
+}
+
+func (this *ClusterController) List() {
+ clusterModel := models.Cluster{}
+
+ clusters, err := clusterModel.GetAllClusters()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ regionModel := models.Region{}
+ regions, err := regionModel.GetSubRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ r := map[string]string{
+ "region_id": "0",
+ }
+ regions = append(regions, r)
+ this.Data["regions"] = regions
+ this.Data["clusters"] = clusters
+ this.view("cluster/list")
+}
+
+func (this *ClusterController) getClusterFromPost(isUpdate bool) (clusterId string, cluster map[string]interface{}) {
+ cluster = map[string]interface{}{
+ "name": this.GetString("name"),
+ "ip": this.GetString("ip"),
+ "region_id": this.GetString("region_id"),
+ }
+ errs := validation.Errors{
+ "名称": validation.Validate(cluster["name"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("长度必须是1-15字符")),
+ "IP": validation.Validate(cluster["ip"],
+ validation.Required.Error("不能为空"),
+ is.IPv4),
+ "区域": validation.Validate(cluster["region_id"],
+ validation.Match(regexp.MustCompile("^[1-9][0-9]*$")).Error("格式错误")),
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.JsonError(err)
+ }
+ if isUpdate {
+ cluster["update_time"] = time.Now().Unix()
+ } else {
+ cluster["is_disable"] = 1
+ cluster["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/conn.go b/at-admin/app/modules/web/controllers/conn.go
new file mode 100644
index 0000000..4b23248
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/conn.go
@@ -0,0 +1,50 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "fmt"
+ "strings"
+)
+
+type ConnController struct {
+ BaseController
+}
+
+func (this *ConnController) List() {
+ orderBy := strings.Trim(this.GetString("orderby"), " ")
+ if orderBy == "" {
+ orderBy = "count"
+ }
+ col := strings.Trim(this.GetString("col"), " ")
+ keyword := strings.Trim(this.GetString("keyword"), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ connModel := models.Conn{}
+ var conns = []map[string]string{}
+ var connCount = 0
+ if keyword == "" {
+ connCount, err = connModel.CountConns()
+ conns, err = connModel.GetConnsByLimit(limit, pageSize, orderBy)
+ } else {
+ connCount, err = connModel.CountConnsByUserID(col, keyword)
+ conns, err = connModel.GetConnsByUserIDAndLimit(col, keyword, orderBy, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+
+ this.Data["conns"] = conns
+ this.Data["col"] = col
+ this.Data["keyword"] = keyword
+ this.Data["orderby"] = orderBy
+ this.Data["p"] = page
+ this.Data["page"] = utils.NewMisc().Page(connCount, page, pageSize, fmt.Sprintf("/web/conn/list?page={page}&col=%s&keyword=%s&orderby=%s", col, keyword, orderBy))
+ this.viewLayoutTitle("隧道连接数列表", "conn/list", "form")
+}
diff --git a/at-admin/app/modules/web/controllers/ip_list.go b/at-admin/app/modules/web/controllers/ip_list.go
new file mode 100644
index 0000000..0b6a00c
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/ip_list.go
@@ -0,0 +1,137 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "fmt"
+ "strings"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+ "github.com/go-ozzo/ozzo-validation/is"
+)
+
+type IpListController struct {
+ BaseController
+}
+
+func (this *IpListController) Delete() {
+ ip_listModel := models.IpList{}
+ ip_listId := this.GetString("ip_list_id")
+ err := ip_listModel.Delete(ip_listId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *IpListController) Add() {
+ ip_listModel := models.IpList{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getIpListFromPost(false)
+ _, err := ip_listModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ regionModel := models.Region{}
+ regions, err := regionModel.GetSubRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["action"] = "add"
+ this.viewLayout("ip_list/form", "form")
+ }
+
+}
+func (this *IpListController) Edit() {
+ ip_listModel := models.IpList{}
+ ip_listId := this.GetString("ip_list_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getIpListFromPost(true)
+ _, err := ip_listModel.Update(ip_listId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ ip_list, err := ip_listModel.GetIpListByIpListId(ip_listId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(ip_list) == 0 {
+ this.ViewError("IpList不存在")
+ }
+ regionModel := models.Region{}
+ regions, err := regionModel.GetSubRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["ip_list"] = ip_list
+ this.Data["action"] = "edit"
+ this.viewLayout("ip_list/form", "form")
+ }
+
+}
+func (this *IpListController) List() {
+ column := strings.Trim(this.GetString("type", ""), " ")
+ keyword := strings.Trim(this.GetString("id", ""), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ ip_listModel := models.IpList{}
+ var ip_lists = []map[string]string{}
+ var ip_listCount = 0
+
+ if keyword == "" {
+ ip_listCount, err = ip_listModel.CountIpLists()
+ ip_lists, err = ip_listModel.GetIpListsByLimit(limit, pageSize)
+ } else {
+ ip_listCount, err = ip_listModel.CountIpListsByID(column, keyword)
+ ip_lists, err = ip_listModel.GetIpListsByIDAndLimit(column, keyword, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["ip_lists"] = ip_lists
+ this.Data["page"] = utils.NewMisc().Page(ip_listCount, page, pageSize, fmt.Sprintf("/web/ip_list/list?page={page}&type=%s&id=%s", column, keyword))
+ this.viewLayoutTitle("用户列表", "ip_list/list", "form")
+}
+func (this *IpListController) getIpListFromPost(isUpdate bool) (ip_listId string, ip_list map[string]interface{}) {
+ ip_list = map[string]interface{}{
+ "ip": this.GetString("ip"),
+ "cs_type": this.GetString("cs_type"),
+ "is_forbidden": this.GetString("is_forbidden"),
+ }
+ errs := validation.Errors{
+ "IP": validation.Validate(ip_list["ip"],
+ validation.Required.Error("不能为空"),
+ is.IPv4.Error("格式错误")),
+ "类型": validation.Validate(ip_list["cs_type"],
+ validation.Required.Error("不能为空"),
+ validation.In("server", "client").Error("错误"),
+ ),
+ "访问控制": validation.Validate(ip_list["is_forbidden"],
+ validation.Required.Error("不能为空"),
+ validation.In("0", "1").Error("错误"),
+ ),
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.JsonError(err)
+ }
+ if isUpdate {
+ ip_list["update_time"] = time.Now().Unix()
+ } else {
+ ip_list["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/online.go b/at-admin/app/modules/web/controllers/online.go
new file mode 100644
index 0000000..4f0fa64
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/online.go
@@ -0,0 +1,44 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "fmt"
+ "strings"
+)
+
+type OnlineController struct {
+ BaseController
+}
+
+func (this *OnlineController) List() {
+ cs := strings.Trim(this.GetString("cs", ""), " ")
+ column := strings.Trim(this.GetString("type", ""), " ")
+ keyword := strings.Trim(this.GetString("keyword", ""), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ onlineModel := models.Online{}
+ var onlines = []map[string]string{}
+ var onlineCount = 0
+
+ if keyword == "" {
+ onlineCount, err = onlineModel.CountOnlines(cs)
+ onlines, err = onlineModel.GetOnlinesByLimit(cs, limit, pageSize)
+ } else {
+ onlineCount, err = onlineModel.CountOnlinesByID(cs, column, keyword)
+ onlines, err = onlineModel.GetOnlinesByIDAndLimit(cs, column, keyword, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["cs"] = cs
+ this.Data["onlines"] = onlines
+ this.Data["page"] = utils.NewMisc().Page(onlineCount, page, pageSize, fmt.Sprintf("/web/online/list?page={page}&type=%s&keyword=%s&cs=%s", column, keyword, cs))
+ this.viewLayoutTitle(cs+"列表", "online/list", "form")
+}
diff --git a/at-admin/app/modules/web/controllers/package.go b/at-admin/app/modules/web/controllers/package.go
new file mode 100644
index 0000000..3bda8e5
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/package.go
@@ -0,0 +1,135 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "fmt"
+ "regexp"
+ "strings"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+)
+
+type PackageController struct {
+ BaseController
+}
+
+func (this *PackageController) List() {
+ column := "user_id"
+ keyword := strings.Trim(this.GetString("keyword", ""), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ packageModel := models.PackageModel{}
+ var packages = []map[string]string{}
+ var packageCount = 0
+
+ if keyword == "" {
+ packageCount, err = packageModel.CountPackages()
+ packages, err = packageModel.GetPackagesByLimit(limit, pageSize)
+ } else {
+ packageCount, err = packageModel.CountPackagesByID(column, keyword)
+ packages, err = packageModel.GetPackagesByIDAndLimit(column, keyword, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["packages"] = packages
+ this.Data["page"] = utils.NewMisc().Page(packageCount, page, pageSize, fmt.Sprintf("/web/package/list?page={page}&type=%s&keyword=%s", column, keyword))
+ this.viewLayoutTitle("流量列表", "package/list", "form")
+}
+func (this *PackageController) Add() {
+ packageModel := models.PackageModel{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getPackageFromPost(false)
+ _, err := packageModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ this.Data["action"] = "add"
+ this.viewLayout("package/form", "form")
+ }
+}
+func (this *PackageController) Edit() {
+ packageModel := models.PackageModel{}
+ packageId := this.GetString("package_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getPackageFromPost(true)
+ _, err := packageModel.Update(packageId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ _package, err := packageModel.GetPackageByPackageId(packageId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(_package) == 0 {
+ this.ViewError("Package不存在")
+ }
+ this.Data["package"] = _package
+ this.Data["action"] = "edit"
+ this.viewLayout("package/form", "form")
+ }
+
+}
+func (this *PackageController) getPackageFromPost(isUpdate bool) (packageId string, _package map[string]interface{}) {
+ _package = map[string]interface{}{
+ "comment": this.GetString("comment"),
+ "bytes_left": this.GetString("bytes_left"),
+ "user_id": this.GetString("user_id"),
+ "start_time": this.GetString("start_time"),
+ "end_time": this.GetString("end_time"),
+ }
+ errs := validation.Errors{
+ "来源": validation.Validate(_package["comment"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,10}$")).Error("长度必须是1-10字符")),
+ "字节数": validation.Validate(_package["bytes_left"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^[0-9]+$")).Error("必须是数字")),
+ "用户ID": validation.Validate(_package["user_id"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^[1-9][0-9]*$")).Error("必须是数字")),
+ "生效时间": validation.Validate(_package["start_time"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile(`^\d{4}-\d{2}-\d{2}$`)).Error("格式错误")),
+ "过期时间": validation.Validate(_package["end_time"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile(`^\d{4}-\d{2}-\d{2}$`)).Error("格式错误")),
+ }
+
+ err := errs.Filter()
+
+ if err != nil {
+ this.JsonError(err)
+ }
+ userModel := models.User{}
+ user, err := userModel.GetUserByUserId(_package["user_id"].(string))
+ if err != nil {
+ this.JsonError(err)
+ }
+ if len(user) == 0 {
+ this.JsonError("用户不存在")
+ }
+ _start, _ := time.ParseInLocation("2006-01-02 15:04:05", _package["start_time"].(string)+" 00:00:00", time.Local)
+ _end, _ := time.ParseInLocation("2006-01-02 15:04:05", _package["end_time"].(string)+" 23:59:59", time.Local)
+ _package["start_time"] = _start.Unix()
+ _package["end_time"] = _end.Unix()
+ if isUpdate {
+ _package["update_time"] = time.Now().Unix()
+ } else {
+ _package["bytes_total"] = _package["bytes_left"]
+ _package["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/region.go b/at-admin/app/modules/web/controllers/region.go
new file mode 100644
index 0000000..4607ba7
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/region.go
@@ -0,0 +1,124 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "regexp"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+)
+
+type RegionController struct {
+ BaseController
+}
+
+func (this *RegionController) Delete() {
+ regionModel := models.Region{}
+ regionId := this.GetString("region_id")
+ hasRole, err := regionModel.HasRole(regionId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if hasRole {
+ this.JsonError("角色引用非空,不能删除")
+ }
+ HasCluster, err := regionModel.HasCluster(regionId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if HasCluster {
+ this.JsonError("Cluster引用非空,不能删除")
+ }
+ HasSubRegion, err := regionModel.HasSubRegion(regionId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if HasSubRegion {
+ this.JsonError("子区域非空,不能删除")
+ }
+ err = regionModel.Delete(regionId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *RegionController) Add() {
+ regionModel := models.Region{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getRegionFromPost(false)
+ _, err := regionModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ regions, err := regionModel.GetTopRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["action"] = "add"
+ this.viewLayout("region/form", "form")
+ }
+
+}
+func (this *RegionController) Edit() {
+ regionModel := models.Region{}
+ regionId := this.GetString("region_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getRegionFromPost(true)
+ _, err := regionModel.Update(regionId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ region, err := regionModel.GetRegionByRegionId(regionId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(region) == 0 {
+ this.ViewError("区域不存在")
+ }
+ regions, err := regionModel.GetTopRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.Data["region"] = region
+ this.Data["action"] = "edit"
+ this.viewLayout("region/form", "form")
+ }
+
+}
+
+func (this *RegionController) List() {
+ regionModel := models.Region{}
+ regions, err := regionModel.GetAllRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regions"] = regions
+ this.view("region/list")
+}
+
+func (this *RegionController) getRegionFromPost(isUpdate bool) (regionId string, region map[string]interface{}) {
+ region = map[string]interface{}{
+ "name": this.GetString("name"),
+ "parent_id": this.GetString("parent_id"),
+ "is_delete": 0,
+ }
+ err := validation.Validate(region["name"],
+ validation.Required.Error("名称不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("名称长度必须是1-15字符"))
+ if err != nil {
+ this.JsonError(err.Error())
+ }
+ if isUpdate {
+ region["update_time"] = time.Now().Unix()
+ } else {
+ region["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/role.go b/at-admin/app/modules/web/controllers/role.go
new file mode 100644
index 0000000..40cf7cc
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/role.go
@@ -0,0 +1,155 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "regexp"
+ "strings"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+)
+
+type RoleController struct {
+ BaseController
+}
+
+func (this *RoleController) Delete() {
+ roleModel := models.Role{}
+ roleId := this.GetString("role_id")
+ // if roleId == "0" {
+ // this.JsonError("系统角色不能删除")
+ // }
+ if roleId == "1" {
+ this.JsonError("默认角色不能删除")
+ }
+ hasUser, err := roleModel.HasUser(roleId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if hasUser {
+ this.JsonError("角色用户非空,不能删除")
+ }
+ err = roleModel.SetRegions(roleId, []string{})
+ if err != nil {
+ this.JsonError(err)
+ }
+ err = roleModel.Delete(roleId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *RoleController) Add() {
+ roleModel := models.Role{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getRoleFromPost(false)
+ _, err := roleModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ this.Data["action"] = "add"
+ this.viewLayout("role/form", "form")
+ }
+
+}
+func (this *RoleController) Edit() {
+ roleModel := models.Role{}
+ roleId := this.GetString("role_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getRoleFromPost(true)
+ _, err := roleModel.Update(roleId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ role, err := roleModel.GetRoleByRoleId(roleId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(role) == 0 {
+ this.ViewError("角色不存在")
+ }
+ this.Data["tunnel_mode_arr"] = strings.Split(role["tunnel_mode"], ",")
+ this.Data["role"] = role
+ this.Data["action"] = "edit"
+ this.viewLayout("role/form", "form")
+ }
+
+}
+
+func (this *RoleController) List() {
+ roleModel := models.Role{}
+
+ roles, err := roleModel.GetAllRoles()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+
+ this.Data["roles"] = roles
+ this.view("role/list")
+}
+
+func (this *RoleController) Regions() {
+ roleModel := models.Role{}
+ roleID := this.GetString("role_id")
+ if this.Ctx.Input.IsPost() {
+ regionIds := this.GetStrings("region-ids")
+ err := roleModel.SetRegions(roleID, regionIds)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ regionModel := models.Region{}
+ regions, err := regionModel.GetAllRegions()
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ regionIds, err := roleModel.GetRoleRegionIds(roleID)
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["regionIds"] = regionIds
+ this.Data["roleId"] = this.GetString("role_id")
+ this.Data["regions"] = regions
+ this.view("role/region")
+ }
+}
+func (this *RoleController) getRoleFromPost(isUpdate bool) (roleId string, role map[string]interface{}) {
+ role = map[string]interface{}{
+ "name": this.GetString("name"),
+ "server_area": this.GetString("server_area"),
+ "client_area": this.GetString("client_area"),
+ "bandwidth": this.GetString("bandwidth"),
+ "is_delete": 0,
+ }
+ errs := validation.Errors{
+ "名称": validation.Validate(role["name"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("长度必须是1-15字符")),
+ "Server区域": validation.Validate(role["server_area"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^(china|foreign|all)$")).Error("错误")),
+ "Client区域": validation.Validate(role["client_area"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^(china|foreign|all)$")).Error("错误")),
+ "带宽": validation.Validate(role["bandwidth"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^(0|([1-9][0-9]*))$")).Error("必须是大于等于0的整数")),
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.JsonError(err)
+ }
+ role["tunnel_mode"] = strings.Join(this.GetStrings("tunnel_mode"), ",")
+ if isUpdate {
+ role["update_time"] = time.Now().Unix()
+ } else {
+ role["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/server.go b/at-admin/app/modules/web/controllers/server.go
new file mode 100644
index 0000000..686fef0
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/server.go
@@ -0,0 +1,137 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "regexp"
+ "strings"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+)
+
+type ServerController struct {
+ BaseController
+}
+
+func (this *ServerController) Reset() {
+ serverModel := models.Server{}
+ serverId := this.GetString("server_id")
+ err := serverModel.Offline(serverId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ err = serverModel.Reset(serverId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *ServerController) Delete() {
+ serverModel := models.Server{}
+ serverId := this.GetString("server_id")
+ hasTunnel, err := serverModel.HasTunnelRef(serverId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if hasTunnel {
+ this.JsonError("Tunnel引用,不能删除")
+ }
+ err = serverModel.Delete(serverId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+func (this *ServerController) Add() {
+ serverModel := models.Server{}
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getServerFromPost(false)
+ _, err := serverModel.Insert(data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ this.Data["action"] = "add"
+ this.viewLayout("server/form", "form")
+ }
+}
+func (this *ServerController) Edit() {
+ serverModel := models.Server{}
+ serverId := this.GetString("server_id")
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getServerFromPost(true)
+ _, err := serverModel.Update(serverId, data)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+ } else {
+ server, err := serverModel.GetServerByServerId(serverId)
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(server) == 0 {
+ this.ViewError("Server不存在")
+ }
+ this.Data["server"] = server
+ this.Data["action"] = "edit"
+ this.viewLayout("server/form", "form")
+ }
+
+}
+func (this *ServerController) List() {
+
+ userID := strings.Trim(this.GetString("user_id"), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ serverModel := models.Server{}
+ var servers = []map[string]string{}
+ var serverCount = 0
+ if userID == "" {
+ serverCount, err = serverModel.CountServers()
+ servers, err = serverModel.GetServersByLimit(limit, pageSize)
+ } else {
+ serverCount, err = serverModel.CountServersByUserID(userID)
+ servers, err = serverModel.GetServersByUserIDAndLimit(userID, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+
+ this.Data["userID"] = userID
+ this.Data["servers"] = servers
+ this.Data["page"] = utils.NewMisc().Page(serverCount, page, pageSize, "/web/server/list?page={page}&user_id="+userID)
+ this.viewLayoutTitle("Server列表", "server/list", "form")
+}
+
+func (this *ServerController) getServerFromPost(isUpdate bool) (serverId string, server map[string]interface{}) {
+ server = map[string]interface{}{
+ "name": this.GetString("name"),
+ // "user_id": this.GetString("user_id"),
+ "user_id": 0,
+ "is_delete": 0,
+ }
+ err := validation.Validate(server["name"],
+ validation.Required.Error("名称不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("名称长度必须是1-15字符"))
+ if err != nil {
+ this.JsonError(err.Error())
+ }
+ if isUpdate {
+ server["update_time"] = time.Now().Unix()
+ } else {
+ server["token"] = utils.NewMisc().RandString(32)
+ server["create_time"] = time.Now().Unix()
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/controllers/tunnel.go b/at-admin/app/modules/web/controllers/tunnel.go
new file mode 100644
index 0000000..384decd
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/tunnel.go
@@ -0,0 +1,42 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "fmt"
+ "strings"
+)
+
+type TunnelController struct {
+ BaseController
+}
+
+func (this *TunnelController) List() {
+ column := strings.Trim(this.GetString("type", ""), " ")
+ keyword := strings.Trim(this.GetString("id", ""), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ tunnelModel := models.Tunnel{}
+ var tunnels = []map[string]string{}
+ var tunnelCount = 0
+
+ if keyword == "" {
+ tunnelCount, err = tunnelModel.CountTunnels()
+ tunnels, err = tunnelModel.GetTunnelsByLimit(limit, pageSize)
+ } else {
+ tunnelCount, err = tunnelModel.CountTunnelsByID(column, keyword)
+ tunnels, err = tunnelModel.GetTunnelsByIDAndLimit(column, keyword, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ this.Data["tunnels"] = tunnels
+ this.Data["page"] = utils.NewMisc().Page(tunnelCount, page, pageSize, fmt.Sprintf("/web/tunnel/list?page={page}&type=%s&id=%s", column, keyword))
+ this.viewLayoutTitle("用户列表", "tunnel/list", "form")
+}
diff --git a/at-admin/app/modules/web/controllers/user.go b/at-admin/app/modules/web/controllers/user.go
new file mode 100644
index 0000000..7b08037
--- /dev/null
+++ b/at-admin/app/modules/web/controllers/user.go
@@ -0,0 +1,275 @@
+package controllers
+
+import (
+ "anytunnel/at-admin/app/modules/web/models"
+ "anytunnel/at-admin/app/utils"
+ "regexp"
+ "strings"
+ "time"
+
+ validation "github.com/go-ozzo/ozzo-validation"
+ "github.com/go-ozzo/ozzo-validation/is"
+)
+
+type UserController struct {
+ BaseController
+}
+
+func (this *UserController) Forbidden() {
+ userModel := models.User{}
+ userId := this.GetString("user_id")
+ // if userId == "0" {
+ // this.JsonError("系统用户不能禁用")
+ // }
+ err := userModel.Forbidden(userId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+
+func (this *UserController) Review() {
+ userModel := models.User{}
+ userId := this.GetString("user_id")
+ // if userId == "0" {
+ // this.JsonError("系统用户不能操作")
+ // }
+ err := userModel.Review(userId)
+ if err != nil {
+ this.JsonError(err)
+ }
+ this.JsonSuccess("")
+
+}
+
+// func (this *UserController) ChangePassword() {
+// userModel := models.User{}
+// if this.Ctx.Input.IsPost() {
+// newpassword := this.GetString("password")
+// oldpassword := this.GetString("password_old")
+// errs := validation.Errors{
+// "旧密码": validation.Validate(oldpassword,
+// validation.Required.Error("不能为空")),
+// "新密码": validation.Validate(newpassword,
+// validation.Required.Error("不能为空"),
+// validation.Match(regexp.MustCompile("^([0-9]+[a-zA-Z]+[_]*){1,16}$")).Error("必须同时包含数字和字母,且1-15字符")),
+// }
+// err := errs.Filter()
+// if err != nil {
+// this.JsonError(err)
+// }
+// err = userModel.ChangePassword(this.loginUser["user_id"], newpassword, oldpassword)
+// if err != nil {
+// this.JsonError("修改密码失败:" + err.Error())
+// }
+// this.JsonSuccess("")
+// } else {
+// this.viewLayout("user/changepassword", "form")
+// }
+// }
+func (this *UserController) Add() {
+ return
+ userModel := models.User{}
+ roleModel := models.Role{}
+ userRoleModel := models.UserRole{}
+
+ if this.Ctx.Input.IsPost() {
+ _, data := this.getUserFromPost(false)
+ username := this.GetString("username")
+ roleIds := this.GetStrings("role_ids", []string{})
+ if len(roleIds) == 0 {
+ this.JsonError("没有选择角色")
+ }
+ HasUsername, err := userModel.HasUsername(username)
+ if err != nil {
+ this.JsonError(err)
+ }
+ if HasUsername {
+ this.JsonError("用户名已经存在")
+ }
+ userId, err := userModel.Insert(data)
+ if err != nil {
+ this.JsonError("添加用户失败:" + err.Error())
+ }
+
+ //添加用户与角色对应关系
+ _, err = userRoleModel.Insert(utils.NewConvert().IntToString(userId, 10), roleIds)
+ if err != nil {
+ this.JsonError("添加用户角色失败:" + err.Error())
+ }
+
+ this.JsonSuccess("")
+ } else {
+
+ roles := []map[string]string{}
+ allRoles, _ := roleModel.GetAllRoles()
+ for _, allRole := range allRoles {
+ role := allRole
+ role["is_default"] = "0"
+ roles = append(roles, role)
+ }
+ this.Data["action"] = "add"
+ this.Data["roles"] = roles
+ this.viewLayout("user/form", "form")
+ }
+
+}
+func (this *UserController) Edit() {
+ userModel := models.User{}
+ roleModel := models.Role{}
+ userRoleModel := models.UserRole{}
+
+ userId := this.GetString("user_id")
+ if this.Ctx.Input.IsPost() {
+ // _, data := this.getUserFromPost(true)
+ // username := this.GetString("username")
+ roleIds := this.GetStrings("role_ids", []string{})
+ if len(roleIds) == 0 {
+ this.JsonError("没有选择角色")
+ }
+ // HasSameUsername, err := userModel.HasSameUsername(userId, username)
+ // if err != nil {
+ // this.JsonError(err)
+ // }
+ // if HasSameUsername {
+ // this.JsonError("用户名已经存在")
+ // }
+ // _, err = userModel.Update(userId, data)
+ // if err != nil {
+ // this.JsonError("修改用户失败:" + err.Error())
+ // }
+
+ //添加用户与角色对应关系
+ _, err := userRoleModel.Insert(userId, roleIds)
+ if err != nil {
+ this.JsonError("修改用户角色失败:" + err.Error())
+ }
+
+ this.JsonSuccess("")
+ } else {
+ roles := []map[string]string{}
+ user, err := userModel.GetUserByUserId(userId)
+ allRoles, _ := roleModel.GetAllRoles()
+ userRoles, _ := userRoleModel.GetUserRolesByUserId(userId)
+ for _, allRole := range allRoles {
+ role := allRole
+ if len(userRoles) == 0 {
+ role["is_default"] = "0"
+ } else {
+ for _, userRoles := range userRoles {
+ if allRole["role_id"] == userRoles["role_id"] {
+ role["is_default"] = "1"
+ break
+ }
+ role["is_default"] = "0"
+ }
+ }
+ roles = append(roles, role)
+ }
+ if err != nil {
+ this.JsonError(err, "")
+ }
+ if len(user) == 0 {
+ this.JsonError("用户不存在")
+ }
+ this.Data["user"] = user
+ this.Data["roles"] = roles
+ this.Data["action"] = "edit"
+ this.viewLayout("user/form", "form")
+ }
+
+}
+func (this *UserController) getUserFromPost(isUpdate bool) (userId string, user map[string]interface{}) {
+ userModel := models.User{}
+ user = map[string]interface{}{
+ "username": this.GetString("username"),
+ "nickname": this.GetString("nickname"),
+ "email": this.GetString("email"),
+ }
+ errs := validation.Errors{
+ "邮箱": validation.Validate(user["email"],
+ validation.Required.Error("不能为空"),
+ is.Email.Error("格式错误")),
+ "昵称": validation.Validate(user["nickname"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^.{1,15}$")).Error("长度必须是1-15字符")),
+
+ //"角色": validation.Validate(user["role_ids"]),
+ // validation.Required.Error("没有选择角色"),
+ }
+ if !isUpdate {
+ errs["用户名"] = validation.Validate(user["username"],
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^[0-9_a-zA-Z]{1,15}$")).Error("只能包含数字字母和下划线,且1-15字符"))
+ errs["密码"] = validation.Validate(this.GetString("password"),
+ validation.Required.Error("不能为空"),
+ validation.Match(regexp.MustCompile("^([0-9]+[a-zA-Z]+[_]*){1,16}$")).Error("必须同时包含数字和字母,且1-15字符"))
+ }
+ err := errs.Filter()
+ if err != nil {
+ this.JsonError(err)
+ }
+ if isUpdate {
+ if this.GetString("password") != "" {
+ user["password"] = userModel.EncodePassword(this.GetString("password"))
+ }
+ user["update_time"] = time.Now().Unix()
+ delete(user, "username")
+ } else {
+ user["is_forbidden"] = 0
+ user["password"] = userModel.EncodePassword(this.GetString("password"))
+ user["create_time"] = time.Now().Unix()
+ }
+ return
+}
+
+func (this *UserController) List() {
+
+ keyword := strings.Trim(this.GetString("keyword", ""), " ")
+ page, err := this.GetInt("page", 1)
+ if err != nil {
+ page = 1
+ }
+ //每页的条数
+ pageSize := 10
+ limit := (page - 1) * pageSize
+
+ userModel := models.User{}
+ var users = []map[string]string{}
+ var userCount = 0
+
+ if keyword == "" {
+ userCount, err = userModel.CountUsers()
+ users, err = userModel.GetUsersByLimit(limit, pageSize)
+ } else {
+ userCount, err = userModel.CountUsersByKeyword(keyword)
+ users, err = userModel.GetUsersByKeywordAndLimit(keyword, limit, pageSize)
+ }
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+
+ roleModel := models.Role{}
+ userRoles := map[string]string{}
+
+ //用户角色
+ for _, user := range users {
+ userId := user["user_id"]
+ var names = ""
+ roles, err := roleModel.GetRolesByUserId(userId)
+ if err != nil {
+ this.ViewError(err.Error())
+ }
+ for _, role := range roles {
+ names += "," + role["name"]
+ }
+ userRoles[user["user_id"]] = strings.Replace(names, ",", "", 1)
+ }
+
+ this.Data["users"] = users
+ this.Data["userRoles"] = userRoles
+ this.Data["keyword"] = keyword
+ this.Data["page"] = utils.NewMisc().Page(userCount, page, pageSize, "/user/list?page={page}")
+ this.viewLayoutTitle("用户列表", "user/list", "form")
+}
diff --git a/at-admin/app/modules/web/models/area.go b/at-admin/app/modules/web/models/area.go
new file mode 100644
index 0000000..631ebe3
--- /dev/null
+++ b/at-admin/app/modules/web/models/area.go
@@ -0,0 +1,116 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Area struct {
+}
+
+func (p *Area) GetAreaByAreaId(areaId string) (area map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("area").Where(map[string]interface{}{
+ "area_id": areaId,
+ }))
+ if err != nil {
+ return
+ }
+ area = rs.Row()
+ return
+}
+
+func (p *Area) Delete(areaId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Delete("area", map[string]interface{}{
+ "area_id": areaId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Area) Insert(area map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("area", area))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Area) Update(areaId string, area map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("area", area, map[string]interface{}{
+ "area_id": areaId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//根据搜索分页获取Area
+func (area *Area) GetAreasByIDAndLimit(column, id string, limit int, number int) (areas []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("area").Where(map[string]interface{}{
+ column: id,
+ }).OrderBy("area_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ areas = rs.Rows()
+ return
+}
+
+//分页获取Area
+func (area *Area) GetAreasByLimit(limit int, number int) (areas []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("area").
+ OrderBy("area_id", "desc").
+ Limit(limit, number))
+ if err != nil {
+ return
+ }
+ areas = rs.Rows()
+ return
+}
+
+func (area *Area) CountAreas() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").From("area"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (area *Area) CountAreasByID(column, id string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("area").
+ Where(map[string]interface{}{
+ column: id,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/client.go b/at-admin/app/modules/web/models/client.go
new file mode 100644
index 0000000..80707ec
--- /dev/null
+++ b/at-admin/app/modules/web/models/client.go
@@ -0,0 +1,201 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+ common "anytunnel/at-common"
+ "fmt"
+
+ "github.com/astaxie/beego"
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Client struct {
+}
+
+func (p *Client) GetClientByClientId(clientId string) (client map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("client").Where(map[string]interface{}{
+ "client_id": clientId,
+ }))
+ if err != nil {
+ return
+ }
+ client = rs.Row()
+ return
+}
+func (p *Client) HasTunnelRef(clientId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("tunnel").Where(map[string]interface{}{
+ "client_id": clientId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Client) Reset(clientId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("client", map[string]interface{}{
+ "token": utils.NewMisc().RandString(32),
+ }, map[string]interface{}{
+ "client_id": clientId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Client) Delete(clientId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("client", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "client_id": clientId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Client) Insert(client map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("client", client))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Client) Update(clientId string, client map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("client", client, map[string]interface{}{
+ "client_id": clientId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//获取所有的Client
+func (this *Client) GetAllClients() (clients []map[string]string, err error) {
+ db := DB
+ res, err := db.Query(db.AR().From("client").Where(map[string]interface{}{
+ "is_delete": 0,
+ }).OrderBy("client_id", "ASC"))
+ if err != nil {
+ return
+ }
+ clients = res.Rows()
+ return
+}
+
+//根据user_id分页获取Client
+func (client *Client) GetClientsByUserIDAndLimit(userID string, limit int, number int) (clients []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("client").Where(map[string]interface{}{
+ "user_id": userID,
+ "is_delete": 0,
+ }).OrderBy("client_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ clients = rs.Rows()
+
+ return
+}
+
+//分页获取Client
+func (client *Client) GetClientsByLimit(limit int, number int) (clients []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("client").Where(map[string]interface{}{
+ "is_delete": 0,
+ "user_id <>": 0,
+ }).OrderBy("client_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ clients = rs.Rows()
+
+ return
+}
+
+func (client *Client) CountClients() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").Where(map[string]interface{}{
+ "is_delete": 0,
+ "user_id <>": 0,
+ }).From("client"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (client *Client) CountClientsByUserID(userID string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("client").
+ Where(map[string]interface{}{
+ "user_id": userID,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+func (p *Client) Offline(serverId string) (err error) {
+ db := DB
+ rs, err := db.Query(db.AR().From("client").Where(map[string]interface{}{
+ "client_id": serverId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ if rs.Len() == 0 {
+ return
+ }
+ token := rs.Value("token")
+ rs, err = db.Query(db.AR().From("online").Where(map[string]interface{}{
+ "token": token,
+ "type": "client",
+ }))
+ if err != nil {
+ return
+ }
+ if rs.Len() == 0 {
+ return
+ }
+ clusterIP := rs.Value("ip")
+ url := fmt.Sprintf("https://%s:%s/client/offline/%s", clusterIP, beego.AppConfig.String("cluster.api.port"), token)
+ body, code, err := common.HttpGet(url)
+ if err != nil {
+ return
+ }
+ if code != 200 {
+ err = fmt.Errorf("access client offline url %s fail,code:%d ,body:%s", url, code, body)
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/models/cluster.go b/at-admin/app/modules/web/models/cluster.go
new file mode 100644
index 0000000..6420eca
--- /dev/null
+++ b/at-admin/app/modules/web/models/cluster.go
@@ -0,0 +1,119 @@
+package models
+
+import (
+ "strconv"
+
+ humanize "github.com/dustin/go-humanize"
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Cluster struct {
+}
+
+func (p *Cluster) GetClusterByClusterId(clusterId string) (cluster map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("cluster").Where(map[string]interface{}{
+ "cluster_id": clusterId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ cluster = rs.Row()
+ return
+}
+func (p *Cluster) HasTunnel(clusterId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("tunnel").Where(map[string]interface{}{
+ "cluster_id": clusterId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Cluster) Delete(clusterId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("cluster", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "cluster_id": clusterId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Cluster) Insert(cluster map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("cluster", cluster))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Cluster) Update(clusterId string, cluster map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("cluster", cluster, map[string]interface{}{
+ "cluster_id": clusterId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//禁用
+func (p *Cluster) Forbidden(clusterId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("cluster", map[string]interface{}{
+ "is_disable": 1,
+ }, map[string]interface{}{
+ "cluster_id": clusterId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+
+//恢复
+func (p *Cluster) Review(clusterId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("cluster", map[string]interface{}{
+ "is_disable": 0,
+ }, map[string]interface{}{
+ "cluster_id": clusterId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+
+//获取所有的
+func (this *Cluster) GetAllClusters() (clusters []map[string]string, err error) {
+ db := DB
+ res, err := db.Query(db.AR().From("cluster").Where(map[string]interface{}{
+ "is_delete": 0,
+ }).OrderBy("name", "ASC"))
+ if err != nil {
+ return
+ }
+ clusters = res.Rows()
+ for k, v := range clusters {
+ _bandwidth, _ := strconv.ParseUint(v["bandwidth"], 10, 64)
+ clusters[k]["bandwidth_human"] = humanize.Bytes(_bandwidth)
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/models/conn.go b/at-admin/app/modules/web/models/conn.go
new file mode 100644
index 0000000..d1c8270
--- /dev/null
+++ b/at-admin/app/modules/web/models/conn.go
@@ -0,0 +1,181 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+ common "anytunnel/at-common"
+ "fmt"
+
+ "github.com/astaxie/beego"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Conn struct {
+}
+
+func (p *Conn) GetConnByConnId(connId string) (conn map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("conn").Where(map[string]interface{}{
+ "conn_id": connId,
+ }))
+ if err != nil {
+ return
+ }
+ conn = rs.Row()
+ return
+}
+func (p *Conn) HasTunnelRef(connId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("tunnel").Where(map[string]interface{}{
+ "conn_id": connId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Conn) Reset(connId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("conn", map[string]interface{}{
+ "token": utils.NewMisc().RandString(32),
+ }, map[string]interface{}{
+ "conn_id": connId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Conn) Offline(connId string) (err error) {
+ db := DB
+ rs, err := db.Query(db.AR().From("conn").Where(map[string]interface{}{
+ "conn_id": connId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ if rs.Len() == 0 {
+ return
+ }
+ token := rs.Value("token")
+ rs, err = db.Query(db.AR().From("online").Where(map[string]interface{}{
+ "token": token,
+ "type": "conn",
+ }))
+ if err != nil {
+ return
+ }
+ if rs.Len() == 0 {
+ return
+ }
+ clusterIP := rs.Value("ip")
+ url := fmt.Sprintf("https://%s:%s/conn/offline/%s", clusterIP, beego.AppConfig.String("cluster.api.port"), token)
+ body, code, err := common.HttpGet(url)
+ if err != nil {
+ return
+ }
+ if code != 200 {
+ err = fmt.Errorf("access conn offline url %s fail,code:%d ,body:%s", url, code, body)
+ }
+ return
+}
+func (p *Conn) Delete(connId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("conn", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "conn_id": connId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Conn) Insert(conn map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("conn", conn))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Conn) Update(connId string, conn map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("conn", conn, map[string]interface{}{
+ "conn_id": connId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//根据user_id分页获取Conn
+func (conn *Conn) GetConnsByUserIDAndLimit(col, keyword, orderby string, limit int, number int) (conns []map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("conn").Where(map[string]interface{}{
+ col: keyword,
+ }).OrderBy(orderby, "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ conns = rs.Rows()
+ return
+}
+
+//分页获取Conn
+func (conn *Conn) GetConnsByLimit(limit int, number int, orderby string) (conns []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("conn").
+ OrderBy(orderby, "desc").
+ Limit(limit, number))
+ if err != nil {
+ return
+ }
+ conns = rs.Rows()
+
+ return
+}
+
+func (conn *Conn) CountConns() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").From("conn"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (conn *Conn) CountConnsByUserID(col, keyword string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("conn").
+ Where(map[string]interface{}{
+ col: keyword,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/init.go b/at-admin/app/modules/web/models/init.go
new file mode 100644
index 0000000..78a2915
--- /dev/null
+++ b/at-admin/app/modules/web/models/init.go
@@ -0,0 +1,15 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/models"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+var G *mysql.DBGroup
+var DB *mysql.DB
+
+func init() {
+ G = models.G
+ DB = G.DB("base")
+}
diff --git a/at-admin/app/modules/web/models/ip_list.go b/at-admin/app/modules/web/models/ip_list.go
new file mode 100644
index 0000000..ca6c0a9
--- /dev/null
+++ b/at-admin/app/modules/web/models/ip_list.go
@@ -0,0 +1,116 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type IpList struct {
+}
+
+func (p *IpList) GetIpListByIpListId(ip_listId string) (ip_list map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("ip_list").Where(map[string]interface{}{
+ "ip_list_id": ip_listId,
+ }))
+ if err != nil {
+ return
+ }
+ ip_list = rs.Row()
+ return
+}
+
+func (p *IpList) Delete(ip_listId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Delete("ip_list", map[string]interface{}{
+ "ip_list_id": ip_listId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *IpList) Insert(ip_list map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("ip_list", ip_list))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *IpList) Update(ip_listId string, ip_list map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("ip_list", ip_list, map[string]interface{}{
+ "ip_list_id": ip_listId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//根据搜索分页获取IpList
+func (ip_list *IpList) GetIpListsByIDAndLimit(column, id string, limit int, number int) (ip_lists []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("ip_list").Where(map[string]interface{}{
+ column: id,
+ }).OrderBy("ip_list_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ ip_lists = rs.Rows()
+ return
+}
+
+//分页获取IpList
+func (ip_list *IpList) GetIpListsByLimit(limit int, number int) (ip_lists []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("ip_list").
+ OrderBy("ip_list_id", "desc").
+ Limit(limit, number))
+ if err != nil {
+ return
+ }
+ ip_lists = rs.Rows()
+ return
+}
+
+func (ip_list *IpList) CountIpLists() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").From("ip_list"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (ip_list *IpList) CountIpListsByID(column, id string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("ip_list").
+ Where(map[string]interface{}{
+ column: id,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/online.go b/at-admin/app/modules/web/models/online.go
new file mode 100644
index 0000000..304e66b
--- /dev/null
+++ b/at-admin/app/modules/web/models/online.go
@@ -0,0 +1,126 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Online struct {
+}
+
+func (p *Online) GetOnlineByOnlineId(onlineId string) (online map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("online").Where(map[string]interface{}{
+ "online_id": onlineId,
+ }))
+ if err != nil {
+ return
+ }
+ online = rs.Row()
+ return
+}
+
+func (p *Online) Delete(onlineId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("online", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "online_id": onlineId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Online) Insert(online map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("online", online))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Online) Update(onlineId string, online map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("online", online, map[string]interface{}{
+ "online_id": onlineId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//根据搜索分页获取Online
+func (online *Online) GetOnlinesByIDAndLimit(cs, column, id string, limit int, number int) (onlines []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("online").Where(map[string]interface{}{
+ column: id,
+ "cs_type": cs,
+ }).OrderBy("online_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ onlines = rs.Rows()
+
+ return
+}
+
+//分页获取Online
+func (online *Online) GetOnlinesByLimit(cs string, limit int, number int) (onlines []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("online").Where(map[string]interface{}{
+ "cs_type": cs,
+ }).
+ OrderBy("online_id", "desc").
+ Limit(limit, number))
+ if err != nil {
+ return
+ }
+ onlines = rs.Rows()
+
+ return
+}
+
+func (online *Online) CountOnlines(cs string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").Where(map[string]interface{}{
+ "cs_type": cs,
+ }).From("online"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (online *Online) CountOnlinesByID(cs, column, id string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("online").
+ Where(map[string]interface{}{
+ column: id,
+ "cs_type": cs,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/package.go b/at-admin/app/modules/web/models/package.go
new file mode 100644
index 0000000..9359798
--- /dev/null
+++ b/at-admin/app/modules/web/models/package.go
@@ -0,0 +1,159 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+ "strconv"
+ "time"
+
+ "github.com/dustin/go-humanize"
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type PackageModel struct {
+}
+
+func (p *PackageModel) GetPackageByPackageId(packageId string) (PackageModel map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("package").Where(map[string]interface{}{
+ "package_id": packageId,
+ }))
+ if err != nil {
+ return
+ }
+ PackageModel = rs.Row()
+ return
+}
+
+func (p *PackageModel) Delete(packageId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("package", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "package_id": packageId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *PackageModel) Insert(_package map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("package", _package))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *PackageModel) Update(packageId string, _package map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("package", _package, map[string]interface{}{
+ "package_id": packageId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//根据搜索分页获取Package
+func (p *PackageModel) GetPackagesByIDAndLimit(column, id string, limit int, number int) (packages []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("package").Where(map[string]interface{}{
+ column: id,
+ }).OrderBy("end_time", "asc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ packages = rs.Rows()
+ for k, v := range packages {
+ _total, _ := strconv.ParseUint(v["bytes_total"], 10, 64)
+ _totalLeft, _ := strconv.ParseUint(v["bytes_left"], 10, 64)
+ _totalUse := _total - _totalLeft
+ packages[k]["bytes_total_human"] = humanize.Bytes(_total)
+ packages[k]["bytes_left_human"] = humanize.Bytes(_totalLeft)
+ packages[k]["bytes_use_human"] = humanize.Bytes(_totalUse)
+ packages[k]["status"] = `有效 `
+ endtime, _ := strconv.Atoi(v["end_time"])
+ starttime, _ := strconv.Atoi(v["start_time"])
+ if int64(endtime) <= time.Now().Unix() {
+ packages[k]["status"] = `已过期 `
+ }
+ if int64(starttime) > time.Now().Unix() {
+ packages[k]["status"] = `未生效 `
+ }
+ if _totalLeft == 0 {
+ packages[k]["status"] = `已用完 `
+ }
+ }
+ return
+}
+
+//分页获取Package
+func (p *PackageModel) GetPackagesByLimit(limit int, number int) (packages []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("package").OrderBy("package_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ packages = rs.Rows()
+ for k, v := range packages {
+ _total, _ := strconv.ParseUint(v["bytes_total"], 10, 64)
+ _totalLeft, _ := strconv.ParseUint(v["bytes_left"], 10, 64)
+ _totalUse := _total - _totalLeft
+ packages[k]["bytes_total_human"] = humanize.Bytes(_total)
+ packages[k]["bytes_left_human"] = humanize.Bytes(_totalLeft)
+ packages[k]["bytes_use_human"] = humanize.Bytes(_totalUse)
+ packages[k]["status"] = `有效 `
+ endtime, _ := strconv.Atoi(v["end_time"])
+ starttime, _ := strconv.Atoi(v["start_time"])
+ if int64(endtime) <= time.Now().Unix() {
+ packages[k]["status"] = `已过期 `
+ }
+ if int64(starttime) > time.Now().Unix() {
+ packages[k]["status"] = `未生效 `
+ }
+ if _totalLeft == 0 {
+ packages[k]["status"] = `已用完 `
+ }
+ }
+ return
+}
+
+func (p *PackageModel) CountPackages() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").From("package"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (p *PackageModel) CountPackagesByID(column, id string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("package").
+ Where(map[string]interface{}{
+ column: id,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/region.go b/at-admin/app/modules/web/models/region.go
new file mode 100644
index 0000000..2d68f21
--- /dev/null
+++ b/at-admin/app/modules/web/models/region.go
@@ -0,0 +1,152 @@
+package models
+
+import (
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Region struct {
+}
+
+func (p *Region) GetRegionByRegionId(regionId string) (region map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("region").Where(map[string]interface{}{
+ "region_id": regionId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ region = rs.Row()
+ return
+}
+func (p *Region) HasRole(regionId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("role_region").Where(map[string]interface{}{
+ "region_id": regionId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Region) HasSubRegion(regionId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("region").Where(map[string]interface{}{
+ "parent_id": regionId,
+ "is_delete": 0,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Region) HasCluster(regionId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("region_cluster").Where(map[string]interface{}{
+ "region_id": regionId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Region) Delete(regionId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("region", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "region_id": regionId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Region) Insert(region map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("region", region))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Region) Update(regionId string, region map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("region", region, map[string]interface{}{
+ "region_id": regionId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//获取所有的Region
+func (this *Region) GetAllRegions() (regions []map[string]string, err error) {
+ db := DB
+ res, err := db.Query(db.AR().From("region").Where(map[string]interface{}{
+ "is_delete": 0,
+ }).OrderBy("parent_id", "ASC").OrderBy("region_id", "ASC"))
+ if err != nil {
+ return
+ }
+ regions = res.Rows()
+ return
+}
+
+//获取所有顶级Region
+func (this *Region) GetTopRegions() (regions map[string]map[string]string, err error) {
+ db := DB
+ res, err := db.Query(db.AR().From("region").Where(map[string]interface{}{
+ "is_delete": 0,
+ "parent_id": 0,
+ }).OrderBy("region_id", "ASC"))
+ if err != nil {
+ return
+ }
+ regions = res.MapRows("region_id")
+ return
+}
+
+//获取所有二级Region
+func (this *Region) GetSubRegions() (regions []map[string]string, err error) {
+ db := DB
+ res, err := db.Query(db.AR().From("region").Where(map[string]interface{}{
+ "is_delete": 0,
+ }).OrderBy("parent_id", "ASC"))
+ if err != nil {
+ return
+ }
+ regionsAll := res.Rows()
+ for _, r := range regionsAll {
+ if r["parent_id"] != "0" {
+ r["parent"] = ""
+ for _, r1 := range regionsAll {
+ if r["parent_id"] == r1["region_id"] {
+ r["parent"] = r1["name"]
+ break
+ }
+ }
+ regions = append(regions, r)
+ }
+ }
+ return
+}
diff --git a/at-admin/app/modules/web/models/role.go b/at-admin/app/modules/web/models/role.go
new file mode 100644
index 0000000..d895d51
--- /dev/null
+++ b/at-admin/app/modules/web/models/role.go
@@ -0,0 +1,150 @@
+package models
+
+import (
+ "strconv"
+ "strings"
+ "time"
+
+ humanize "github.com/dustin/go-humanize"
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Role struct {
+}
+
+func (p *Role) GetRoleByRoleId(roleId string) (role map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("role").Where(map[string]interface{}{
+ "role_id": roleId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ role = rs.Row()
+ return
+}
+func (p *Role) HasUser(roleId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user_role").Where(map[string]interface{}{
+ "role_id": roleId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Role) Delete(roleId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("role", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Role) Insert(role map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("role", role))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Role) Update(roleId string, role map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("role", role, map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//获取所有的角色
+func (this *Role) GetAllRoles() (roles []map[string]string, err error) {
+ db := DB
+ res, err := db.Query(db.AR().From("role").Where(map[string]interface{}{
+ "is_delete": 0,
+ }).OrderBy("role_id", "ASC"))
+ if err != nil {
+ return
+ }
+ roles = res.Rows()
+ for k, v := range roles {
+ c, _ := strconv.ParseUint(v["bandwidth"], 10, 64)
+ v["bandwidth_human"] = humanize.Bytes(c)
+ m := strings.Split(v["tunnel_mode"], ",")
+ mmap := map[string]string{"0": "普通", "1": "高级", "2": "特殊"}
+ _m := []string{}
+ for _, val := range m {
+ _m = append(_m, mmap[val])
+ }
+ v["tunnel_mode_human"] = strings.Join(_m, ",")
+ roles[k] = v
+ }
+ return
+}
+
+// 根据用户名查找所有的角色
+func (this *Role) GetRolesByUserId(userId string) (roles []map[string]string, err error) {
+
+ userRoleModel := UserRole{}
+ userRoles, err := userRoleModel.GetUserRolesByUserId(userId)
+ if err != nil {
+ return
+ }
+
+ for _, userRole := range userRoles {
+ role, _ := this.GetRoleByRoleId(userRole["role_id"])
+ roles = append(roles, role)
+ }
+
+ return
+}
+func (this *Role) SetRegions(roleId string, region_ids []string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Delete("role_region", map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if err != nil {
+ return
+ }
+ data := []map[string]interface{}{}
+ for _, v := range region_ids {
+ data = append(data, map[string]interface{}{
+ "role_id": roleId,
+ "region_id": v,
+ "create_time": time.Now().Unix(),
+ })
+ }
+ if len(data) > 0 {
+ _, err = db.Exec(db.AR().InsertBatch("role_region", data))
+ }
+ return
+}
+func (this *Role) GetRoleRegionIds(roleId string) (ids []string, err error) {
+ db := DB
+ rs, err := db.Query(db.AR().From("role_region").Where(map[string]interface{}{
+ "role_id": roleId,
+ }))
+ if err != nil {
+ return
+ }
+ ids = rs.Values("region_id")
+ return
+}
diff --git a/at-admin/app/modules/web/models/server.go b/at-admin/app/modules/web/models/server.go
new file mode 100644
index 0000000..7e19d3c
--- /dev/null
+++ b/at-admin/app/modules/web/models/server.go
@@ -0,0 +1,189 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+ common "anytunnel/at-common"
+ "fmt"
+
+ "github.com/astaxie/beego"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Server struct {
+}
+
+func (p *Server) GetServerByServerId(serverId string) (server map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("server").Where(map[string]interface{}{
+ "server_id": serverId,
+ }))
+ if err != nil {
+ return
+ }
+ server = rs.Row()
+ return
+}
+func (p *Server) HasTunnelRef(serverId string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("tunnel").Where(map[string]interface{}{
+ "server_id": serverId,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *Server) Reset(serverId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("server", map[string]interface{}{
+ "token": utils.NewMisc().RandString(32),
+ }, map[string]interface{}{
+ "server_id": serverId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Server) Offline(serverId string) (err error) {
+ db := DB
+ rs, err := db.Query(db.AR().From("server").Where(map[string]interface{}{
+ "server_id": serverId,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ if rs.Len() == 0 {
+ return
+ }
+ token := rs.Value("token")
+ rs, err = db.Query(db.AR().From("online").Where(map[string]interface{}{
+ "token": token,
+ "type": "server",
+ }))
+ if err != nil {
+ return
+ }
+ if rs.Len() == 0 {
+ return
+ }
+ clusterIP := rs.Value("ip")
+ url := fmt.Sprintf("https://%s:%s/server/offline/%s", clusterIP, beego.AppConfig.String("cluster.api.port"), token)
+ body, code, err := common.HttpGet(url)
+ if err != nil {
+ return
+ }
+ if code != 200 {
+ err = fmt.Errorf("access server offline url %s fail,code:%d ,body:%s", url, code, body)
+ }
+ return
+}
+func (p *Server) Delete(serverId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("server", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "server_id": serverId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Server) Insert(server map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("server", server))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Server) Update(serverId string, server map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("server", server, map[string]interface{}{
+ "server_id": serverId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//根据user_id分页获取Server
+func (server *Server) GetServersByUserIDAndLimit(userID string, limit int, number int) (servers []map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("server").Where(map[string]interface{}{
+ "user_id": userID,
+ "is_delete": 0,
+ }).OrderBy("server_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ servers = rs.Rows()
+ return
+}
+
+//分页获取Server
+func (server *Server) GetServersByLimit(limit int, number int) (servers []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("server").Where(map[string]interface{}{
+ "is_delete": 0,
+ "user_id <>": 0,
+ }).
+ OrderBy("server_id", "desc").
+ Limit(limit, number))
+ if err != nil {
+ return
+ }
+ servers = rs.Rows()
+
+ return
+}
+
+func (server *Server) CountServers() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").Where(map[string]interface{}{
+ "is_delete": 0,
+ "user_id <>": 0,
+ }).From("server"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (server *Server) CountServersByUserID(userID string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("server").
+ Where(map[string]interface{}{
+ "user_id": userID,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/tunnel.go b/at-admin/app/modules/web/models/tunnel.go
new file mode 100644
index 0000000..44ad11f
--- /dev/null
+++ b/at-admin/app/modules/web/models/tunnel.go
@@ -0,0 +1,124 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type Tunnel struct {
+}
+
+func (p *Tunnel) GetTunnelByTunnelId(tunnelId string) (tunnel map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("tunnel").Where(map[string]interface{}{
+ "tunnel_id": tunnelId,
+ }))
+ if err != nil {
+ return
+ }
+ tunnel = rs.Row()
+ return
+}
+
+func (p *Tunnel) Delete(tunnelId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("tunnel", map[string]interface{}{
+ "is_delete": 1,
+ }, map[string]interface{}{
+ "tunnel_id": tunnelId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *Tunnel) Insert(tunnel map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("tunnel", tunnel))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *Tunnel) Update(tunnelId string, tunnel map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("tunnel", tunnel, map[string]interface{}{
+ "tunnel_id": tunnelId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+//根据搜索分页获取Tunnel
+func (tunnel *Tunnel) GetTunnelsByIDAndLimit(column, id string, limit int, number int) (tunnels []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("tunnel").Where(map[string]interface{}{
+ column: id,
+ "is_delete": 0,
+ }).OrderBy("tunnel_id", "desc").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ tunnels = rs.Rows()
+ return
+}
+
+//分页获取Tunnel
+func (tunnel *Tunnel) GetTunnelsByLimit(limit int, number int) (tunnels []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("tunnel").Where(map[string]interface{}{
+ "is_delete": 0,
+ }).
+ OrderBy("tunnel_id", "desc").
+ Limit(limit, number))
+ if err != nil {
+ return
+ }
+ tunnels = rs.Rows()
+ return
+}
+
+func (tunnel *Tunnel) CountTunnels() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").Where(map[string]interface{}{
+ "is_delete": 0,
+ }).From("tunnel"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (tunnel *Tunnel) CountTunnelsByID(column, id string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("tunnel").
+ Where(map[string]interface{}{
+ column: id,
+ "is_delete": 0,
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/user.go b/at-admin/app/modules/web/models/user.go
new file mode 100644
index 0000000..99f0fc4
--- /dev/null
+++ b/at-admin/app/modules/web/models/user.go
@@ -0,0 +1,206 @@
+package models
+
+import (
+ "anytunnel/at-admin/app/utils"
+ "crypto/md5"
+ "encoding/hex"
+ "errors"
+ "strings"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type User struct {
+}
+
+func (p *User) GetUserByUserId(userId string) (user map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ user = rs.Row()
+ return
+}
+
+func (p *User) HasSameUsername(userId, username string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "user_id <>": userId,
+ "username": username,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *User) HasUsername(username string) (has bool, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "username": username,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ if rs.Len() > 0 {
+ has = true
+ }
+ return
+}
+func (p *User) GetUserByName(username string) (user map[string]string, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "username": username,
+ }).Limit(0, 1))
+ if err != nil {
+ return
+ }
+ user = rs.Row()
+ return
+}
+
+//禁用
+func (p *User) Forbidden(userId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("user", map[string]interface{}{
+ "is_forbidden": 1,
+ }, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+
+//恢复
+func (p *User) Review(userId string) (err error) {
+ db := DB
+ _, err = db.Exec(db.AR().Update("user", map[string]interface{}{
+ "is_forbidden": 0,
+ }, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+
+func (p *User) Insert(user map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Insert("user", user))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *User) Update(userId string, user map[string]interface{}) (id int64, err error) {
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Exec(db.AR().Update("user", user, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ id = rs.LastInsertId
+ return
+}
+
+func (p *User) ChangePassword(userId, newpassword, oldpassword string) (err error) {
+ db := DB
+ user, err := p.GetUserByUserId(userId)
+ if user["password"] != p.EncodePassword(oldpassword) {
+ return errors.New("旧密码错误")
+ }
+ if err != nil {
+ return
+ }
+ _, err = db.Exec(db.AR().Update("user", map[string]interface{}{
+ "password": p.EncodePassword(newpassword),
+ }, map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ return
+}
+func (p *User) EncodePassword(password string) (passwordHash string) {
+ hasher := md5.New()
+ hasher.Write([]byte(password))
+ passwordHash = strings.ToLower(hex.EncodeToString(hasher.Sum(nil)))
+ return
+}
+
+//根据关键字分页获取用户
+func (user *User) GetUsersByKeywordAndLimit(keyword string, limit int, number int) (users []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
+ "username LIKE": "%" + keyword + "%",
+ }).Limit(limit, number))
+ if err != nil {
+ return
+ }
+ users = rs.Rows()
+
+ return
+}
+
+//分页获取用户
+func (user *User) GetUsersByLimit(limit int, number int) (users []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user").Limit(limit, number))
+ if err != nil {
+ return
+ }
+ users = rs.Rows()
+
+ return
+}
+
+func (user *User) CountUsers() (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().Select("count(*) as total").From("user"))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
+
+func (user *User) CountUsersByKeyword(keyword string) (count int, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().
+ Select("count(*) as total").
+ From("user").
+ Where(map[string]interface{}{
+ "username LIKE": "%" + keyword + "%",
+ }))
+ if err != nil {
+ return
+ }
+ count = utils.NewConvert().StringToInt(rs.Value("total"))
+ return
+}
diff --git a/at-admin/app/modules/web/models/user_role.go b/at-admin/app/modules/web/models/user_role.go
new file mode 100644
index 0000000..2a9c8e2
--- /dev/null
+++ b/at-admin/app/modules/web/models/user_role.go
@@ -0,0 +1,62 @@
+package models
+
+import (
+ "time"
+
+ "github.com/snail007/go-activerecord/mysql"
+)
+
+type UserRole struct {
+ UserRoleID uint `orm:"pk"` // user_role_id
+ UserID uint64 // user_id
+ RoleID uint // role_id
+ CreateTime uint // create_time
+ UpdateTime uint // update_time
+}
+
+func (this *UserRole) GetUserRolesByUserId(userId string) (userRoles []map[string]string, err error) {
+
+ db := DB
+ var rs *mysql.ResultSet
+ rs, err = db.Query(db.AR().From("user_role").Where(map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ userRoles = rs.Rows()
+
+ return
+}
+
+// 插入 user_id 和 role_id 对应关系
+func (this *UserRole) Insert(userId string, roleIds []string) (res bool, err error) {
+
+ res = false
+ db := DB
+ //先删除
+ _, err = db.Exec(db.AR().Delete("user_role", map[string]interface{}{
+ "user_id": userId,
+ }))
+ if err != nil {
+ return
+ }
+ //添加
+ userRoles := []map[string]interface{}{}
+ for _, roleId := range roleIds {
+ userRole := map[string]interface{}{
+ "role_id": roleId,
+ "user_id": userId,
+ "create_time": time.Now().Unix(),
+ "update_time": time.Now().Unix(),
+ }
+ userRoles = append(userRoles, userRole)
+ }
+
+ _, err = db.Exec(db.AR().InsertBatch("user_role", userRoles))
+ if err != nil {
+ return
+ }
+ res = true
+ return
+}
diff --git a/at-admin/app/routers/router.go b/at-admin/app/routers/router.go
new file mode 100644
index 0000000..b31cbde
--- /dev/null
+++ b/at-admin/app/routers/router.go
@@ -0,0 +1,63 @@
+package routers
+
+import (
+ "anytunnel/at-admin/app/controllers"
+ web_controllers "anytunnel/at-admin/app/modules/web/controllers"
+ "anytunnel/at-admin/app/utils"
+ "html/template"
+ "math/rand"
+ "net/http"
+
+ "github.com/astaxie/beego"
+)
+
+func init() {
+ beego.AppConfig.Set("author.passport", "usmpassport")
+ beego.AppConfig.Set("sys.name", "ATCAS")
+ beego.AppConfig.Set("sys.fullname", "AnyTunnel Cloud Admin System")
+
+ beego.BConfig.ServerName = beego.AppConfig.String("sys.name")
+ beego.SetStaticPath("/static/", "static")
+ beego.BConfig.WebConfig.AutoRender = false
+ beego.BConfig.WebConfig.Session.SessionName = "ssid"
+ beego.BConfig.WebConfig.Session.SessionOn = true
+ beego.BConfig.RouterCaseSensitive = false
+ beego.Router("/", &controllers.MainController{}, "*:Index")
+ beego.AutoRouter(&controllers.MainController{})
+ beego.AutoRouter(&controllers.SystemController{})
+ beego.AutoRouter(&controllers.LoginController{})
+ beego.AutoRouter(&controllers.UserController{})
+ beego.AutoRouter(&controllers.PrivilegeController{})
+ beego.AutoRouter(&controllers.Role_PrivilegeController{})
+ beego.AutoRouter(&controllers.RoleController{})
+ beego.AddFuncMap("randInt", randInt)
+ beego.AddFuncMap("dateFormat", utils.NewDate().Format)
+ beego.ErrorHandler("404", page_not_found)
+ beego.ErrorHandler("500", page_not_found)
+ beego.BConfig.WebConfig.ViewsPath = "app/views"
+ userNS := beego.NewNamespace("/web",
+ beego.NSAutoRouter(&web_controllers.UserController{}),
+ beego.NSAutoRouter(&web_controllers.RoleController{}),
+ beego.NSAutoRouter(&web_controllers.ServerController{}),
+ beego.NSAutoRouter(&web_controllers.ClientController{}),
+ beego.NSAutoRouter(&web_controllers.RegionController{}),
+ beego.NSAutoRouter(&web_controllers.ClusterController{}),
+ beego.NSAutoRouter(&web_controllers.TunnelController{}),
+ beego.NSAutoRouter(&web_controllers.OnlineController{}),
+ beego.NSAutoRouter(&web_controllers.PackageController{}),
+ beego.NSAutoRouter(&web_controllers.ConnController{}),
+ beego.NSAutoRouter(&web_controllers.IpListController{}),
+ beego.NSAutoRouter(&web_controllers.AreaController{}),
+ )
+ beego.AddNamespace(userNS)
+}
+func page_not_found(rw http.ResponseWriter, r *http.Request) {
+ t, _ := template.New("500-full.html").ParseFiles(beego.BConfig.WebConfig.ViewsPath + "/error/500-full.html")
+ data := make(map[string]interface{})
+ data["content"] = ""
+ t.Execute(rw, data)
+}
+
+func randInt(start, end int) int {
+ return rand.Intn(end) + start
+}
diff --git a/at-admin/app/utils/convert.go b/at-admin/app/utils/convert.go
new file mode 100644
index 0000000..353a3ac
--- /dev/null
+++ b/at-admin/app/utils/convert.go
@@ -0,0 +1,64 @@
+package utils
+
+import "strconv"
+
+type Convert struct{}
+
+func NewConvert() *Convert {
+ return &Convert{}
+}
+
+// bool 转化为字符串
+func (convert *Convert) BoolToString(boolValue bool) string {
+ if boolValue == true {
+ return "true"
+ } else {
+ return "false"
+ }
+}
+
+//bool 转化为 int
+func (convert *Convert) BoolToInt(boolValue bool) int {
+ if boolValue == true {
+ return 1
+ } else {
+ return 0
+ }
+}
+
+//int 转化为 bool
+func (convert *Convert) IntToBool(number int) bool {
+ if number == 0 {
+ return false
+ } else {
+ return true
+ }
+}
+
+//int 转化为字符串
+//base 范围 2-32 进制
+func (convert *Convert) IntToString(number int64, base int) string {
+ return strconv.FormatInt(number, base)
+}
+
+//string to int(10进制)
+func (convert *Convert) StringToInt(str string) int {
+ intValue, _ := strconv.Atoi(str)
+ return intValue
+}
+
+// string to int64(10进制)
+func (convert *Convert) StringToInt64(str string) int64 {
+ intValue, _ := strconv.ParseInt(str, 10, 64)
+ return intValue
+}
+
+//int 转化为10进制字符串 IntToString(number, 10)
+func (convert *Convert) IntToTenString(number int) string {
+ return strconv.Itoa(number)
+}
+
+// float 转化为字符串
+func (convert *Convert) FloatToString(f float64, fmt byte, prec, bitSize int) string {
+ return strconv.FormatFloat(f, fmt, prec, bitSize)
+}
diff --git a/at-admin/app/utils/date.go b/at-admin/app/utils/date.go
new file mode 100644
index 0000000..8744f02
--- /dev/null
+++ b/at-admin/app/utils/date.go
@@ -0,0 +1,34 @@
+package utils
+
+import (
+ "github.com/astaxie/beego"
+ "time"
+)
+
+type Date struct{}
+
+func NewDate() *Date {
+ return &Date{}
+}
+
+//格式化 unix 时间戳
+func (date *Date) Format(unixTime interface{}, format string) string {
+
+ convert := NewConvert();
+ var convertTime int64
+
+ switch unixTime.(type) {
+ case string:
+ convertTime = convert.StringToInt64(unixTime.(string))
+ case int:
+ convertTime = int64(unixTime.(int))
+ case int8:
+ convertTime = int64(unixTime.(int8))
+ case int16:
+ convertTime = int64(unixTime.(int16))
+ case int32:
+ convertTime = int64(unixTime.(int32))
+ }
+
+ return beego.Date(time.Unix(convertTime, 0), format);
+}
diff --git a/at-admin/app/utils/encrypt.go b/at-admin/app/utils/encrypt.go
new file mode 100644
index 0000000..ca8fee4
--- /dev/null
+++ b/at-admin/app/utils/encrypt.go
@@ -0,0 +1,51 @@
+package utils
+
+import (
+ "crypto/md5"
+ "encoding/base64"
+ "encoding/hex"
+)
+
+const (
+ BASE_64_TABLE = "1234567890poiuytreqwasdfghjklmnbvcxzQWERTYUIOPLKJHGFDSAZXCVBNM-_"
+)
+
+type Encrypt struct{}
+
+func NewEncrypt() *Encrypt {
+ return &Encrypt{}
+}
+
+//base64 加密
+func (encrypt *Encrypt) Base64Encode(str string) string {
+ var coder = base64.NewEncoding(BASE_64_TABLE)
+ var src []byte = []byte(str)
+ return string([]byte(coder.EncodeToString(src)))
+}
+
+//base64 加密
+func (encrypt *Encrypt) Base64EncodeBytes(bytes []byte) []byte {
+ var coder = base64.NewEncoding(BASE_64_TABLE)
+ return []byte(coder.EncodeToString(bytes))
+}
+
+//base64 解密
+func (encrypt *Encrypt) Base64Decode(str string) (string, error) {
+ var src []byte = []byte(str)
+ var coder = base64.NewEncoding(BASE_64_TABLE)
+ by, err := coder.DecodeString(string(src))
+ return string(by), err
+}
+
+//base64 解密
+func (encrypt *Encrypt) Base64DecodeBytes(str string) ([]byte, error) {
+ var coder = base64.NewEncoding(BASE_64_TABLE)
+ return coder.DecodeString(str)
+}
+
+//md5加密
+func (encrypt *Encrypt) Md5Encode(str string) string {
+ hash := md5.New()
+ hash.Write([]byte(str))
+ return hex.EncodeToString(hash.Sum(nil))
+}
diff --git a/at-admin/app/utils/misc.go b/at-admin/app/utils/misc.go
new file mode 100644
index 0000000..400a51d
--- /dev/null
+++ b/at-admin/app/utils/misc.go
@@ -0,0 +1,110 @@
+package utils
+
+import (
+ "fmt"
+ "math"
+ "math/rand"
+ "strings"
+ "time"
+)
+
+type Misc struct{}
+
+func NewMisc() *Misc {
+ return &Misc{}
+}
+func (m *Misc) RandString(strlen int) string {
+ codes := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ codeLen := len(codes)
+ data := make([]byte, strlen)
+ rand.Seed(time.Now().UnixNano() + rand.Int63() + rand.Int63() + rand.Int63() + rand.Int63())
+ for i := 0; i < strlen; i++ {
+ idx := rand.Intn(codeLen)
+ data[i] = byte(codes[idx])
+ }
+ return string(data)
+}
+
+/**
+ * 分页方法
+ * @param type $total 一共多少记录
+ * @param type $page 当前是第几页
+ * @param type $pagesize 每页多少
+ * @param type $url url是什么,url里面的{page}会被替换成页码
+ * @param array $order 分页条的组成,是一个数组,可以按着1-6的序号,选择分页条组成部分和每个部分的顺序
+ * @param int $a_count 分页条中a页码链接的总数量,不包含当前页的a标签,默认10个。
+ * @return type String
+ * echo Sr::page(100,3,10,'?article/list/{page}',array(3,4,5,1,2,6));
+ */
+func (m *Misc) Page(total, page, pagesize int, url string, args ...interface{}) string {
+ order := []int{1, 2, 3, 4, 5, 6}
+ a_count := 10
+ if len(args) >= 1 {
+ order = args[0].([]int)
+ }
+ if len(args) >= 2 {
+ a_count = args[1].(int)
+ }
+ a_num := a_count
+ first := "首页"
+ last := "尾页"
+ pre := "上页"
+ next := "下页"
+ if a_num%2 == 0 {
+ a_num++
+ }
+ pages := int(math.Ceil(float64(total) / float64(pagesize)))
+ curpage := page
+ if curpage > pages || curpage <= 0 {
+ curpage = 1
+ }
+ body := ``
+ prefix := ""
+ subfix := ""
+ start := curpage - ((a_num - 1) / 2)
+ end := curpage + ((a_num - 1) / 2)
+ if start <= 0 {
+ start = 1
+ }
+ if end > pages {
+ end = pages
+ }
+ if pages >= a_num {
+ if curpage <= (a_num-1)/2 {
+ end = a_num
+ }
+ if end-curpage <= (a_num-1)/2 {
+ start -= int(math.Floor(float64(a_num)/float64(2))) - (end - curpage)
+ }
+ }
+ for i := start; i <= end; i++ {
+ if i == curpage {
+ body += fmt.Sprintf(`%d `, i)
+ } else {
+ body += fmt.Sprintf(`%d `, strings.Replace(url, "{page}", fmt.Sprintf("%d", i), 1), i)
+
+ }
+ }
+ body += " "
+ if curpage > 1 {
+ prefix = fmt.Sprintf(`%s %s `, strings.Replace(url, "{page}", fmt.Sprintf("%d", 1), 1), first, strings.Replace(url, "{page}", fmt.Sprintf("%d", curpage-1), 1), pre)
+ }
+ if curpage != pages {
+ subfix = fmt.Sprintf(`%s %s `, strings.Replace(url, "{page}", fmt.Sprintf("%d", curpage+1), 1), next, strings.Replace(url, "{page}", fmt.Sprintf("%d", pages), 1), last)
+ }
+ info := fmt.Sprintf(`第%d/%d页 `, curpage, pages)
+ id := fmt.Sprintf("gsd09fhas9d%d%d%d", rand.Intn(1000), rand.Intn(1000), rand.Intn(1000))
+ gostr := fmt.Sprintf(`转到 `, id, pages, url, id, id)
+ totalstr := fmt.Sprintf(`共%d条 `, total)
+ pagenation := []string{totalstr, info, prefix, body, subfix, gostr}
+ output := []string{}
+ for _, v := range order {
+ if v-1 < len(pagenation) && v-1 >= 0 {
+ output = append(output, pagenation[v-1])
+ }
+ }
+ if pages > 1 {
+ return strings.Join(output, "")
+ }
+ return ""
+}
diff --git a/at-admin/app/utils/urls.go b/at-admin/app/utils/urls.go
new file mode 100644
index 0000000..e5e4951
--- /dev/null
+++ b/at-admin/app/utils/urls.go
@@ -0,0 +1,21 @@
+package utils
+
+import (
+ "fmt"
+ "net/url"
+)
+
+type Urls struct {}
+
+func NewUrls() *Urls {
+ return &Urls{}
+}
+
+func (urls *Urls) UrlEncode(urlStr string) string {
+
+ fmt.Println(urlStr)
+ urlParse, _ := url.Parse(urlStr)
+ urlEncode := urlParse.Query().Encode()
+ fmt.Println(urlParse.EscapedPath());
+ return "http://" + urlParse.Host + urlParse.EscapedPath() + "?" + urlEncode;
+}
\ No newline at end of file
diff --git a/at-admin/app/views/common/foot.html b/at-admin/app/views/common/foot.html
new file mode 100755
index 0000000..08b362a
--- /dev/null
+++ b/at-admin/app/views/common/foot.html
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/at-admin/app/views/common/head.html b/at-admin/app/views/common/head.html
new file mode 100755
index 0000000..c9fc9b8
--- /dev/null
+++ b/at-admin/app/views/common/head.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/error/500-full.html b/at-admin/app/views/error/500-full.html
new file mode 100644
index 0000000..2a74111
--- /dev/null
+++ b/at-admin/app/views/error/500-full.html
@@ -0,0 +1,53 @@
+
+
+
+
+ 出错啦!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 很抱歉,服务器返回错误!
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/error/500.html b/at-admin/app/views/error/500.html
new file mode 100644
index 0000000..758d8c1
--- /dev/null
+++ b/at-admin/app/views/error/500.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+ 很抱歉,服务器返回错误!
+
+
+
+
以下是具体的错误信息:
+
+
+
+ {{.errorMessage}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/layout/default.html b/at-admin/app/views/layout/default.html
new file mode 100755
index 0000000..a5a759c
--- /dev/null
+++ b/at-admin/app/views/layout/default.html
@@ -0,0 +1,13 @@
+
+
+
+
+ {{.title}}
+ {{template "common/head.html" .}}
+
+
+
+ {{.LayoutContent}} {{template "common/foot.html" .}}
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/layout/form.html b/at-admin/app/views/layout/form.html
new file mode 100755
index 0000000..f1b7767
--- /dev/null
+++ b/at-admin/app/views/layout/form.html
@@ -0,0 +1,24 @@
+
+
+
+
+ {{.titles}}
+ {{template "common/head.html" .}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{.LayoutContent}} {{template "common/foot.html" .}}
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/layout/login.html b/at-admin/app/views/layout/login.html
new file mode 100755
index 0000000..969d3dc
--- /dev/null
+++ b/at-admin/app/views/layout/login.html
@@ -0,0 +1,225 @@
+
+
+
+
+
+ {{.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/layout/main.html b/at-admin/app/views/layout/main.html
new file mode 100755
index 0000000..79937b9
--- /dev/null
+++ b/at-admin/app/views/layout/main.html
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+ {{.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 后台
+
+
+
+
+
+ Welcome
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/layout/modules/web/default.html b/at-admin/app/views/layout/modules/web/default.html
new file mode 100755
index 0000000..9ccaf74
--- /dev/null
+++ b/at-admin/app/views/layout/modules/web/default.html
@@ -0,0 +1 @@
+{{template "layout/default.html" .}}
\ No newline at end of file
diff --git a/at-admin/app/views/layout/modules/web/form.html b/at-admin/app/views/layout/modules/web/form.html
new file mode 100755
index 0000000..880b52a
--- /dev/null
+++ b/at-admin/app/views/layout/modules/web/form.html
@@ -0,0 +1 @@
+{{template "layout/form.html" .}}
\ No newline at end of file
diff --git a/at-admin/app/views/login/login.html b/at-admin/app/views/login/login.html
new file mode 100755
index 0000000..e69de29
diff --git a/at-admin/app/views/main/default.html b/at-admin/app/views/main/default.html
new file mode 100755
index 0000000..2139272
--- /dev/null
+++ b/at-admin/app/views/main/default.html
@@ -0,0 +1,86 @@
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/main/index.html b/at-admin/app/views/main/index.html
new file mode 100755
index 0000000..e69de29
diff --git a/at-admin/app/views/modules/web/area/form.html b/at-admin/app/views/modules/web/area/form.html
new file mode 100755
index 0000000..41ef191
--- /dev/null
+++ b/at-admin/app/views/modules/web/area/form.html
@@ -0,0 +1,53 @@
+
+{{$area:=.area}} {{$regions:=.regions}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/area/list.html b/at-admin/app/views/modules/web/area/list.html
new file mode 100644
index 0000000..5eff0d6
--- /dev/null
+++ b/at-admin/app/views/modules/web/area/list.html
@@ -0,0 +1,67 @@
+{{$areas:=.areas}}
+
+
+
+
+
+
+ ID
+ 区域名称
+ 类型
+ 访问控制
+ 创建时间
+ 更新时间
+ 操作
+
+
+
+ {{range $area := $areas}}
+
+ {{$area.area_id}}
+ {{$area.name}}
+ {{$area.cs_type}}
+ {{if eq $area.is_forbidden "1"}}
+ 禁止 {{else}}
+ 允许 {{end}}
+
+
+ {{dateFormat $area.create_time "Y-m-d H:i:s"}}
+
+
+ {{dateFormat $area.update_time "Y-m-d H:i:s"}}
+
+
+ 修改
+ 删除
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/client/form.html b/at-admin/app/views/modules/web/client/form.html
new file mode 100755
index 0000000..3770d9e
--- /dev/null
+++ b/at-admin/app/views/modules/web/client/form.html
@@ -0,0 +1,45 @@
+
+{{$client:=.client}}
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/client/list.html b/at-admin/app/views/modules/web/client/list.html
new file mode 100644
index 0000000..13f9c2e
--- /dev/null
+++ b/at-admin/app/views/modules/web/client/list.html
@@ -0,0 +1,76 @@
+
+
+
+
+
+ {{if ne $.userID "0"}}
+
+ {{end}}
+
+
+
+
+
+
+ ID
+ 名称
+ Token
+ {{if ne $.userID "0"}}UserID{{else}}类型{{end}}
+ {{if eq $.userID "0"}}
+ 本地网络
+ 创建时间
+ 操作
+ {{else}}
+ 创建时间
+ {{end}}
+
+
+
+ {{range $client := .clients}}
+
+ {{$client.client_id}}
+ {{$client.name}}
+ {{$client.token}}
+
+ {{if eq $client.user_id "0"}} 系统 {{else}} {{$client.user_id}} {{end}}
+
+ {{if eq $client.user_id "0"}}
+ {{$client.local_host}}:{{$client.local_port}}
+
+ {{dateFormat $client.create_time "Y-m-d H:i:s"}}
+
+
+ 修改
+ 重置
+ 删除
+
+ {{else}}
+
+ {{dateFormat $client.create_time "Y-m-d H:i:s"}}
+
+ {{end}}
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/cluster/form.html b/at-admin/app/views/modules/web/cluster/form.html
new file mode 100755
index 0000000..c174d48
--- /dev/null
+++ b/at-admin/app/views/modules/web/cluster/form.html
@@ -0,0 +1,51 @@
+
+{{$cluster:=.cluster}} {{$regions:=.regions}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/cluster/list.html b/at-admin/app/views/modules/web/cluster/list.html
new file mode 100644
index 0000000..fc74482
--- /dev/null
+++ b/at-admin/app/views/modules/web/cluster/list.html
@@ -0,0 +1,55 @@
+{{$regions:=.regions}} {{$clusters:=.clusters}}
+
+
+
+
+
+
+
+ ID
+ 区域
+ 名称
+ IP
+ SYSCONN
+ CONN
+ 网速
+ 更新时间
+ 状态
+ 操作
+
+
+
+ {{range $k,$region:=$regions}} {{range $cluster := $clusters}} {{if eq $region.region_id $cluster.region_id}}
+
+ {{$cluster.cluster_id}}
+
+ {{$region.parent}}:{{$region.name}}
+
+ {{$cluster.name}}
+ {{$cluster.ip}}
+ {{$cluster.system_conn_number}}
+ {{$cluster.tunnel_conn_number}}
+ {{$cluster.bandwidth_human}}/s
+
+ {{dateFormat $cluster.update_time "Y-m-d H:i:s"}}
+
+
+ {{if eq $cluster.is_disable "0"}}
+ 正常 {{else}}
+ 禁用 {{end}}
+
+
+ 统计
+ 修改
+ 删除 {{if eq $cluster.is_disable "0"}}
+ 禁用 {{else}}
+ 恢复 {{end}}
+
+
+ {{end}} {{end}} {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/cluster/statistic.html b/at-admin/app/views/modules/web/cluster/statistic.html
new file mode 100644
index 0000000..9659178
--- /dev/null
+++ b/at-admin/app/views/modules/web/cluster/statistic.html
@@ -0,0 +1,429 @@
+
+ 系统全局统计
+
+
+ 系统连接数
+ Cluster连接数
+ 网速
+ 更新时间
+
+
+
+
+
+
+
+
+ 隧道全局统计
+
+
+ Tunnels
+ Servers
+ Clients
+ Connections
+ Upload
+ Download
+ Total
+ 更新时间
+
+
+
+
+
+
+
+
+ 隧道统计速度排列,前20个
+
+
+ TunnelID
+ Connections
+ Upload
+ Download
+ Total
+ Limit
+ 更新时间
+
+
+
+
+
+
+
+
+ 隧道统计连接数排列,前20个
+
+
+ TunnelID
+ Connections
+ Upload
+ Download
+ Total
+ Limit
+ 更新时间
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/conn/list.html b/at-admin/app/views/modules/web/conn/list.html
new file mode 100644
index 0000000..a4dd415
--- /dev/null
+++ b/at-admin/app/views/modules/web/conn/list.html
@@ -0,0 +1,71 @@
+
+{{$conns:=.conns}}
+
+
+
+
+
+
+
+ 隧道ID
+ ClusterID
+ ServerID
+ UserID
+ 连接数
+ 上传速度
+ 下载速度
+ 更新时间
+
+
+
+ {{range $conn := .conns}}
+
+ {{$conn.tunnel_id}}
+ {{$conn.cluster_id}}
+ {{$conn.server_id}}
+ {{$conn.user_id}}
+ {{$conn.count}}
+ {{$conn.upload}}
+ {{$conn.download}}
+
+ {{dateFormat $conn.update_time "Y-m-d H:i:s"}}
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/ip_list/form.html b/at-admin/app/views/modules/web/ip_list/form.html
new file mode 100755
index 0000000..a168821
--- /dev/null
+++ b/at-admin/app/views/modules/web/ip_list/form.html
@@ -0,0 +1,53 @@
+
+{{$ip_list:=.ip_list}} {{$regions:=.regions}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/ip_list/list.html b/at-admin/app/views/modules/web/ip_list/list.html
new file mode 100644
index 0000000..2fd3a88
--- /dev/null
+++ b/at-admin/app/views/modules/web/ip_list/list.html
@@ -0,0 +1,67 @@
+ {{$ip_lists:=.ip_lists}}
+
+
+
+
+
+
+ ID
+ IP
+ 类型
+ 访问控制
+ 创建时间
+ 更新时间
+ 操作
+
+
+
+ {{range $ip_list := $ip_lists}}
+
+ {{$ip_list.ip_list_id}}
+ {{$ip_list.ip}}
+ {{$ip_list.cs_type}}
+ {{if eq $ip_list.is_forbidden "1"}}
+ 禁止 {{else}}
+ 允许 {{end}}
+
+
+ {{dateFormat $ip_list.create_time "Y-m-d H:i:s"}}
+
+
+ {{dateFormat $ip_list.update_time "Y-m-d H:i:s"}}
+
+
+ 修改
+ 删除
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/online/list.html b/at-admin/app/views/modules/web/online/list.html
new file mode 100644
index 0000000..1b92c74
--- /dev/null
+++ b/at-admin/app/views/modules/web/online/list.html
@@ -0,0 +1,65 @@
+{{$onlines:=.onlines}}
+
+
+
+
+
+
+
+ ID
+ UserID
+ ClusterID
+ 上线IP
+ {{if eq $.cs "server"}}ServerID{{else}}ClientID{{end}}
+
+ 上线时间
+
+
+
+ {{range $online := .onlines}}
+
+ {{$online.online_id}}
+ {{$online.user_id}}{{if eq $online.user_id "0"}} (系统) {{end}}
+ {{$online.cluster_id}}
+ {{$online.cs_ip}}
+ {{$online.cs_id}}
+
+
+ {{dateFormat $online.create_time "Y-m-d H:i:s"}}
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/package/form.html b/at-admin/app/views/modules/web/package/form.html
new file mode 100755
index 0000000..25c7a43
--- /dev/null
+++ b/at-admin/app/views/modules/web/package/form.html
@@ -0,0 +1,86 @@
+
+
+{{$package:=.package}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/package/list.html b/at-admin/app/views/modules/web/package/list.html
new file mode 100644
index 0000000..13f9b3b
--- /dev/null
+++ b/at-admin/app/views/modules/web/package/list.html
@@ -0,0 +1,78 @@
+
+{{$packages:=.packages}}
+
+
+
+
+
+
+
+ ID
+ UserID
+ 流量包大小
+ 已用流量
+ 状态
+ 生效时间
+ 过期时间
+ 更新时间
+ 获取方式
+ 操作
+
+
+
+ {{range $package := .packages}}
+
+ {{$package.package_id}}
+ {{$package.user_id}}
+ {{$package.bytes_total_human}}
+ {{$package.bytes_use_human}}
+ {{str2html $package.status}}
+
+ {{dateFormat $package.start_time "Y-m-d H:i:s"}}
+
+
+ {{dateFormat $package.end_time "Y-m-d H:i:s"}}
+
+
+ {{dateFormat $package.update_time "Y-m-d H:i:s"}}
+
+ {{$package.comment}}
+
+ 修改
+
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/region/form.html b/at-admin/app/views/modules/web/region/form.html
new file mode 100755
index 0000000..45b510d
--- /dev/null
+++ b/at-admin/app/views/modules/web/region/form.html
@@ -0,0 +1,48 @@
+
+{{$region:=.region}} {{$regions:=.regions}}
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/region/list.html b/at-admin/app/views/modules/web/region/list.html
new file mode 100644
index 0000000..e562385
--- /dev/null
+++ b/at-admin/app/views/modules/web/region/list.html
@@ -0,0 +1,14 @@
+{{$regions:=.regions}}
+
+
+
+ {{range $region := $regions}} {{if eq $region.parent_id "0"}}
+
+ {{$region.name}} 改 | 删
+ {{range $item := $regions}} {{if eq $item.parent_id $region.region_id}}
+ {{$item.name}}改 | 删
+ {{end}} {{end}}
+
+ {{end}} {{end}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/role/form.html b/at-admin/app/views/modules/web/role/form.html
new file mode 100755
index 0000000..f83913f
--- /dev/null
+++ b/at-admin/app/views/modules/web/role/form.html
@@ -0,0 +1,91 @@
+
+{{$role:=.role}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/role/list.html b/at-admin/app/views/modules/web/role/list.html
new file mode 100644
index 0000000..0817e96
--- /dev/null
+++ b/at-admin/app/views/modules/web/role/list.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+ ID
+ 角色名
+ 带宽限制
+ Server区域
+ Client区域
+ 隧道模式
+ 创建时间
+ 操作
+
+
+
+ {{range $role := .roles}}
+
+ {{$role.role_id}}
+ {{$role.name}}
+ {{$role.bandwidth_human}}
+
+ {{if eq $role.server_area "china"}}中国{{end}} {{if eq $role.server_area "foreign"}}国外{{end}} {{if eq $role.server_area "all"}}全部{{end}}
+
+
+ {{if eq $role.client_area "china"}}中国{{end}} {{if eq $role.client_area "foreign"}}国外{{end}} {{if eq $role.client_area "all"}}全部{{end}}
+
+
+ {{$role.tunnel_mode_human}}
+
+
+ {{dateFormat $role.create_time "Y-m-d H:i:s"}}
+
+
+ 区域
+ 修改
+ 删除
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/role/region.html b/at-admin/app/views/modules/web/role/region.html
new file mode 100644
index 0000000..e42bee6
--- /dev/null
+++ b/at-admin/app/views/modules/web/role/region.html
@@ -0,0 +1,44 @@
+
+
+{{$regions:=.regions}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/server/form.html b/at-admin/app/views/modules/web/server/form.html
new file mode 100755
index 0000000..4e3566e
--- /dev/null
+++ b/at-admin/app/views/modules/web/server/form.html
@@ -0,0 +1,36 @@
+
+{{$server:=.server}}
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/server/list.html b/at-admin/app/views/modules/web/server/list.html
new file mode 100644
index 0000000..53f1c2d
--- /dev/null
+++ b/at-admin/app/views/modules/web/server/list.html
@@ -0,0 +1,66 @@
+
+
+
+
+ {{if ne $.userID "0"}}
+
+ {{end}}
+
+
+
+
+
+
+ ID
+ 名称
+ Token
+ UserID
+ 创建时间
+ {{if eq $.userID "0"}}
+ 操作
+ {{end}}
+
+
+
+ {{range $server := .servers}}
+
+ {{$server.server_id}}
+ {{$server.name}}
+ {{$server.token}}
+
+ {{if eq $server.user_id "0"}} 系统 {{else}} {{$server.user_id}} {{end}}
+
+
+ {{dateFormat $server.create_time "Y-m-d H:i:s"}}
+
+
+ {{if eq $server.user_id "0"}}
+
+ 修改
+ 重置
+ 删除
+
+ {{end}}
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/tunnel/list.html b/at-admin/app/views/modules/web/tunnel/list.html
new file mode 100644
index 0000000..f5d418f
--- /dev/null
+++ b/at-admin/app/views/modules/web/tunnel/list.html
@@ -0,0 +1,67 @@
+{{$tunnels:=.tunnels}}
+
+
+
+
+
+
+
+ ID
+ 模式
+ 用户ID
+ ServerID
+ ClientID
+ ClusterID
+ 协议
+ 监听
+ 本地
+ 带宽
+ 更新时间
+
+
+
+ {{range $tunnel := .tunnels}}
+
+ {{$tunnel.tunnel_id}}
+ {{if eq $tunnel.mode "0"}}普通{{else}}{{if eq $tunnel.mode "1"}}高级{{else}}特殊{{end}}{{end}}
+ {{$tunnel.user_id}}
+ {{$tunnel.server_id}}
+ {{$tunnel.client_id}}
+ {{$tunnel.cluster_id}}
+ {{$tunnel.protocol}}
+ {{$tunnel.server_listen_ip}}{{$tunnel.server_listen_port}}
+ {{$tunnel.client_local_host}}{{$tunnel.client_local_port}}
+ {{$tunnel.bandwidth_human}}
+ {{dateFormat $tunnel.update_time "Y-m-d H:i:s"}}
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/user/form.html b/at-admin/app/views/modules/web/user/form.html
new file mode 100755
index 0000000..205c79e
--- /dev/null
+++ b/at-admin/app/views/modules/web/user/form.html
@@ -0,0 +1,75 @@
+
+{{$user:=.user}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/modules/web/user/list.html b/at-admin/app/views/modules/web/user/list.html
new file mode 100644
index 0000000..1bb0d35
--- /dev/null
+++ b/at-admin/app/views/modules/web/user/list.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+ ID
+ 昵称
+ 登录名
+ 角色
+ 邮箱
+ 状态
+ 创建时间
+ 操作
+
+
+
+ {{range $user := .users}}
+
+ {{$user.user_id}}
+ {{$user.nickname}}
+ {{$user.username}}
+
+ {{range $userId, $roleName := $.userRoles}} {{if eq $userId $user.user_id}} {{$roleName}} {{end}} {{end}}
+
+ {{$user.email}}
+
+ {{if eq $user.is_forbidden "0"}}
+ 正常 {{else}}
+ 屏蔽 {{end}}
+
+
+ {{dateFormat $user.create_time "Y-m-d H:i:s"}}
+
+
+ 修改 {{if eq $user.is_forbidden "0"}}
+ 禁用 {{else}}
+ 恢复 {{end}}
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/privilege/form.html b/at-admin/app/views/privilege/form.html
new file mode 100755
index 0000000..64e8bf4
--- /dev/null
+++ b/at-admin/app/views/privilege/form.html
@@ -0,0 +1,149 @@
+
+{{$privilege:=.privilege}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/privilege/list.html b/at-admin/app/views/privilege/list.html
new file mode 100644
index 0000000..bc436ab
--- /dev/null
+++ b/at-admin/app/views/privilege/list.html
@@ -0,0 +1,17 @@
+
+
+ {{range $navigator := .navigators}}
+
{{$navigator.name}} 改 | 删
+ {{range $menu := $.menus}} {{if eq $menu.parent_id $navigator.privilege_id}}
+
+ {{$menu.name}} 改 | 删
+ {{range $controller := $.controllers}} {{if eq $controller.parent_id $menu.privilege_id}}
+ {{$controller.name}}改 | 删
+ {{end}} {{end}}
+
+ {{end}} {{end}} {{end}}
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/role/form.html b/at-admin/app/views/role/form.html
new file mode 100755
index 0000000..51e2fa0
--- /dev/null
+++ b/at-admin/app/views/role/form.html
@@ -0,0 +1,27 @@
+
+{{$role:=.role}}
+
\ No newline at end of file
diff --git a/at-admin/app/views/role/list.html b/at-admin/app/views/role/list.html
new file mode 100644
index 0000000..50391c2
--- /dev/null
+++ b/at-admin/app/views/role/list.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+ ID
+ 角色名
+ 状态
+ 创建时间
+ 操作
+
+
+
+ {{range $role := .roles}}
+
+ {{$role.role_id}}
+ {{$role.name}}
+
+ {{if eq $role.is_delete "0"}}
+ 正常 {{else}}
+ 删除 {{end}}
+
+
+ {{dateFormat $role.create_time "Y-m-d H:i:s"}}
+
+
+ 权限
+ 修改
+ 删除
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/role/privilege.html b/at-admin/app/views/role/privilege.html
new file mode 100644
index 0000000..f07b3d7
--- /dev/null
+++ b/at-admin/app/views/role/privilege.html
@@ -0,0 +1,52 @@
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/system/base.html b/at-admin/app/views/system/base.html
new file mode 100755
index 0000000..1f776ff
--- /dev/null
+++ b/at-admin/app/views/system/base.html
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/test/form.html b/at-admin/app/views/test/form.html
new file mode 100644
index 0000000..83db2b2
--- /dev/null
+++ b/at-admin/app/views/test/form.html
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+
+ 选择节点
+
+ jadhgjashdasgdsjagdj
+ jadhgjashdasgdsjagdj
+
+
+
+
+
+ 添加消息
+ 测试消息
+ 重启节点
+
+
+
+
+
+
+
+
+
+
+ 节点
+
+ dlasdljalks
+ dlasdljalks
+ dlasdljalks
+
+
+
+
+
+ 日志类型
+
+ ERROR
+ INFO
+ DEBUG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 消息名称
+ 交换器模式
+ 消费接口
+ RouteKey
+ 状态
+ 超时
+ 备注
+ 操作
+
+
+
+
+ ad
+ da
+ da
+ da
+
+ waiting
+
+ ad
+ ad
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/user/changepassword.html b/at-admin/app/views/user/changepassword.html
new file mode 100755
index 0000000..9b980f3
--- /dev/null
+++ b/at-admin/app/views/user/changepassword.html
@@ -0,0 +1,29 @@
+
\ No newline at end of file
diff --git a/at-admin/app/views/user/form.html b/at-admin/app/views/user/form.html
new file mode 100755
index 0000000..a646f1a
--- /dev/null
+++ b/at-admin/app/views/user/form.html
@@ -0,0 +1,84 @@
+
+{{$user:=.user}}
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/user/list.html b/at-admin/app/views/user/list.html
new file mode 100644
index 0000000..221ff18
--- /dev/null
+++ b/at-admin/app/views/user/list.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+ ID
+ 用户名
+ 真实姓名
+ 角色
+ 邮箱
+ 状态
+ 创建时间
+ 操作
+
+
+
+ {{range $user := .users}}
+
+ {{$user.user_id}}
+ {{$user.username}}
+ {{$user.given_name}}
+
+ {{range $userId, $roleName := $.userRoles}} {{if eq $userId $user.user_id}} {{$roleName}} {{end}} {{end}}
+
+ {{$user.email}}
+
+ {{if eq $user.is_forbidden "0"}}
+ 正常 {{else}}
+ 屏蔽 {{end}}
+
+
+ {{dateFormat $user.create_time "Y-m-d H:i:s"}}
+
+
+ 修改 {{if eq $user.is_forbidden "0"}}
+ 禁用 {{else}}
+ 恢复 {{end}}
+
+
+ {{end}}
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/user/list.html.back b/at-admin/app/views/user/list.html.back
new file mode 100644
index 0000000..974b4e3
--- /dev/null
+++ b/at-admin/app/views/user/list.html.back
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/app/views/user/profile.html b/at-admin/app/views/user/profile.html
new file mode 100644
index 0000000..4464445
--- /dev/null
+++ b/at-admin/app/views/user/profile.html
@@ -0,0 +1,58 @@
+
+{{$user:=.user}}
+
\ No newline at end of file
diff --git a/at-admin/conf/app.conf b/at-admin/conf/app.conf
new file mode 100755
index 0000000..de14068
--- /dev/null
+++ b/at-admin/conf/app.conf
@@ -0,0 +1,33 @@
+runmode = "${UMSMODE||dev}"
+appname = anytnnel
+httpport = 18090
+db_port="3306"
+db_conn_max_idle=30
+db_conn_max_connection=50
+sessiongcmaxlifetime=36000
+sessioncookielifetime=36000
+
+#database system
+db_name="anytunnel_system"
+db_table_prefix="system_"
+
+#database base
+db.base.name="anytunnel_base"
+db.base.table_prefix="at_"
+
+cluster.api.port=37080
+
+[dev]
+db_host="127.0.0.1"
+db_user="user"
+db_pass="admin"
+sessionprovider="file"
+sessionproviderconfig=".sessions"
+
+[mac]
+db_host="127.0.0.1"
+db_user="root"
+db_pass="root"
+
+[prod]
+httpport = 8888
diff --git a/at-admin/docs/form.txt b/at-admin/docs/form.txt
new file mode 100644
index 0000000..db05254
--- /dev/null
+++ b/at-admin/docs/form.txt
@@ -0,0 +1,22 @@
+表单使用说明:
+1.ajax 提交表单
+ 给form加上class:"ajaxform"即可.
+ 回调:
+ 默认会自动判断返回的数据是否是json,判断code执行错误和成功的处理提示.
+ 如果需要额外的回调,可以给form定义下面的属性,然后在页面定义对应名称的function即可.
+ ajaxPre:"formPre" //提交表单之前执行的方法,参数是:(arr, $form, options),返回false阻止表单提交
+ ajaxError:"formError"//提交表单出错执行的方法,参数是:(jqXHR, textStatus, textErrorThrown),返回false阻止表单提交
+ ajaxSuccess:"formSuccess"//提交表单成功执行的方法,参数是:(data, textStatus, jqXHR),返回false阻止表单提交
+ ajaxAlways:"formAlways"//提交表单之后执行的方法,参数是:(jqXHR, textStatus),返回false阻止表单提交
+ 返回实例:
+ {
+ code:1|0,
+ message:"anyformat tip",
+ data:'any format data',
+ redirect:{
+ url:'url',
+ sleep:500
+ }
+ }
+2.select 默认值设置,只需要对select标签设置一个default属性和值即可.
+ 那么值对应的option就会被默认选中.
diff --git a/at-admin/main.go b/at-admin/main.go
new file mode 100755
index 0000000..605cc6c
--- /dev/null
+++ b/at-admin/main.go
@@ -0,0 +1,11 @@
+package main
+
+import (
+ _ "anytunnel/at-admin/app/routers"
+
+ "github.com/astaxie/beego"
+)
+
+func main() {
+ beego.Run()
+}
diff --git a/at-admin/static/index/7V_Hf8uqhTnCHU5pdwV73A.woff2 b/at-admin/static/index/7V_Hf8uqhTnCHU5pdwV73A.woff2
new file mode 100644
index 0000000..31d0e99
Binary files /dev/null and b/at-admin/static/index/7V_Hf8uqhTnCHU5pdwV73A.woff2 differ
diff --git a/at-admin/static/index/D3Kro_SQxlEekR5WQVBxG-vvDin1pK8aKteLpeZ5c0A.woff2 b/at-admin/static/index/D3Kro_SQxlEekR5WQVBxG-vvDin1pK8aKteLpeZ5c0A.woff2
new file mode 100644
index 0000000..bd46448
Binary files /dev/null and b/at-admin/static/index/D3Kro_SQxlEekR5WQVBxG-vvDin1pK8aKteLpeZ5c0A.woff2 differ
diff --git a/at-admin/static/index/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff b/at-admin/static/index/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff
new file mode 100644
index 0000000..905f307
Binary files /dev/null and b/at-admin/static/index/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff differ
diff --git a/at-admin/static/index/ace-elements.min.js b/at-admin/static/index/ace-elements.min.js
new file mode 100644
index 0000000..ad272fc
--- /dev/null
+++ b/at-admin/static/index/ace-elements.min.js
@@ -0,0 +1,5 @@
+/*!
+ * Ace v1.4.0
+ */
+if("undefined"==typeof jQuery)throw new Error("Ace's JavaScript requires jQuery");!function(a,b){var c=function(b,c){function d(a){a.preventDefault(),a.stopPropagation();var b=A.offset(),c=b[o],d=u?a.pageY:a.pageX;d>c+G?(G=d-c-F+I,G>H&&(G=H)):(G=d-c-I,0>G&&(G=0)),l.update_scroll()}function e(b){b.preventDefault(),b.stopPropagation(),ba=aa=u?b.pageY:b.pageX,Q=!0,a("html").off("mousemove.ace_scroll").on("mousemove.ace_scroll",f),a(R).off("mouseup.ace_scroll").on("mouseup.ace_scroll",g),A.addClass("active"),S&&l.$element.trigger("drag.start")}function f(a){a.preventDefault(),a.stopPropagation(),ba=u?a.pageY:a.pageX,ba-aa+G>H?ba=aa+H-G:0>ba-aa+G&&(ba=aa-G),G+=ba-aa,aa=ba,0>G?G=0:G>H&&(G=H),l.update_scroll()}function g(b){b.preventDefault(),b.stopPropagation(),Q=!1,a("html").off(".ace_scroll"),a(R).off(".ace_scroll"),A.removeClass("active"),S&&l.$element.trigger("drag.end"),w&&W&&!Y&&i()}function h(a){var b=+new Date;if(Z&&b-da>1e3){var c=z[t];$!=c&&($=c,_=!0,l.reset(!0)),da=b}w&&W&&(null!=ca&&(clearTimeout(ca),ca=null),A.addClass("not-idle"),Y||1!=a||i())}function i(){null!=ca&&(clearTimeout(ca),ca=null),ca=setTimeout(function(){ca=null,A.removeClass("not-idle")},X)}function j(){A.css("visibility","hidden").addClass("scroll-hover"),N=u?parseInt(A.outerWidth())||0:parseInt(A.outerHeight())||0,A.css("visibility","").removeClass("scroll-hover")}function k(){if(V!==!1){var a=y.offset(),b=a.left,c=a.top;u?M||(b+=y.outerWidth()-N):M||(c+=y.outerHeight()-N),V===!0?A.css({top:parseInt(c),left:parseInt(b)}):"left"===V?A.css("left",parseInt(b)):"top"===V&&A.css("top",parseInt(c))}}var l=this,m=ace.helper.getAttrSettings(b,a.fn.ace_scroll.defaults),n=a.extend({},a.fn.ace_scroll.defaults,c,m);this.size=0,this.lock=!1,this.lock_anyway=!1,this.$element=a(b),this.element=b;var o,p,q,r,s,t,u=!0,v=!1,w=!1,x=!1,y=null,z=null,A=null,B=null,C=null,D=null,E=null,F=0,G=0,H=0,I=0,J=!0,K=!1,L="",M=!1,N=0,O=1,P=!1,Q=!1,R="onmouseup"in window?window:"html",S=n.dragEvent||!1,T=c.scrollEvent||!1,U=n.detached||!1,V=n.updatePos||!1,W=n.hideOnIdle||!1,X=n.hideDelay||1500,Y=!1,Z=n.observeContent||!1,$=0,_=!0;this.ref=function(){return this},this.create=function(b){if(!x){b&&(n=a.extend({},a.fn.ace_scroll.defaults,b)),this.size=parseInt(this.$element.attr("data-size"))||n.size||200,u=!n.horizontal,o=u?"top":"left",p=u?"height":"width",q=u?"maxHeight":"maxWidth",r=u?"clientHeight":"clientWidth",s=u?"scrollTop":"scrollLeft",t=u?"scrollHeight":"scrollWidth",this.$element.addClass("ace-scroll"),"static"==this.$element.css("position")?(P=this.element.style.position,this.element.style.position="relative"):P=!1;var c=null;U?c=a('').appendTo("body"):(this.$element.wrapInner('
'),this.$element.prepend('')),y=this.$element,U||(y=this.$element.find(".scroll-content").eq(0)),u||y.wrapInner("
"),z=y.get(0),U?(A=c,k()):A=this.$element.find(".scroll-track").eq(0),B=A.find(".scroll-bar").eq(0),C=A.get(0),D=B.get(0),E=D.style,u||A.addClass("scroll-hz"),n.styleClass&&(L=n.styleClass,A.addClass(L),M=!!L.match(/scroll\-left|scroll\-top/)),0==N&&(A.show(),j()),A.hide(),A.on("mousedown",d),B.on("mousedown",e),y.on("scroll",function(){J&&(G=parseInt(Math.round(this[s]*O)),E[o]=G+"px"),J=!1,T&&this.$element.trigger("scroll",[z])}),n.mouseWheel&&(this.lock=n.mouseWheelLock,this.lock_anyway=n.lockAnyway,this.$element.on(a.event.special.mousewheel?"mousewheel.ace_scroll":"mousewheel.ace_scroll DOMMouseScroll.ace_scroll",function(b){if(!v){if(h(!0),!w)return!l.lock_anyway;Q&&(Q=!1,a("html").off(".ace_scroll"),a(R).off(".ace_scroll"),S&&l.$element.trigger("drag.end")),b.deltaY=b.deltaY||0;var c=b.deltaY>0||b.originalEvent.detail<0||b.originalEvent.wheelDelta>0?1:-1,d=!1,e=z[r],f=z[s];l.lock||(d=-1==c?z[t]<=f+e:0==f),l.move_bar(!0);var g=parseInt(e/8);return 80>g&&(g=80),g>l.size&&(g=l.size),g+=1,z[s]=f-c*g,d&&!l.lock_anyway}}));var f=ace.vars.touch&&"ace_drag"in a.event.special&&n.touchDrag;if(f){var g="",m=f?"ace_drag":"swipe";this.$element.on(m+".ace_scroll",function(a){if(v)return void(a.retval.cancel=!0);if(h(!0),!w)return void(a.retval.cancel=this.lock_anyway);if(g=a.direction,u&&("up"==g||"down"==g)||!u&&("left"==g||"right"==g)){var b=u?a.dy:a.dx;0!=b&&(Math.abs(b)>20&&f&&(b=2*b),l.move_bar(!0),z[s]=z[s]+b)}})}W&&A.addClass("idle-hide"),Z&&A.on("mouseenter.ace_scroll",function(){Y=!0,h(!1)}).on("mouseleave.ace_scroll",function(){Y=!1,0==Q&&i()}),this.$element.on("mouseenter.ace_scroll touchstart.ace_scroll",function(a){_=!0,Z?h(!0):n.hoverReset&&l.reset(!0),A.addClass("scroll-hover")}).on("mouseleave.ace_scroll touchend.ace_scroll",function(){A.removeClass("scroll-hover")}),u||y.children(0).css(p,this.size),y.css(q,this.size),v=!1,x=!0}},this.is_active=function(){return w},this.is_enabled=function(){return!v},this.move_bar=function(a){J=a},this.get_track=function(){return C},this.reset=function(a){if(!v){x||this.create();var b=this.size;if(!a||_){if(_=!1,U){var c=parseInt(Math.round((parseInt(y.css("border-top-width"))+parseInt(y.css("border-bottom-width")))/2.5));b-=c}var d=u?z[t]:b;if(u&&0==d||!u&&0==this.element.scrollWidth)return void A.removeClass("scroll-active");var e=u?b:z.clientWidth;u||y.children(0).css(p,b),y.css(q,this.size),d>e?(w=!0,A.css(p,e).show(),O=parseFloat((e/d).toFixed(5)),F=parseInt(Math.round(e*O)),I=parseInt(Math.round(F/2)),H=e-F,G=parseInt(Math.round(z[s]*O)),E[p]=F+"px",E[o]=G+"px",A.addClass("scroll-active"),0==N&&j(),K||(n.reset&&(z[s]=0,E[o]=0),K=!0),U&&k()):(w=!1,A.hide(),A.removeClass("scroll-active"),y.css(q,""))}}},this.disable=function(){z[s]=0,E[o]=0,v=!0,w=!1,A.hide(),this.$element.addClass("scroll-disabled"),A.removeClass("scroll-active"),y.css(q,"")},this.enable=function(){v=!1,this.$element.removeClass("scroll-disabled")},this.destroy=function(){w=!1,v=!1,x=!1,this.$element.removeClass("ace-scroll scroll-disabled scroll-active"),this.$element.off(".ace_scroll"),U||(u||y.find("> div").children().unwrap(),y.children().unwrap(),y.remove()),A.remove(),P!==!1&&(this.element.style.position=P),null!=ca&&(clearTimeout(ca),ca=null)},this.modify=function(b){b&&(n=a.extend({},n,b)),this.destroy(),this.create(),_=!0,this.reset(!0)},this.update=function(b){b&&(n=a.extend({},n,b)),this.size=n.size||this.size,this.lock=n.mouseWheelLock||this.lock,this.lock_anyway=n.lockAnyway||this.lock_anyway,W=n.hideOnIdle||W,X=n.hideDelay||X,Z=n.observeContent||!1,S=n.dragEvent||!1,"undefined"!=typeof b.styleClass&&(L&&A.removeClass(L),L=b.styleClass,L&&A.addClass(L),M=!!L.match(/scroll\-left|scroll\-top/))},this.start=function(){z[s]=0},this.end=function(){z[s]=z[t]},this.hide=function(){A.hide()},this.show=function(){A.show()},this.update_scroll=function(){J=!1,E[o]=G+"px",z[s]=parseInt(Math.round(G/O))};var aa=-1,ba=-1,ca=null,da=0;return this.track_size=function(){return 0==N&&j(),N},this.create(),_=!0,this.reset(!0),$=z[t],this};a.fn.ace_scroll=function(d,e){var f,g=this.each(function(){var b=a(this),g=b.data("ace_scroll"),h="object"==typeof d&&d;g||b.data("ace_scroll",g=new c(this,h)),"string"==typeof d&&(f=g[d](e))});return f===b?g:f},a.fn.ace_scroll.defaults={size:200,horizontal:!1,mouseWheel:!0,mouseWheelLock:!1,lockAnyway:!1,styleClass:!1,observeContent:!1,hideOnIdle:!1,hideDelay:1500,hoverReset:!0,reset:!1,dragEvent:!1,touchDrag:!0,touchSwipe:!1,scrollEvent:!1,detached:!1,updatePos:!0}}(window.jQuery),function(a,b){var c=function(b,c){var d=ace.helper.getAttrSettings(b,a.fn.ace_colorpicker.defaults),e=a.extend({},a.fn.ace_colorpicker.defaults,c,d),f=a(b),g="",h="",i=null,j=[];f.addClass("hide").find("option").each(function(){var a="colorpick-btn",b=this.value.replace(/[^\w\s,#\(\)\.]/g,"");b.indexOf("number")>=0||(this.value!=b&&(this.value=b),this.selected&&(a+=" selected",h=b),j.push(b),g+=' ')}).end().on("change.color",function(){f.next().find(".btn-colorpicker").css("background-color",this.value)}).after('");var k=f.next().find(".dropdown-menu");k.on(ace.click_event,function(b,c){var d=a(b.target);if(!d.is(".colorpick-btn"))return!1;i&&i.removeClass("selected"),i=d,i.addClass("selected");var e=i.data("color");return c!==!0&&f.val(e).trigger("change"),f.next().find(".btn-colorpicker").css("background-color",e),b.preventDefault(),!0}),i=f.next().find("a.selected"),this.pick=function(c,d){if("number"==typeof c){if(c>=j.length)return;b.selectedIndex=c,k.find("a:eq("+c+")").trigger(ace.click_event,[!0])}else if("string"==typeof c){var e=c.replace(/[^\w\s,#\(\)\.]/g,"");if(c=j.indexOf(e),-1==c&&d===!0&&(j.push(e),a(" ").appendTo(f).val(e),a(' ').appendTo(k).find("a").css("background-color",e).data("color",e),c=j.length-1),-1==c)return;k.find("a:eq("+c+")").trigger(ace.click_event,[!0])}},this.destroy=function(){f.removeClass("hide").next().remove(),j=[]}};a.fn.ace_colorpicker=function(d,e){var f,g=this.each(function(){var b=a(this),g=b.data("ace_colorpicker"),h="object"==typeof d&&d;g||b.data("ace_colorpicker",g=new c(this,h)),"string"==typeof d&&(f=g[d](e))});return f===b?g:f},a.fn.ace_colorpicker.defaults={pull_right:!1,caret:!0,auto_pos:!0}}(window.jQuery),function(a,b){var c="multiple"in document.createElement("INPUT"),d="FileList"in window,e="FileReader"in window,f="File"in window,g=function(b,c){var d=this,e=ace.helper.getAttrSettings(b,a.fn.ace_file_input.defaults);this.settings=a.extend({},a.fn.ace_file_input.defaults,c,e),this.$element=a(b),this.element=b,this.disabled=!1,this.can_reset=!0,this.$element.off("change.ace_inner_call").on("change.ace_inner_call",function(a,b){return d.disabled||b===!0?void 0:i.call(d)});var f=this.$element.closest("label").css({display:"block"}),g=0==f.length?"label":"span";this.$element.wrap("<"+g+' class="ace-file-input" />'),this.apply_settings(),this.reset_input_field()};g.error={FILE_LOAD_FAILED:1,IMAGE_LOAD_FAILED:2,THUMBNAIL_FAILED:3},g.prototype.apply_settings=function(){var b=this;this.multi=this.$element.attr("multiple")&&c,this.well_style="well"==this.settings.style,this.well_style?(this.settings.thumbnail||(this.settings.thumbnail="small"),this.$element.parent().addClass("ace-file-multiple")):this.$element.parent().removeClass("ace-file-multiple"),this.$element.parent().find(":not(input[type=file])").remove(),this.$element.after(''+(this.settings.no_icon?' ':"")+" "),this.$label=this.$element.next(),this.$container=this.$element.closest(".ace-file-input");var e=!!this.settings.icon_remove;if(e){var f=a(' ').appendTo(this.$element.parent());f.on(ace.click_event,function(a){if(a.preventDefault(),!b.can_reset)return!1;var c=!0;if(b.settings.before_remove&&(c=b.settings.before_remove.call(b.element)),!c)return!1;b.reset_input();return!1})}this.settings.droppable&&d&&h.call(this)},g.prototype.show_file_list=function(b,c){var d="undefined"==typeof b?this.$element.data("ace_input_files"):b;if(d&&0!=d.length){this.well_style&&(this.$label.find(".ace-file-name").remove(),this.settings.btn_change||this.$label.addClass("hide-placeholder")),this.$label.attr("data-title",this.settings.btn_change).addClass("selected");for(var g=0;g ');var n=c===!0&&f&&d[g]instanceof File?a.trim(d[g].type):"",o=e&&this.settings.thumbnail&&(n.length>0&&n.match("image")||0==n.length&&"image"==i);if(o){var p=this;a.when(j.call(this,d[g])).fail(function(a){p.settings.preview_error&&p.settings.preview_error.call(p,h,a.code)})}}else this.$label.find(".ace-file-name").attr({"data-title":h}).find(ace.vars[".icon"]).attr("class",ace.vars.icon+m)}return!0}},g.prototype.reset_input=function(){this.reset_input_ui(),this.reset_input_field()},g.prototype.reset_input_ui=function(){this.$label.attr({"data-title":this.settings.btn_choose,"class":"ace-file-container"}).find(".ace-file-name:first").attr({"data-title":this.settings.no_file,"class":"ace-file-name"}).find(ace.vars[".icon"]).attr("class",ace.vars.icon+this.settings.no_icon).prev("img").remove(),this.settings.no_icon||this.$label.find(ace.vars[".icon"]).remove(),this.$label.find(".ace-file-name").not(":first").remove(),this.reset_input_data()},g.prototype.reset_input_field=function(){this.$element.wrap("").parent().get(0).reset(),this.$element.unwrap()},g.prototype.reset_input_data=function(){this.$element.data("ace_input_files")&&(this.$element.removeData("ace_input_files"),this.$element.removeData("ace_input_method"))},g.prototype.enable_reset=function(a){this.can_reset=a},g.prototype.disable=function(){this.disabled=!0,this.$element.attr("disabled","disabled").addClass("disabled")},g.prototype.enable=function(){this.disabled=!1,this.$element.removeAttr("disabled").removeClass("disabled")},g.prototype.files=function(){return a(this).data("ace_input_files")||null},g.prototype.method=function(){return a(this).data("ace_input_method")||""},g.prototype.update_settings=function(b){this.settings=a.extend({},this.settings,b),this.apply_settings()},g.prototype.loading=function(b){if(b===!1)this.$container.find(".ace-file-overlay").remove(),this.element.removeAttribute("readonly");else{var c="string"==typeof b?b:' ',d=this.$container.find(".ace-file-overlay");0==d.length&&(d=a('
').appendTo(this.$container),d.on("click tap",function(a){return a.stopImmediatePropagation(),a.preventDefault(),!1}),this.element.setAttribute("readonly","true")),d.empty().append(c)}};var h=function(){var a=this,b=this.$element.parent();b.off("dragenter").on("dragenter",function(a){a.preventDefault(),a.stopPropagation()}).off("dragover").on("dragover",function(a){a.preventDefault(),a.stopPropagation()}).off("drop").on("drop",function(b){if(b.preventDefault(),b.stopPropagation(),!a.disabled){var c=b.originalEvent.dataTransfer,d=c.files;if(!a.multi&&d.length>1){var e=[];e.push(d[0]),d=e}return d=l.call(a,d,!0),d===!1?!1:(a.$element.data("ace_input_method","drop"),a.$element.data("ace_input_files",d),a.show_file_list(d,!0),a.$element.triggerHandler("change",[!0]),!0)}})},i=function(){var a=this.element.files||[this.element.value];return a=l.call(this,a,!1),a===!1?!1:(this.$element.data("ace_input_method","select"),this.$element.data("ace_input_files",a),this.show_file_list(a,!0),!0)},j=function(b){var c=this,d=c.$label.find(".ace-file-name:last"),e=new a.Deferred,h=function(b,c){d.prepend(" ");var e=d.find("img:last").get(0);a(e).one("load",function(){i.call(null,e,c)}).one("error",function(){j.call(null,e)}),e.src=b},i=function(b,f){var h=c.settings.previewSize;h||(c.settings.previewWidth||c.settings.previewHeight?h={previewWidth:c.settings.previewWidth,previewHeight:c.settings.previewHeight}:(h=50,"large"==c.settings.thumbnail&&(h=150))),"fit"==c.settings.thumbnail?h=d.width():"number"==typeof h&&(h=parseInt(Math.min(h,d.width())));var i=k(b,h);if(null==i)return a(this).remove(),void e.reject({code:g.error.THUMBNAIL_FAILED});var j=!0;if(f&&f instanceof File){f.width=i.width,f.height=i.height,c.$element.trigger("file.preview.ace",{file:f});var l;c.$element.trigger(l=new a.Event("file.preview.ace"),{file:f}),l.isDefaultPrevented()&&(j=!1)}if(j){var m=i.previewWidth,n=i.previewHeight;"small"==c.settings.thumbnail?m=n=parseInt(Math.max(m,n)):d.addClass("large"),a(b).css({"background-image":"url("+i.src+")",width:m,height:n}).data("thumb",i.src).attr({src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg=="}).show()}e.resolve()},j=function(a){d.find("img").remove(),e.reject({code:g.error.IMAGE_LOAD_FAILED})};if(f&&b instanceof File){var l=new FileReader;l.onload=function(a){h(a.target.result,b)},l.onerror=function(a){e.reject({code:g.error.FILE_LOAD_FAILED})},l.readAsDataURL(b)}else b instanceof Object&&b.hasOwnProperty("path")&&h(b.path,null);return e.promise()},k=function(b,c,d){var e=b.width,f=b.height;e=e>0?e:a(b).width(),f=f>0?f:a(b).height();var g=!1,h=!1,i=!1;"number"==typeof c?g=c:c instanceof Object&&(c.previewWidth&&!c.previewHeight?i=c.previewWidth:c.previewHeight&&!c.previewWidth?h=c.previewHeight:c.previewWidth&&c.previewHeight&&(i=c.previewWidth,h=c.previewHeight)),g?e>f?(i=g,h=parseInt(f/e*i)):(h=g,i=parseInt(e/f*h)):!h&&i?h=parseInt(f/e*i):h&&!i&&(i=parseInt(e/f*h));var j;try{var k=document.createElement("canvas");k.width=i,k.height=h;var l=k.getContext("2d");l.drawImage(b,0,0,e,f,0,0,i,h),j=k.toDataURL()}catch(m){j=null}return j?(/^data\:image\/(png|jpe?g|gif);base64,[0-9A-Za-z\+\/\=]+$/.test(j)||(j=null),j?{src:j,previewWidth:i,previewHeight:h,width:e,height:f}:null):null},l=function(a,b){var c=o.call(this,a,b);return-1===c?(this.reset_input(),!1):c&&0!=c.length?((c instanceof Array||d&&c instanceof FileList)&&(a=c),c=!0,this.settings.before_change&&(c=this.settings.before_change.call(this.element,a,b)),-1===c?(this.reset_input(),!1):c&&0!=c.length?((c instanceof Array||d&&c instanceof FileList)&&(a=c),a):(this.$element.data("ace_input_files")||this.reset_input(),!1)):(this.$element.data("ace_input_files")||this.reset_input(),!1)},m=function(a){return a?("string"==typeof a&&(a=[a]),0==a.length?null:new RegExp(".(?:"+a.join("|")+")$","i")):null},n=function(a){return a?("string"==typeof a&&(a=[a]),0==a.length?null:new RegExp("^(?:"+a.join("|").replace(/\//g,"\\/")+")$","i")):null},o=function(b,c){var d=m(this.settings.allowExt),e=m(this.settings.denyExt),g=n(this.settings.allowMime),h=n(this.settings.denyMime),i=this.settings.maxSize||!1;if(!(d||e||g||h||i))return!0;for(var j=[],k={},l=0;l0){if(g&&!g.test(q)){"mime"in k||(k.mime=[]),k.mime.push(p);continue}if(h&&h.test(q)){"mime"in k||(k.mime=[]),k.mime.push(p);continue}}i&&o.size>i?("size"in k||(k.size=[]),k.size.push(p)):j.push(o)}else j.push(o)}else"ext"in k||(k.ext=[]),k.ext.push(p)}if(j.length==b.length)return b;var r={ext:0,mime:0,size:0};"ext"in k&&(r.ext=k.ext.length),"mime"in k&&(r.mime=k.mime.length),"size"in k&&(r.size=k.size.length);var s;return this.$element.trigger(s=new a.Event("file.error.ace"),{file_count:b.length,invalid_count:b.length-j.length,error_list:k,error_count:r,dropped:c}),s.isDefaultPrevented()?-1:j};a.fn.aceFileInput=a.fn.ace_file_input=function(c,d){var e,f=this.each(function(){var b=a(this),f=b.data("ace_file_input"),h="object"==typeof c&&c;f||b.data("ace_file_input",f=new g(this,h)),"string"==typeof c&&(e=f[c](d))});return e===b?f:e},a.fn.ace_file_input.defaults={style:!1,no_file:"No File ...",no_icon:"fa fa-upload",btn_choose:"Choose",btn_change:"Change",icon_remove:"fa fa-times",droppable:!1,thumbnail:!1,allowExt:null,denyExt:null,allowMime:null,denyMime:null,maxSize:!1,previewSize:!1,previewWidth:!1,previewHeight:!1,before_change:null,before_remove:null,preview_error:null}}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.bs_typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=a(this.options.menu),this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(a)).change(),this.hide()},updater:function(a){return a},show:function(){var b=a.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:b.top+b.height,left:b.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c;return this.query=this.$element.val(),!this.query||this.query.length"+b+""})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("focus",a.proxy(this.focus,this)).on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",a.proxy(this.keydown,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this)).on("mouseleave","li",a.proxy(this.mouseleave,this))},eventSupported:function(a){var b=a in this.$element;return b||(this.$element.setAttribute(a,"return;"),b="function"==typeof this.$element[a]),b},move:function(a){if(this.shown){switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}a.stopPropagation()}},keydown:function(b){this.suppressKeyPressRepeat=~a.inArray(b.keyCode,[40,38,9,13,27]),this.move(b)},keypress:function(a){this.suppressKeyPressRepeat||this.move(a)},keyup:function(a){switch(a.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},focus:function(a){this.focused=!0},blur:function(a){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(a){a.stopPropagation(),a.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(b){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},mouseleave:function(a){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var c=a.fn.bs_typeahead;a.fn.bs_typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("bs_typeahead"),f="object"==typeof c&&c;e||d.data("bs_typeahead",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.bs_typeahead.defaults={source:[],items:8,menu:'',item:' ',minLength:1},a.fn.bs_typeahead.Constructor=b,a.fn.bs_typeahead.noConflict=function(){return a.fn.bs_typeahead=c,this},a(document).on("focus.bs_typeahead.data-api",'[data-provide="bs_typeahead"]',function(b){var c=a(this);c.data("bs_typeahead")||c.bs_typeahead(c.data())})}(window.jQuery),function(a,b){a.fn.ace_wysiwyg=function(b,c){var d=a.extend({speech_button:!0,wysiwyg:{}},b),e=["#ac725e","#d06b64","#f83a22","#fa573c","#ff7537","#ffad46","#42d692","#16a765","#7bd148","#b3dc6c","#fbe983","#fad165","#92e1c0","#9fe1e7","#9fc6e7","#4986e7","#9a9cff","#b99aff","#c2c2c2","#cabdbf","#cca6ac","#f691b2","#cd74e6","#a47ae2","#444444"],f={font:{values:["Arial","Courier","Comic Sans MS","Helvetica","Open Sans","Tahoma","Verdana"],icon:"fa fa-font",title:"Font"},fontSize:{values:{5:"Huge",3:"Normal",1:"Small"},icon:"fa fa-text-height",title:"Font Size"},bold:{icon:"fa fa-bold",title:"Bold (Ctrl/Cmd+B)"},italic:{icon:"fa fa-italic",title:"Italic (Ctrl/Cmd+I)"},strikethrough:{icon:"fa fa-strikethrough",title:"Strikethrough"},underline:{icon:"fa fa-underline",title:"Underline"},insertunorderedlist:{icon:"fa fa-list-ul",title:"Bullet list"},insertorderedlist:{icon:"fa fa-list-ol",title:"Number list"},outdent:{icon:"fa fa-outdent",title:"Reduce indent (Shift+Tab)"},indent:{icon:"fa fa-indent",title:"Indent (Tab)"},justifyleft:{icon:"fa fa-align-left",title:"Align Left (Ctrl/Cmd+L)"},justifycenter:{icon:"fa fa-align-center",title:"Center (Ctrl/Cmd+E)"},justifyright:{icon:"fa fa-align-right",title:"Align Right (Ctrl/Cmd+R)"},justifyfull:{icon:"fa fa-align-justify",title:"Justify (Ctrl/Cmd+J)"},createLink:{icon:"fa fa-link",title:"Hyperlink",button_text:"Add",placeholder:"URL",button_class:"btn-primary"},unlink:{icon:"fa fa-chain-broken",title:"Remove Hyperlink"},insertImage:{icon:"fa fa-picture-o",title:"Insert picture",button_text:' Choose Image …',placeholder:"Image URL",button_insert:"Insert",button_class:"btn-success",button_insert_class:"btn-primary",choose_file:!0},foreColor:{values:e,title:"Change Color"},backColor:{values:e,title:"Change Background Color"},undo:{icon:"fa fa-undo",title:"Undo (Ctrl/Cmd+Z)"},redo:{icon:"fa fa-repeat",title:"Redo (Ctrl/Cmd+Y)"},viewSource:{icon:"fa fa-code",title:"View Source"}},g=d.toolbar||["font",null,"fontSize",null,"bold","italic","strikethrough","underline",null,"insertunorderedlist","insertorderedlist","outdent","indent",null,"justifyleft","justifycenter","justifyright","justifyfull",null,"createLink","unlink",null,"insertImage",null,"foreColor",null,"undo","redo",null,"viewSource"];return this.each(function(){var b=' ",b=d.toolbar_place?d.toolbar_place.call(this,b):a(this).before(b).prev(),a.fn.tooltip&&b.find("a[title]").tooltip({animation:!1,container:"body"}),b.find(".dropdown-menu input[type=text]").on("click",function(){return!1}).on("change",function(){a(this).closest(".dropdown-menu").siblings(".dropdown-toggle").dropdown("toggle")}).on("keydown",function(b){27==b.which?(this.value="",a(this).change()):13==b.which&&(b.preventDefault(),b.stopPropagation(),a(this).change())}),b.find("input[type=file]").prev().on(ace.click_event,function(b){a(this).next().click()}),b.find(".wysiwyg_colorpicker").each(function(){var b=a(this).ace_colorpicker({pull_right:!0}).change(function(){a(this).nextAll("input").eq(0).val(this.value).change()}).next().find(".btn-colorpicker");a.fn.tooltip&&b.tooltip({title:this.title,animation:!1,container:"body"})});var l=a(this),m=!1;b.find("a[data-view=source]").on("click",function(b){if(b.preventDefault(),m){var c=l.next();l.html(c.val()).show(),c.remove(),a(this).removeClass("active")}else a(" ").css({width:l.outerWidth(),height:l.outerHeight()}).val(l.html()).insertAfter(l),l.hide(),a(this).addClass("active");m=!m});var n=a.extend({},{
+activeToolbarClass:"active",toolbarSelector:b},d.wysiwyg||{});a(this).wysiwyg(n)}),this}}(window.jQuery),function(a,b){function c(b,c){var d=ace.helper.getAttrSettings(b,a.fn.ace_spinner.defaults),e=a.extend({},a.fn.ace_spinner.defaults,c,d),f=e.max;f=(""+f).length;var g=parseInt(Math.max(20*f+40,90)),h=a(b),i="btn-sm",j=2;h.hasClass("input-sm")?(i="btn-xs",j=1):h.hasClass("input-lg")&&(i="btn-lg",j=3),2==j?g+=25:3==j&&(g+=50),h.addClass("spinbox-input form-control text-center").wrap('');var k=h.closest(".ace-spinner").spinbox(e).wrapInner("
"),l=k.data("fu.spinbox");e.on_sides?(h.before('
').after('
'),k.addClass("touch-spinner"),k.css("width",g+"px")):(h.after('
'),ace.vars.touch||e.touch_spinner?(k.addClass("touch-spinner"),k.css("width",g+"px")):(h.next().addClass("btn-group-vertical"),k.css("width",g+"px"))),k.on("changed",function(){h.trigger("change")}),this._call=function(a,b){l[a](b)}}a.fn.ace_spinner=function(d,e){var f,g=this.each(function(){var b=a(this),g=b.data("ace_spinner"),h="object"==typeof d&&d;g||(h=a.extend({},a.fn.ace_spinner.defaults,d),b.data("ace_spinner",g=new c(this,h))),"string"==typeof d&&(f=g._call(d,e))});return f===b?g:f},a.fn.ace_spinner.defaults={icon_up:"fa fa-chevron-up",icon_down:"fa fa-chevron-down",on_sides:!1,btn_up_class:"",btn_down_class:"",max:999,touch_spinner:!1}}(window.jQuery),function(a,b){a.fn.aceTree=a.fn.ace_tree=function(b){var c={"open-icon":ace.vars.icon+"fa fa-folder-open","close-icon":ace.vars.icon+"fa fa-folder","toggle-icon":ace.vars.icon+"fa fa-play","selected-icon":ace.vars.icon+"fa fa-check","unselected-icon":ace.vars.icon+"fa fa-times","base-icon":ace.vars.icon+"fa","folder-open-icon":"fa fa-plus-square-o","folder-close-icon":"fa fa-plus-minus-o",loadingHTML:"Loading..."};return this.each(function(){var d=ace.helper.getAttrSettings(this,c),e=a.extend({},c,b,d),f=a(this);f.addClass("tree").attr("role","tree"),f.html('
'+(e.folderSelect?' ':"")+' '+e.loadingHTML+'
'+(null==e["unselected-icon"]?"":' ')+' '),f.addClass(1==e.selectable?"tree-selectable":"tree-unselectable"),f.tree(e)}),this}}(window.jQuery),function(a,b){a.fn.aceWizard=a.fn.ace_wizard=function(b){return this.each(function(){var c=a(this);c.wizard(),ace.vars.old_ie&&c.find("ul.steps > li").last().addClass("last-child");var d=b&&b.buttons?a(b.buttons):c.siblings(".wizard-actions").eq(0),e=c.data("fu.wizard");e.$prevBtn.remove(),e.$nextBtn.remove(),e.$prevBtn=d.find(".btn-prev").eq(0).on(ace.click_event,function(){e.previous()}).attr("disabled","disabled"),e.$nextBtn=d.find(".btn-next").eq(0).on(ace.click_event,function(){e.next()}).removeAttr("disabled"),e.nextText=e.$nextBtn.text();var f=b&&(b.selectedItem&&b.selectedItem.step||b.step);f&&(e.currentStep=f,e.setState())}),this}}(window.jQuery),function(a,b){function c(b,c){var e=this,f=a(b),g="right",h=!1,i=f.hasClass("fade"),j=ace.helper.getAttrSettings(b,a.fn.ace_aside.defaults);if(this.settings=a.extend({},a.fn.ace_aside.defaults,c,j),!this.settings.background||c.scroll_style||j.scroll_style||(this.settings.scroll_style="scroll-white no-track"),this.container=this.settings.container,this.container)try{a(this.container).get(0)==document.body&&(this.container=null)}catch(k){}this.container&&(this.settings.backdrop=!1,f.addClass("aside-contained"));var l=f.find(".modal-dialog"),m=f.find(".modal-content"),n=300;this.initiate=function(){b.className=b.className.replace(/(\s|^)aside\-(right|top|left|bottom)(\s|$)/gi,"$1$3"),g=this.settings.placement,g&&(g=a.trim(g.toLowerCase())),g&&/right|top|left|bottom/.test(g)||(g="right"),f.attr("data-placement",g),f.addClass("aside-"+g),/right|left/.test(g)?(h=!0,f.addClass("aside-vc")):f.addClass("aside-hz"),this.settings.fixed&&f.addClass("aside-fixed"),this.settings.background&&f.addClass("aside-dark"),this.settings.offset&&f.addClass("navbar-offset"),this.settings.transition||f.addClass("transition-off"),f.addClass("aside-hidden"),this.insideContainer(),l=f.find(".modal-dialog"),m=f.find(".modal-content"),this.settings.body_scroll||f.on("mousewheel.aside DOMMouseScroll.aside touchmove.aside pointermove.aside",function(b){return a.contains(m[0],b.target)?void 0:(b.preventDefault(),!1)}),0==this.settings.backdrop&&f.addClass("no-backdrop")},this.show=function(){if(0==this.settings.backdrop)try{f.data("bs.modal").$backdrop.remove()}catch(b){}this.container?a(this.container).addClass("overflow-hidden"):f.css("position","fixed"),f.removeClass("aside-hidden")},this.hide=function(){this.container&&(this.container.addClass("overflow-hidden"),ace.vars.firefox&&b.offsetHeight),o(),ace.vars.transition&&!i&&f.one("bsTransitionEnd",function(){f.addClass("aside-hidden"),f.css("position",""),e.container&&e.container.removeClass("overflow-hidden")}).emulateTransitionEnd(n)},this.shown=function(){if(o(),a("body").removeClass("modal-open").css("padding-right",""),"invisible"==this.settings.backdrop)try{f.data("bs.modal").$backdrop.css("opacity",0)}catch(b){}var c=h?m.height():l.height();ace.vars.touch?m.addClass("overflow-scroll").css("max-height",c+"px"):m.hasClass("ace-scroll")||m.ace_scroll({size:c,reset:!0,mouseWheelLock:!0,lockAnyway:!this.settings.body_scroll,styleClass:this.settings.scroll_style,observeContent:!0,hideOnIdle:!ace.vars.old_ie,hideDelay:1500}),d.off("resize.modal.aside").on("resize.modal.aside",function(){if(ace.vars.touch)m.css("max-height",(h?m.height():l.height())+"px");else{m.ace_scroll("disable");var a=h?m.height():l.height();m.ace_scroll("update",{size:a}).ace_scroll("enable").ace_scroll("reset")}}).triggerHandler("resize.modal.aside"),e.container&&ace.vars.transition&&!i&&f.one("bsTransitionEnd",function(){e.container.removeClass("overflow-hidden")}).emulateTransitionEnd(n)},this.hidden=function(){d.off(".aside"),ace.vars.transition&&!i||(f.addClass("aside-hidden"),f.css("position",""))},this.insideContainer=function(){var b=a(".main-container"),c=f.find(".modal-dialog");if(c.css({right:"",left:""}),b.hasClass("container")){var e=!1;1==h&&(c.css(g,parseInt((d.width()-b.width())/2)),e=!0),e&&ace.vars.firefox&&ace.helper.redraw(b[0])}},this.flip=function(){var a={right:"left",left:"right",top:"bottom",bottom:"top"};f.removeClass("aside-"+g).addClass("aside-"+a[g]),g=a[g]};var o=function(){var a=f.find(".aside-trigger");if(0!=a.length){a.toggleClass("open");var b=a.find(ace.vars[".icon"]);0!=b.length&&b.toggleClass(b.attr("data-icon1")+" "+b.attr("data-icon2"))}};this.initiate(),this.container&&(this.container=a(this.container)),f.appendTo(this.container||"body")}var d=a(window);a(document).on("show.bs.modal",".modal.aside",function(b){a(".aside.in").modal("hide"),a(this).ace_aside("show")}).on("hide.bs.modal",".modal.aside",function(b){a(this).ace_aside("hide")}).on("shown.bs.modal",".modal.aside",function(b){a(this).ace_aside("shown")}).on("hidden.bs.modal",".modal.aside",function(b){a(this).ace_aside("hidden")}),a(window).on("resize.aside_container",function(){a(".modal.aside").ace_aside("insideContainer")}),a(document).on("settings.ace.aside",function(b,c){"main_container_fixed"==c&&a(".modal.aside").ace_aside("insideContainer")}),a.fn.aceAside=a.fn.ace_aside=function(d,e){var f,g=this.each(function(){var b=a(this),g=b.data("ace_aside"),h="object"==typeof d&&d;g||b.data("ace_aside",g=new c(this,h)),"string"==typeof d&&"function"==typeof g[d]&&(f=e instanceof Array?g[d].apply(g,e):g[d](e))});return f===b?g:f},a.fn.ace_aside.defaults={fixed:!1,background:!1,offset:!1,body_scroll:!1,transition:!0,scroll_style:"scroll-dark no-track",container:null,backdrop:!1,placement:"right"}}(window.jQuery);
\ No newline at end of file
diff --git a/at-admin/static/index/ace-extra.min.js b/at-admin/static/index/ace-extra.min.js
new file mode 100644
index 0000000..7a1552e
--- /dev/null
+++ b/at-admin/static/index/ace-extra.min.js
@@ -0,0 +1 @@
+!function(){"ace"in window||(window.ace={}),ace.config={storage_method:0,cookie_expiry:604800,cookie_path:""},"vars"in window.ace||(window.ace.vars={}),ace.vars.very_old_ie=!("querySelector"in document.documentElement),ace.settings={saveState:function(a,b,c,d){if(!a||"string"==typeof a&&!(a=document.getElementById(a))||!a.hasAttribute("id"))return!1;if(!ace.hasClass(a,"ace-save-state"))return!1;var b=b||"class",e=a.getAttribute("id"),f=ace.data.get("state","id-"+e)||{};if("string"==typeof f)try{f=JSON.parse(f)}catch(g){f={}}var h,i="undefined"!=typeof c,j=!1,k=/class/i,l=/checked|disabled|readonly|value/i;l.test(b)?h=i?c:a[b]:a.hasAttribute(b)?h=i?c:a.getAttribute(b):i||(j=!0),j?delete f[b]:k.test(b)?(f.hasOwnProperty(b)||(f[b]={}),d===!0?f[b][h]=1:d===!1?f[b][h]=-1:f[b].className=h):f[b]=h,ace.data.set("state","id-"+e,JSON.stringify(f))},loadState:function(a,b){if(!a||"string"==typeof a&&!(a=document.getElementById(a))||!a.hasAttribute("id"))return!1;var c=a.getAttribute("id"),d=ace.data.get("state","id-"+c)||{};if("string"==typeof d)try{d=JSON.parse(d)}catch(e){d={}}var f=function(a,b,c){var d=/class/i,e=/checked|disabled|readonly|value/i;if(d.test(b)){if("object"==typeof c){"className"in c&&a.setAttribute("class",c.className);for(var f in c)if(c.hasOwnProperty(f)){var g=c[f];1==g?ace.addClass(a,f):-1==g&&ace.removeClass(a,f)}}}else e.test(b)?a[b]=c:a.setAttribute(b,c)};if(void 0!==b)d.hasOwnProperty(b)&&null!==d[b]&&f(a,b,d[b]);else for(var g in d)d.hasOwnProperty(g)&&null!==d[g]&&f(a,g,d[g])},clearState:function(a){var b=null;"string"==typeof a?b=a:"hasAttribute"in a&&a.hasAttribute("id")&&(b=a.getAttribute("id")),b&&ace.data.remove("state","id-"+b)}},function(){var a=function(){var a=!1,b="animation",c="",d="Webkit Moz O ms Khtml".split(" "),e="",f=document.createElement("div");if(void 0!==f.style.animationName&&(a=!0),a===!1)for(var g=0;g
-1},ace.addClass=function(a,b){for(var c=b.split(/\s+/),d=0;d0&&!ace.hasClass(a,c[d])){var e=a.className;a.className=e+(e.length?" ":"")+c[d]}},ace.removeClass=function(a,b){for(var c=b.split(/\s+/),d=0;d0&&ace.replaceClass(a,c[d]);ace.replaceClass(a,b)},ace.replaceClass=function(a,b,c){var d=new RegExp("(^|\\s)"+b+"(\\s|$)","i");a.className=a.className.replace(d,function(a,b,d){return c?b+c+d:" "}).replace(/^\s+|\s+$/g,"")},ace.toggleClass=function(a,b){ace.hasClass(a,b)?ace.removeClass(a,b):ace.addClass(a,b)},ace.isHTMlElement=function(a){return window.HTMLElement?a instanceof HTMLElement:"nodeType"in a?1==a.nodeType:!1},ace.data=new ace.data_storage(ace.config.storage_method)}();
\ No newline at end of file
diff --git a/at-admin/static/index/ace-rtl.min.css b/at-admin/static/index/ace-rtl.min.css
new file mode 100644
index 0000000..9e26328
--- /dev/null
+++ b/at-admin/static/index/ace-rtl.min.css
@@ -0,0 +1,1394 @@
+/* Code tidied up by ScrapBook */
+.rtl .list-inline, .rtl .list-unstyled { padding-left: 0px; padding-right: 0px; }
+.rtl .btn-group-vertical > .btn, .rtl .btn-group > .btn, .rtl .btn-group > .btn-group, .rtl .btn-toolbar .btn, .rtl .btn-toolbar .btn-group, .rtl .btn-toolbar .input-group, .rtl .col-xs-1, .rtl .col-xs-10, .rtl .col-xs-11, .rtl .col-xs-12, .rtl .col-xs-2, .rtl .col-xs-3, .rtl .col-xs-4, .rtl .col-xs-5, .rtl .col-xs-6, .rtl .col-xs-7, .rtl .col-xs-8, .rtl .col-xs-9, .rtl .input-group .form-control, .rtl .nav-pills > li, .rtl .navbar-brand { float: right; }
+.rtl .text-center { text-align: center; }
+.rtl .checkbox label, .rtl .checkbox-inline, .rtl .radio label, .rtl .radio-inline { padding-left: 0px; padding-right: 20px; }
+.rtl dd { margin-left: auto; margin-right: 0px; }
+@media (min-width: 992px) {
+ .rtl .dl-horizontal dt { float: right; clear: right; text-align: left; }
+ .rtl .dl-horizontal dd { margin-left: auto; margin-right: 180px; }
+}
+.rtl .md-editor.md-fullscreen-mode .md-fullscreen-controls a, .rtl .widget-header::after { clear: left; }
+.rtl .col-xs-pull-12 { right: auto; left: 100%; }
+.rtl .col-xs-pull-11 { right: auto; left: 91.666%; }
+.rtl .col-xs-pull-10 { right: auto; left: 83.333%; }
+.rtl .col-xs-pull-9 { right: auto; left: 75%; }
+.rtl .col-xs-pull-8 { right: auto; left: 66.666%; }
+.rtl .col-xs-pull-7 { right: auto; left: 58.333%; }
+.rtl .col-xs-pull-6 { right: auto; left: 50%; }
+.rtl .col-xs-pull-5 { right: auto; left: 41.666%; }
+.rtl .col-xs-pull-4 { right: auto; left: 33.333%; }
+.rtl .col-xs-pull-3 { right: auto; left: 25%; }
+.rtl .col-xs-pull-2 { right: auto; left: 16.666%; }
+.rtl .col-xs-pull-1 { right: auto; left: 8.333%; }
+.rtl .col-xs-pull-0 { right: auto; left: auto; }
+.rtl .col-xs-push-12 { left: auto; right: 100%; }
+.rtl .col-xs-push-11 { left: auto; right: 91.666%; }
+.rtl .col-xs-push-10 { left: auto; right: 83.333%; }
+.rtl .col-xs-push-9 { left: auto; right: 75%; }
+.rtl .col-xs-push-8 { left: auto; right: 66.666%; }
+.rtl .col-xs-push-7 { left: auto; right: 58.333%; }
+.rtl .col-xs-push-6 { left: auto; right: 50%; }
+.rtl .col-xs-push-5 { left: auto; right: 41.666%; }
+.rtl .col-xs-push-4 { left: auto; right: 33.333%; }
+.rtl .col-xs-push-3 { left: auto; right: 25%; }
+.rtl .col-xs-push-2 { left: auto; right: 16.666%; }
+.rtl .col-xs-push-1 { left: auto; right: 8.333%; }
+.rtl .col-xs-push-0 { left: auto; right: auto; }
+.rtl .col-xs-offset-12 { margin-left: auto; margin-right: 100%; }
+.rtl .col-xs-offset-11 { margin-left: auto; margin-right: 91.666%; }
+.rtl .col-xs-offset-10 { margin-left: auto; margin-right: 83.333%; }
+.rtl .col-xs-offset-9 { margin-left: auto; margin-right: 75%; }
+.rtl .col-xs-offset-8 { margin-left: auto; margin-right: 66.666%; }
+.rtl .col-xs-offset-7 { margin-left: auto; margin-right: 58.333%; }
+.rtl .col-xs-offset-6 { margin-left: auto; margin-right: 50%; }
+.rtl .col-xs-offset-5 { margin-left: auto; margin-right: 41.666%; }
+.rtl .col-xs-offset-4 { margin-left: auto; margin-right: 33.333%; }
+.rtl .col-xs-offset-3 { margin-left: auto; margin-right: 25%; }
+.rtl .col-xs-offset-2 { margin-left: auto; margin-right: 16.666%; }
+.rtl .col-xs-offset-1 { margin-left: auto; margin-right: 8.333%; }
+.rtl .col-xs-offset-0 { margin-left: auto; margin-right: 0px; }
+@media (min-width: 768px) {
+ .rtl .col-sm-1, .rtl .col-sm-10, .rtl .col-sm-11, .rtl .col-sm-12, .rtl .col-sm-2, .rtl .col-sm-3, .rtl .col-sm-4, .rtl .col-sm-5, .rtl .col-sm-6, .rtl .col-sm-7, .rtl .col-sm-8, .rtl .col-sm-9 { float: right; }
+ .rtl .col-sm-pull-12 { right: auto; left: 100%; }
+ .rtl .col-sm-pull-11 { right: auto; left: 91.666%; }
+ .rtl .col-sm-pull-10 { right: auto; left: 83.333%; }
+ .rtl .col-sm-pull-9 { right: auto; left: 75%; }
+ .rtl .col-sm-pull-8 { right: auto; left: 66.666%; }
+ .rtl .col-sm-pull-7 { right: auto; left: 58.333%; }
+ .rtl .col-sm-pull-6 { right: auto; left: 50%; }
+ .rtl .col-sm-pull-5 { right: auto; left: 41.666%; }
+ .rtl .col-sm-pull-4 { right: auto; left: 33.333%; }
+ .rtl .col-sm-pull-3 { right: auto; left: 25%; }
+ .rtl .col-sm-pull-2 { right: auto; left: 16.666%; }
+ .rtl .col-sm-pull-1 { right: auto; left: 8.333%; }
+ .rtl .col-sm-pull-0 { right: auto; left: auto; }
+ .rtl .col-sm-push-12 { left: auto; right: 100%; }
+ .rtl .col-sm-push-11 { left: auto; right: 91.666%; }
+ .rtl .col-sm-push-10 { left: auto; right: 83.333%; }
+ .rtl .col-sm-push-9 { left: auto; right: 75%; }
+ .rtl .col-sm-push-8 { left: auto; right: 66.666%; }
+ .rtl .col-sm-push-7 { left: auto; right: 58.333%; }
+ .rtl .col-sm-push-6 { left: auto; right: 50%; }
+ .rtl .col-sm-push-5 { left: auto; right: 41.666%; }
+ .rtl .col-sm-push-4 { left: auto; right: 33.333%; }
+ .rtl .col-sm-push-3 { left: auto; right: 25%; }
+ .rtl .col-sm-push-2 { left: auto; right: 16.666%; }
+ .rtl .col-sm-push-1 { left: auto; right: 8.333%; }
+ .rtl .col-sm-push-0 { left: auto; right: auto; }
+ .rtl .col-sm-offset-12 { margin-left: auto; margin-right: 100%; }
+ .rtl .col-sm-offset-11 { margin-left: auto; margin-right: 91.666%; }
+ .rtl .col-sm-offset-10 { margin-left: auto; margin-right: 83.333%; }
+ .rtl .col-sm-offset-9 { margin-left: auto; margin-right: 75%; }
+ .rtl .col-sm-offset-8 { margin-left: auto; margin-right: 66.666%; }
+ .rtl .col-sm-offset-7 { margin-left: auto; margin-right: 58.333%; }
+ .rtl .col-sm-offset-6 { margin-left: auto; margin-right: 50%; }
+ .rtl .col-sm-offset-5 { margin-left: auto; margin-right: 41.666%; }
+ .rtl .col-sm-offset-4 { margin-left: auto; margin-right: 33.333%; }
+ .rtl .col-sm-offset-3 { margin-left: auto; margin-right: 25%; }
+ .rtl .col-sm-offset-2 { margin-left: auto; margin-right: 16.666%; }
+ .rtl .col-sm-offset-1 { margin-left: auto; margin-right: 8.333%; }
+ .rtl .col-sm-offset-0 { margin-left: auto; margin-right: 0px; }
+}
+@media (min-width: 992px) {
+ .rtl .col-md-1, .rtl .col-md-10, .rtl .col-md-11, .rtl .col-md-12, .rtl .col-md-2, .rtl .col-md-3, .rtl .col-md-4, .rtl .col-md-5, .rtl .col-md-6, .rtl .col-md-7, .rtl .col-md-8, .rtl .col-md-9 { float: right; }
+ .rtl .col-md-pull-12 { right: auto; left: 100%; }
+ .rtl .col-md-pull-11 { right: auto; left: 91.666%; }
+ .rtl .col-md-pull-10 { right: auto; left: 83.333%; }
+ .rtl .col-md-pull-9 { right: auto; left: 75%; }
+ .rtl .col-md-pull-8 { right: auto; left: 66.666%; }
+ .rtl .col-md-pull-7 { right: auto; left: 58.333%; }
+ .rtl .col-md-pull-6 { right: auto; left: 50%; }
+ .rtl .col-md-pull-5 { right: auto; left: 41.666%; }
+ .rtl .col-md-pull-4 { right: auto; left: 33.333%; }
+ .rtl .col-md-pull-3 { right: auto; left: 25%; }
+ .rtl .col-md-pull-2 { right: auto; left: 16.666%; }
+ .rtl .col-md-pull-1 { right: auto; left: 8.333%; }
+ .rtl .col-md-pull-0 { right: auto; left: auto; }
+ .rtl .col-md-push-12 { left: auto; right: 100%; }
+ .rtl .col-md-push-11 { left: auto; right: 91.666%; }
+ .rtl .col-md-push-10 { left: auto; right: 83.333%; }
+ .rtl .col-md-push-9 { left: auto; right: 75%; }
+ .rtl .col-md-push-8 { left: auto; right: 66.666%; }
+ .rtl .col-md-push-7 { left: auto; right: 58.333%; }
+ .rtl .col-md-push-6 { left: auto; right: 50%; }
+ .rtl .col-md-push-5 { left: auto; right: 41.666%; }
+ .rtl .col-md-push-4 { left: auto; right: 33.333%; }
+ .rtl .col-md-push-3 { left: auto; right: 25%; }
+ .rtl .col-md-push-2 { left: auto; right: 16.666%; }
+ .rtl .col-md-push-1 { left: auto; right: 8.333%; }
+ .rtl .col-md-push-0 { left: auto; right: auto; }
+ .rtl .col-md-offset-12 { margin-left: auto; margin-right: 100%; }
+ .rtl .col-md-offset-11 { margin-left: auto; margin-right: 91.666%; }
+ .rtl .col-md-offset-10 { margin-left: auto; margin-right: 83.333%; }
+ .rtl .col-md-offset-9 { margin-left: auto; margin-right: 75%; }
+ .rtl .col-md-offset-8 { margin-left: auto; margin-right: 66.666%; }
+ .rtl .col-md-offset-7 { margin-left: auto; margin-right: 58.333%; }
+ .rtl .col-md-offset-6 { margin-left: auto; margin-right: 50%; }
+ .rtl .col-md-offset-5 { margin-left: auto; margin-right: 41.666%; }
+ .rtl .col-md-offset-4 { margin-left: auto; margin-right: 33.333%; }
+ .rtl .col-md-offset-3 { margin-left: auto; margin-right: 25%; }
+ .rtl .col-md-offset-2 { margin-left: auto; margin-right: 16.666%; }
+ .rtl .col-md-offset-1 { margin-left: auto; margin-right: 8.333%; }
+ .rtl .col-md-offset-0 { margin-left: auto; margin-right: 0px; }
+ .rtl .navbar-header { float: right; }
+}
+@media (min-width: 1200px) {
+ .rtl .col-lg-1, .rtl .col-lg-10, .rtl .col-lg-11, .rtl .col-lg-12, .rtl .col-lg-2, .rtl .col-lg-3, .rtl .col-lg-4, .rtl .col-lg-5, .rtl .col-lg-6, .rtl .col-lg-7, .rtl .col-lg-8, .rtl .col-lg-9 { float: right; }
+ .rtl .col-lg-pull-12 { right: auto; left: 100%; }
+ .rtl .col-lg-pull-11 { right: auto; left: 91.666%; }
+ .rtl .col-lg-pull-10 { right: auto; left: 83.333%; }
+ .rtl .col-lg-pull-9 { right: auto; left: 75%; }
+ .rtl .col-lg-pull-8 { right: auto; left: 66.666%; }
+ .rtl .col-lg-pull-7 { right: auto; left: 58.333%; }
+ .rtl .col-lg-pull-6 { right: auto; left: 50%; }
+ .rtl .col-lg-pull-5 { right: auto; left: 41.666%; }
+ .rtl .col-lg-pull-4 { right: auto; left: 33.333%; }
+ .rtl .col-lg-pull-3 { right: auto; left: 25%; }
+ .rtl .col-lg-pull-2 { right: auto; left: 16.666%; }
+ .rtl .col-lg-pull-1 { right: auto; left: 8.333%; }
+ .rtl .col-lg-pull-0 { right: auto; left: auto; }
+ .rtl .col-lg-push-12 { left: auto; right: 100%; }
+ .rtl .col-lg-push-11 { left: auto; right: 91.666%; }
+ .rtl .col-lg-push-10 { left: auto; right: 83.333%; }
+ .rtl .col-lg-push-9 { left: auto; right: 75%; }
+ .rtl .col-lg-push-8 { left: auto; right: 66.666%; }
+ .rtl .col-lg-push-7 { left: auto; right: 58.333%; }
+ .rtl .col-lg-push-6 { left: auto; right: 50%; }
+ .rtl .col-lg-push-5 { left: auto; right: 41.666%; }
+ .rtl .col-lg-push-4 { left: auto; right: 33.333%; }
+ .rtl .col-lg-push-3 { left: auto; right: 25%; }
+ .rtl .col-lg-push-2 { left: auto; right: 16.666%; }
+ .rtl .col-lg-push-1 { left: auto; right: 8.333%; }
+ .rtl .col-lg-push-0 { left: auto; right: auto; }
+ .rtl .col-lg-offset-12 { margin-left: auto; margin-right: 100%; }
+ .rtl .col-lg-offset-11 { margin-left: auto; margin-right: 91.666%; }
+ .rtl .col-lg-offset-10 { margin-left: auto; margin-right: 83.333%; }
+ .rtl .col-lg-offset-9 { margin-left: auto; margin-right: 75%; }
+ .rtl .col-lg-offset-8 { margin-left: auto; margin-right: 66.666%; }
+ .rtl .col-lg-offset-7 { margin-left: auto; margin-right: 58.333%; }
+ .rtl .col-lg-offset-6 { margin-left: auto; margin-right: 50%; }
+ .rtl .col-lg-offset-5 { margin-left: auto; margin-right: 41.666%; }
+ .rtl .col-lg-offset-4 { margin-left: auto; margin-right: 33.333%; }
+ .rtl .col-lg-offset-3 { margin-left: auto; margin-right: 25%; }
+ .rtl .col-lg-offset-2 { margin-left: auto; margin-right: 16.666%; }
+ .rtl .col-lg-offset-1 { margin-left: auto; margin-right: 8.333%; }
+ .rtl .col-lg-offset-0 { margin-left: auto; margin-right: 0px; }
+}
+.rtl caption, .rtl th { text-align: right; }
+.rtl .checkbox input[type="checkbox"], .rtl .checkbox-inline input[type="checkbox"], .rtl .radio input[type="radio"], .rtl .radio-inline input[type="radio"] { margin-left: auto; margin-right: -20px; }
+.rtl .checkbox-inline + .checkbox-inline, .rtl .radio-inline + .radio-inline { margin-left: auto; margin-right: 10px; }
+.rtl .has-feedback .form-control { padding-right: 0px; padding-left: 42.5px; }
+.rtl .nav, .rtl .pager, .rtl .pagination { padding-left: 0px; padding-right: 0px; }
+.rtl .form-control-feedback { right: auto; text-align: center; left: 0px; }
+@media (min-width: 768px) {
+ .rtl .form-inline .checkbox label, .rtl .form-inline .radio label { padding-left: 0px; padding-right: 0px; }
+ .rtl .form-inline .checkbox input[type="checkbox"], .rtl .form-inline .radio input[type="radio"] { margin-left: auto; margin-right: 0px; }
+ .rtl .form-horizontal .control-label { text-align: left; }
+}
+.rtl .badge, .rtl .btn, .rtl .input-group-addon, .rtl .label, .rtl .nav-justified > li > a, .rtl .pager { text-align: center; }
+.rtl .form-horizontal .has-feedback .form-control-feedback { right: auto; left: 12px; }
+.rtl .caret { margin-left: auto; margin-right: 2px; }
+.rtl .btn-group .btn + .btn, .rtl .btn-group .btn + .btn-group, .rtl .btn-group .btn-group + .btn, .rtl .btn-group .btn-group + .btn-group { margin-left: auto; margin-right: -1px; }
+.rtl .btn-toolbar { margin-left: auto; margin-right: -5px; }
+.rtl .btn-toolbar > .btn, .rtl .btn-toolbar > .btn-group, .rtl .btn-toolbar > .input-group { margin-left: auto; margin-right: 5px; }
+.rtl .btn .caret, .rtl .btn-group-vertical > .btn + .btn, .rtl .btn-group-vertical > .btn + .btn-group, .rtl .btn-group-vertical > .btn-group + .btn, .rtl .btn-group-vertical > .btn-group + .btn-group, .rtl .btn-group > .btn:first-child { margin-right: 0px; margin-left: auto; }
+.rtl .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-radius: 0px; }
+.rtl .btn-group > .btn:last-child:not(:first-child), .rtl .btn-group > .dropdown-toggle:not(:first-child) { border-radius: 0px; }
+.rtl .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .rtl .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-radius: 0px; }
+.rtl .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-radius: 0px; }
+.rtl .input-group .form-control:first-child, .rtl .input-group-addon:first-child, .rtl .input-group-btn:first-child > .btn, .rtl .input-group-btn:first-child > .btn-group > .btn, .rtl .input-group-btn:first-child > .dropdown-toggle, .rtl .input-group-btn:last-child > .btn-group:not(:last-child) > .btn, .rtl .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-radius: 0px; }
+.rtl .input-group-addon:first-child { border-left: 0px none; }
+.rtl .input-group .form-control:last-child, .rtl .input-group-addon:last-child, .rtl .input-group-btn:first-child > .btn-group:not(:first-child) > .btn, .rtl .input-group-btn:first-child > .btn:not(:first-child), .rtl .input-group-btn:last-child > .btn, .rtl .input-group-btn:last-child > .btn-group > .btn, .rtl .input-group-btn:last-child > .dropdown-toggle { border-radius: 0px; }
+.rtl .input-group-addon:last-child { border-right: 0px none; }
+.rtl .input-group-btn > .btn + .btn { margin-left: auto; margin-right: -1px; }
+.rtl .input-group-btn:first-child > .btn, .rtl .input-group-btn:first-child > .btn-group { margin-right: auto; margin-left: -1px; }
+.rtl .input-group-btn:last-child > .btn, .rtl .input-group-btn:last-child > .btn-group { margin-left: auto; margin-right: -1px; }
+.rtl .nav-pills > li + li { margin-left: auto; margin-right: 2px; }
+.rtl .nav-stacked > li + li { margin-left: auto; margin-right: 0px; }
+@media (min-width: 992px) {
+ .rtl .navbar > .container .navbar-brand, .rtl .navbar > .container-fluid .navbar-brand { margin-left: auto; margin-right: -12px; }
+}
+.rtl .navbar-toggle { float: left; margin-right: auto; margin-left: 12px; }
+@media (min-width: 768px) {
+ .rtl .navbar-form .checkbox label, .rtl .navbar-form .radio label { padding-left: 0px; padding-right: 0px; }
+ .rtl .navbar-form .checkbox input[type="checkbox"], .rtl .navbar-form .radio input[type="radio"] { margin-left: auto; margin-right: 0px; }
+}
+@media (min-width: 992px) {
+ .rtl .navbar-nav, .rtl .navbar-nav > li, .rtl .navbar-text { float: right; }
+}
+.rtl .pagination > li > a, .rtl .pagination > li > span { float: right; margin-left: auto; margin-right: -1px; }
+.rtl .pagination > li:first-child > a, .rtl .pagination > li:first-child > span { margin-left: auto; margin-right: 0px; border-radius: 0px 4px 4px 0px; }
+.rtl .pagination > li:last-child > a, .rtl .pagination > li:last-child > span { border-radius: 4px 0px 0px 4px; }
+.rtl .pagination-lg > li:first-child > a, .rtl .pagination-lg > li:first-child > span { border-radius: 0px 6px 6px 0px; }
+.rtl .pagination-lg > li:last-child > a, .rtl .pagination-lg > li:last-child > span { border-radius: 6px 0px 0px 6px; }
+.rtl .pagination-sm > li:first-child > a, .rtl .pagination-sm > li:first-child > span { border-radius: 0px 3px 3px 0px; }
+.rtl .pagination-sm > li:last-child > a, .rtl .pagination-sm > li:last-child > span { border-radius: 3px 0px 0px 3px; }
+.rtl .pager .next > a, .rtl .pager .next > span { float: left; }
+.rtl .pager .previous > a, .rtl .pager .previous > span { float: right; }
+.rtl .list-group-item > .badge { float: left; }
+.rtl .list-group-item > .badge + .badge { margin-right: auto; margin-left: 5px; }
+.rtl .nav-pills > li > a > .badge { margin-left: auto; margin-right: 3px; }
+.rtl .alert-dismissable, .rtl .alert-dismissible { padding-right: 0px; padding-left: 35px; }
+.rtl .carousel-indicators, .rtl .list-group, .rtl .media-list { padding-left: 0px; padding-right: 0px; }
+.rtl .alert-dismissable .close, .rtl .alert-dismissible .close { right: auto; left: -21px; }
+.rtl .progress-bar { float: right; text-align: center; }
+.rtl button.list-group-item { text-align: right; }
+.rtl .panel { box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); }
+.rtl .embed-responsive .embed-responsive-item, .rtl .embed-responsive embed, .rtl .embed-responsive iframe, .rtl .embed-responsive object, .rtl .embed-responsive video { left: auto; right: 0px; }
+.rtl .close { float: left; }
+.rtl .ace-nav > li, .rtl .dropdown-navbar .msg-photo, .rtl .main-content-inner, .rtl .sidebar { float: right; }
+.rtl .modal-content { box-shadow: 0px 3px 9px rgba(0, 0, 0, 0.5); }
+.rtl .modal-footer { text-align: left; }
+.rtl .modal-footer .btn + .btn { margin-left: auto; margin-right: 5px; }
+.rtl .modal-footer .btn-group .btn + .btn { margin-left: auto; margin-right: -1px; }
+.rtl .modal-footer .btn-block + .btn-block { margin-left: auto; margin-right: 0px; }
+@media (min-width: 768px) {
+ .rtl .modal-content { box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.5); }
+}
+.rtl .tooltip { text-align: right; }
+.rtl .ace-icon, .rtl .carousel-caption, .rtl .carousel-control, .rtl .list-inline > li > .ace-icon:first-child, .rtl .list-unstyled > li > .ace-icon:first-child, .rtl .tooltip-inner { text-align: center; }
+.rtl .tooltip.bottom .tooltip-arrow, .rtl .tooltip.top .tooltip-arrow { left: auto; margin-left: auto; right: 50%; margin-right: -5px; }
+.rtl .carousel-inner > .item { transition: right 0.6s ease-in-out 0s; }
+@media not all, (-webkit-transform-3d) {
+ .rtl .carousel-inner > .item.active, .rtl .carousel-inner > .item.next, .rtl .carousel-inner > .item.prev { left: auto; right: 0px; }
+}
+.rtl .carousel-inner > .active { left: auto; right: 0px; }
+.rtl .carousel-inner > .next { left: auto; right: 100%; }
+.rtl .carousel-inner > .prev { left: auto; right: -100%; }
+.rtl .carousel-control { left: auto; right: 0px; }
+.rtl .carousel-control .icon-prev { left: auto; margin-left: auto; right: 50%; margin-right: -10px; }
+.rtl .carousel-control .icon-next { right: auto; margin-right: auto; left: 50%; margin-left: -10px; }
+.rtl .carousel-indicators { left: auto; margin-left: auto; text-align: center; right: 50%; margin-right: -30%; }
+@media screen and (min-width: 768px) {
+ .rtl .carousel-control .icon-prev { margin-left: auto; margin-right: -10px; }
+ .rtl .carousel-control .icon-next { margin-right: auto; margin-left: -10px; }
+}
+.rtl .main-container.container::before { box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1); }
+.rtl .main-content { margin-left: auto; margin-right: 0px; }
+.rtl .sidebar + .main-content { margin-left: auto; margin-right: 190px; }
+.rtl .ajax-loading-overlay.ajax-overlay-body > .ajax-loading-icon, .rtl .ajax-loading-overlay > .ajax-loading-icon { left: auto; right: 8px; }
+.rtl ol, .rtl ul { margin-right: 25px; margin-left: 0px; }
+.rtl ol.margin-5, .rtl ul.margin-5 { margin-left: auto; margin-right: 5px; }
+.rtl ol.margin-10, .rtl ul.margin-10 { margin-left: auto; margin-right: 10px; }
+.rtl ol.margin-15, .rtl ul.margin-15 { margin-left: auto; margin-right: 15px; }
+.rtl ol.margin-20, .rtl ul.margin-20 { margin-left: auto; margin-right: 20px; }
+.rtl li > ol, .rtl li > ul { margin-left: auto; margin-right: 18px; }
+.rtl .list-inline, .rtl .list-unstyled { margin-left: auto; margin-right: 0px; }
+.rtl .pager > li > a, .rtl .pagination > li > a { margin: 0px 0px 0px -1px; }
+.rtl .list-group { margin-left: auto; margin-right: auto; }
+.rtl .align-center, .rtl .center { text-align: center !important; }
+.rtl .ace-nav li.dropdown-footer a .ace-icon, .rtl .ace-nav > li > a, .rtl .ace-nav > li > a > .ace-icon { text-align: center; }
+.rtl .hr { border-width: 1px 0px 0px; }
+.rtl [class*="vspace-32"] { margin: 32px 0px 31px; }
+.rtl [class*="vspace-30"] { margin: 30px 0px 29px; }
+.rtl [class*="vspace-28"] { margin: 28px 0px 27px; }
+.rtl [class*="vspace-26"] { margin: 26px 0px 25px; }
+.rtl [class*="vspace-24"] { margin: 24px 0px 23px; }
+.rtl [class*="vspace-22"] { margin: 22px 0px 21px; }
+.rtl [class*="vspace-20"] { margin: 20px 0px 19px; }
+.rtl [class*="vspace-18"] { margin: 18px 0px 17px; }
+.rtl [class*="vspace-16"] { margin: 16px 0px 15px; }
+.rtl [class*="vspace-14"] { margin: 14px 0px 13px; }
+.rtl [class*="vspace-12"] { margin: 12px 0px 11px; }
+.rtl [class*="vspace-10"] { margin: 10px 0px 9px; }
+.rtl [class*="vspace-8"] { margin: 8px 0px 7px; }
+.rtl [class*="vspace-6"] { margin: 6px 0px 5px; }
+.rtl [class*="vspace-4"] { margin: 4px 0px 3px; }
+.rtl [class*="vspace-2"] { margin: 2px 0px 1px; }
+.rtl .header > .ace-icon { margin-right: auto; margin-left: 2px; }
+.rtl .ace-nav > li { border-left: medium none; border-right: 1px solid rgb(225, 225, 225); }
+.rtl .ace-nav > li:first-child { border-right-width: 0px; }
+.rtl .ace-nav > li > a > .badge { left: auto; right: 2px; }
+.rtl .ace-nav > li.margin-4 { margin-left: auto; margin-right: 4px; }
+.rtl .ace-nav > li.margin-3 { margin-left: auto; margin-right: 3px; }
+.rtl .ace-nav > li.margin-2 { margin-left: auto; margin-right: 2px; }
+.rtl .ace-nav > li.margin-1 { margin-left: auto; margin-right: 1px; }
+.rtl .ace-nav .nav-user-photo { margin: -4px 0px 0px 8px; }
+@media only screen and (max-width: 479px) {
+ .rtl .navbar:not(.navbar-collapse) .ace-nav { text-align: center; }
+ .rtl .navbar:not(.navbar-collapse) .ace-nav > li { text-align: right; }
+ .rtl .navbar:not(.navbar-collapse) .ace-nav > li:first-child { border-left: medium none; border-right: 1px solid rgba(255, 255, 255, 0.4); }
+ .rtl .navbar:not(.navbar-collapse) .ace-nav > li:last-child { border-right: medium none; border-left: 1px solid rgba(255, 255, 255, 0.4); }
+}
+.rtl .user-menu > li > a > .ace-icon { margin-right: auto; margin-left: 6px; }
+.rtl .user-info { text-align: right; }
+@media (min-width: 480px) and (max-width: 540px), (max-width: 360px) {
+ .rtl .navbar:not(.navbar-collapse) .navbar-buttons .nav-user-photo { margin-right: auto; margin-left: 0px; }
+ .rtl .navbar:not(.navbar-collapse) .navbar-buttons .user-info { margin-left: auto; right: auto; text-align: center; margin-right: 1px; left: 2px; }
+}
+@media (max-width: 360px) {
+ .rtl .navbar.navbar-collapse .navbar-buttons .nav-user-photo { margin-right: auto; margin-left: 0px; }
+ .rtl .navbar.navbar-collapse .navbar-buttons .user-info { margin-left: auto; right: auto; text-align: center; margin-right: 1px; left: 2px; }
+ .rtl li.open .user-info { right: auto; left: 2px; }
+}
+@media (min-width: 992px) {
+ .rtl .user-min .nav-user-photo { margin-right: auto; margin-left: 0px; }
+ .rtl .user-min .user-info { margin-left: auto; text-align: center; margin-right: 1px; right: auto; left: -3px; }
+}
+@media (max-height: 540px) and (min-width: 480px) and (max-width: 540px), (max-height: 540px) and (max-width: 360px) {
+ .rtl .navbar:not(.navbar-collapse) .ace-nav > li.dropdown-modal .user-info { right: auto; left: auto; }
+}
+@media (max-height: 540px) and (max-width: 360px) {
+ .rtl .navbar.navbar-collapse .ace-nav > li.dropdown-modal .user-info { right: auto; left: auto; }
+}
+@media (max-height: 540px) and (min-width: 992px) {
+ .rtl .ace-nav > li.dropdown-modal.user-min .user-info { right: auto; left: auto; }
+}
+@media only screen and (max-width: 991px) {
+ .rtl .navbar.navbar-collapse .navbar-buttons > .ace-nav { text-align: center; }
+ .rtl .navbar.navbar-collapse .navbar-buttons > .ace-nav > li { text-align: right; }
+ .rtl .navbar.navbar-collapse .navbar-buttons > .ace-nav > li:first-child { border-left: medium none; border-right: 1px solid rgba(255, 255, 255, 0.4); }
+ .rtl .navbar.navbar-collapse .navbar-buttons > .ace-nav > li:last-child { border-right: medium none; border-left: 1px solid rgba(255, 255, 255, 0.4); }
+}
+.rtl .container-fluid > .navbar-buttons, .rtl .container > .navbar-buttons { padding-right: 0px !important; padding-left: 0px !important; }
+.rtl .navbar .navbar-nav > li { border-width: 0px 0px 0px 1px; }
+.rtl .navbar .navbar-nav > li:first-child { border-width: 0px 1px; }
+.rtl .navbar .navbar-toggle { text-align: center; }
+.rtl .navbar .navbar-toggle .icon-bar { margin-left: auto; margin-right: 7px; }
+.rtl .nav-list > li > a { padding-left: 0px; padding-right: 7px; }
+.rtl .nav-list > li > a > .menu-icon { margin-right: auto; text-align: center; margin-left: 2px; }
+.rtl .nav-list > li::before { left: auto; right: 0px; }
+@media only screen and (min-width: 992px) {
+ .rtl .main-container.container .sidebar:not(.h-sidebar) .nav-list > li::before { left: auto; right: -2px; }
+}
+.rtl .main-container.container .sidebar.sidebar-fixed:not(.h-sidebar) .nav-list > li::before { left: auto; right: 0px; }
+.rtl .nav-list > li a > .arrow { right: auto; text-align: center; left: 10px; }
+.rtl .nav-list > li .submenu > li { margin-left: auto; margin-right: 0px; }
+.rtl .nav-list > li .submenu > li > a { padding: 7px 37px 9px 0px; }
+.rtl .nav-list > li .submenu > li a > .menu-icon { text-align: center; left: auto; right: 10px; }
+.rtl .nav-list > li > .submenu > li::before { left: auto; right: 20px; }
+.rtl .nav-list > li > .submenu::before { left: auto; border-width: 0px 1px 0px 0px; right: 18px; }
+.rtl .nav-list a .badge, .rtl .nav-list a .label, .rtl .nav-list > li > .submenu a > .arrow { left: 10px; right: auto; }
+.rtl .nav-list > li > .submenu li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 20px; padding-right: 22px; }
+.rtl .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 20px; padding-right: 38px; }
+.rtl .nav-list > li > .submenu li > .submenu > li a > .menu-icon { margin-right: auto; margin-left: 4px; }
+.rtl .nav-list a.dropdown-toggle .badge, .rtl .nav-list a.dropdown-toggle .label { right: auto; left: 26px; }
+@media only screen and (max-width: 991px) {
+ .rtl .navbar-fixed-top + .main-container > .responsive, .rtl .responsive.sidebar-fixed { left: auto; margin-left: auto; right: auto; margin-right: auto; }
+ .rtl .navbar-fixed-top + .main-container > .menu-toggler + .responsive { left: auto; margin-left: auto; right: 190px; margin-right: -190px; }
+ .rtl .navbar-fixed-top + .main-container > .menu-toggler + .responsive.sidebar-fixed, .rtl .sidebar.responsive.sidebar-fixed, .rtl .sidebar.sidebar-fixed.responsive-max { left: auto; margin-left: auto; right: auto; margin-right: auto; }
+ .rtl .main-container .menu-toggler.fixed { left: auto; right: auto; }
+}
+.rtl .sidebar .sidebar-shortcuts, .rtl .sidebar .sidebar-shortcuts-large > .btn, .rtl .sidebar .sidebar-toggle { text-align: center; }
+.rtl .nav-list li.active > a::after { right: auto; left: 0px; }
+@media (min-width: 992px) {
+ .rtl .sidebar.compact .nav-list > li > a { text-align: center; }
+ .rtl .sidebar.compact .nav-list a .badge, .rtl .sidebar.compact .nav-list a .label { right: auto; left: 12px; }
+ .rtl .sidebar.compact + .main-content { margin-left: auto; margin-right: 105px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .rtl .sidebar.compact + .main-content { margin-left: auto; margin-right: 0px; }
+ .rtl .sidebar.navbar-collapse.compact .nav-list > li > a { text-align: right; padding: 0px 7px 0px 16px; }
+ .rtl .sidebar.navbar-collapse.compact .nav-list > li > a > .menu-icon { margin: 0px 0px 0px 2px; }
+ .rtl .sidebar.navbar-collapse.compact + .main-content { margin-left: auto; margin-right: 0px; }
+}
+@media only screen and (min-width: 992px) {
+ .rtl .nav-list li.hover > .submenu { left: auto; margin-left: auto; right: 100%; margin-right: -2px; }
+ .rtl .nav-list li.hover > .submenu > li > a { padding-left: 0px; padding-right: 18px; }
+ .rtl .nav-list > li > .submenu li.hover > .submenu > li > a { padding-left: 0px !important; margin-left: auto !important; padding-right: 12px !important; margin-right: auto !important; }
+ .rtl .nav-list > li > .submenu li.hover > .submenu > li > a > .menu-icon { margin-right: auto; margin-left: 2px; }
+ .rtl .nav-list > li .submenu > li.hover > a { padding-left: 0px; padding-right: 22px; }
+ .rtl .nav-list > li .submenu > li.hover > a > .menu-icon { left: auto; right: 4px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .rtl .sidebar.navbar-collapse .nav-list li.hover > .submenu { left: auto; right: auto; }
+ .rtl .sidebar.navbar-collapse .nav-list li.hover > .submenu li > a { padding-left: 0px; padding-right: 37px; }
+ .rtl .sidebar.navbar-collapse .nav-list li.hover > .submenu > li > a > .menu-icon { margin-right: auto; margin-left: auto; }
+ .rtl .sidebar.navbar-collapse .nav-list > li .submenu > li.hover > a > .menu-icon { left: auto; right: 10px; }
+ .rtl .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a { padding-left: 0px !important; margin-left: auto !important; padding-right: 22px !important; margin-right: 20px !important; }
+ .rtl .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a > .menu-icon { margin-right: auto; margin-left: 4px; }
+ .rtl .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li.hover > .submenu > li > a { margin-left: auto !important; padding-left: 0px !important; margin-right: 20px !important; padding-right: 38px !important; }
+}
+.rtl .nav-list li > .arrow { right: auto; left: 1px; }
+.rtl .nav-list li > .arrow::after, .rtl .nav-list li > .arrow::before { left: auto; right: -19px; }
+.rtl .nav-list li > .arrow::before { left: auto; right: -20px; }
+.rtl .sidebar.menu-min + .main-content { margin-left: auto; margin-right: 43px; }
+.rtl .sidebar.menu-min .nav-list a .badge, .rtl .sidebar.menu-min .nav-list a .label { right: 4px; left: auto; }
+.rtl .sidebar.menu-min .nav-list > li > a > .menu-icon { margin-right: auto; margin-left: 0px; }
+.rtl .sidebar.menu-min .nav-list > li > a > .menu-text { text-align: right; left: auto; padding-left: 0px; right: 42px; padding-right: 12px; }
+.rtl .sidebar.menu-min .nav-list > li > .submenu { left: auto; right: 42px; }
+.rtl .sidebar.menu-min .nav-list > li > .submenu::after { border-left-width: 1px; border-left-style: solid; border-left-color: inherit; }
+.rtl .sidebar.menu-min .nav-list > li > .submenu li > a { margin-left: auto; padding-left: 0px; margin-right: 0px; padding-right: 22px; }
+.rtl .sidebar.menu-min .nav-list > li > .submenu li > a > .menu-icon { left: auto; right: 4px; }
+.rtl .sidebar.menu-min .nav-list > li > .arrow::after, .rtl .sidebar.menu-min .nav-list > li > .arrow::before { left: auto; right: -16px; }
+.rtl .sidebar.menu-min .nav-list > li > .arrow::before { left: auto; right: -17px; }
+.rtl .sidebar.menu-min .nav-list li > .arrow { right: auto; left: -1px; }
+.rtl .sidebar.menu-min .sidebar-shortcuts-large { left: auto; right: 42px; }
+.rtl .sidebar.menu-min .nav-list > li > .submenu li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 2px; padding-right: 30px; }
+.rtl .sidebar.menu-min .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 2px; padding-right: 45px; }
+@media (min-width: 992px) {
+ .rtl .sidebar.menu-min .nav-list li.hover > .submenu { margin-left: auto; margin-right: 0px; }
+ .rtl .sidebar.menu-min .nav-list > li > .submenu li.hover > .submenu > li > a, .rtl .sidebar.menu-min .nav-list > li > .submenu li > .submenu > li.hover > .submenu > li > a { margin-left: auto !important; margin-right: 0px !important; }
+ .rtl .sidebar.menu-min.compact .nav-list > li > a { padding: 0px 7px 0px 16px; }
+}
+@media only screen and (min-width: 992px) {
+ .rtl .navbar.h-navbar { box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.25); }
+ .rtl .sidebar.h-sidebar .nav-list > li { float: right; border-width: 0px 1px 0px 0px; margin-left: auto; margin-right: 0px; }
+ .rtl .sidebar.h-sidebar .nav-list > li:last-child { border-left-width: 1px; }
+ .rtl .sidebar.h-sidebar .nav-list > li:first-child { margin-left: auto; border-right-width: 0px; margin-right: 0px; }
+ .rtl .sidebar.h-sidebar .sidebar-shortcuts + .nav-list > li:first-child { margin-left: auto; border-right-width: 1px; margin-right: -1px; }
+ .rtl .sidebar.h-sidebar .nav-list > li.hover > .submenu { left: auto; margin-left: auto; right: 1px; margin-right: -2px; }
+ .rtl .sidebar.h-sidebar .nav-list > li.hover > .arrow { right: 24px; left: auto; }
+ .rtl .sidebar.h-sidebar .nav-list > li.hover > .arrow::after, .rtl .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { right: -10px !important; left: auto !important; }
+ .rtl .sidebar.h-sidebar .nav-list > li.hover-flip > .submenu { left: 1px; right: auto; margin-left: -2px; margin-right: auto; }
+ .rtl .sidebar.h-sidebar .nav-list > li.hover-flip > .arrow { left: 24px; right: auto; }
+ .rtl .sidebar.h-sidebar .nav-list li li.hover-flip > .submenu { left: 100%; right: auto; margin-left: -2px; margin-right: auto; }
+ .rtl .sidebar.h-sidebar .nav-list li li.hover-flip > .arrow { left: auto; right: 0px; }
+ .rtl .sidebar.h-sidebar .sidebar-shortcuts-large::after, .rtl .sidebar.h-sidebar .sidebar-shortcuts-large::before { left: auto; margin-left: auto; right: 50%; margin-right: -8px; }
+ .rtl .sidebar.h-sidebar .sidebar-shortcuts-large::after { border-right-color: transparent; border-left-color: transparent; }
+ .rtl .sidebar.h-sidebar .sidebar-toggle { right: auto; left: 6px; }
+ .rtl .sidebar.h-sidebar .sidebar-shortcuts { float: right; }
+ .rtl .sidebar.h-sidebar .sidebar-shortcuts-large { left: auto; right: 10px; }
+ .rtl .sidebar.h-sidebar .nav-list a .badge, .rtl .sidebar.h-sidebar .nav-list a .label { right: 50% !important; left: auto !important; margin-left: auto; margin-right: 10px; }
+ .rtl .sidebar.h-sidebar + .main-content { margin-left: auto; margin-right: 0px; }
+}
+@media (min-width: 992px) {
+ .rtl .sidebar.h-sidebar.menu-min .nav-list > li > a > .menu-text { left: auto; right: -1px; }
+ .rtl .sidebar.h-sidebar.menu-min .sidebar-shortcuts-large { left: auto; right: 1px; }
+}
+@media only screen and (max-width: 991px) {
+ .rtl .sidebar.responsive { box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.15); transform: translateX(200px); left: auto; margin-left: auto; right: 190px; margin-right: -190px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .rtl .sidebar.responsive.compact { transform: translateX(115px); }
+ .rtl .sidebar.responsive.compact.push_away.display + .main-content { transform: translateX(-105px); }
+}
+@media only screen and (max-width: 991px) {
+ .rtl .sidebar.responsive.menu-min { transform: translateX(53px); }
+ .rtl .sidebar.responsive.push_away.display + .main-content { transform: translateX(-190px); }
+ .rtl .sidebar.responsive.push_away.display.menu-min + .main-content { transform: translateX(-43px); }
+ .rtl .main-container .menu-toggler.fixed { left: auto; right: auto; }
+ .rtl .main-container .menu-toggler { margin-right: auto; padding-left: 0px; margin-left: 2px; padding-right: 33px; }
+ .rtl .main-container .menu-toggler::after, .rtl .main-container .menu-toggler::before { left: auto; right: 4px; }
+ .rtl .main-container .menu-toggler > .toggler-text { left: auto; right: 0px; }
+ .rtl .main-container .menu-toggler > .toggler-text::after { left: auto; right: -8px; }
+}
+@media only screen and (max-width: 320px) {
+ .rtl .main-container .menu-toggler > .toggler-text::after { left: auto; right: -13px; }
+}
+@media (max-width: 991px) {
+ .rtl .sidebar.responsive-min .nav-list a .badge, .rtl .sidebar.responsive-min .nav-list a .label { right: 4px; left: auto; }
+ .rtl .sidebar.responsive-min .nav-list > li > a > .menu-icon { margin-right: auto; margin-left: 0px; }
+ .rtl .sidebar.responsive-min .nav-list > li > a > .menu-text { text-align: right; left: auto; padding-left: 0px; right: 42px; padding-right: 12px; }
+ .rtl .sidebar.responsive-min .nav-list > li > .submenu { left: auto; right: 42px; }
+ .rtl .sidebar.responsive-min .nav-list > li > .submenu::after { right: auto; border-right: medium none transparent; left: -1px; border-left-width: 1px; border-left-style: solid; border-left-color: inherit; }
+ .rtl .sidebar.responsive-min .nav-list > li > .submenu li > a { margin-left: auto; padding-left: 0px; margin-right: 0px; padding-right: 22px; }
+ .rtl .sidebar.responsive-min .nav-list > li > .submenu li > a > .menu-icon { left: auto; right: 4px; }
+ .rtl .sidebar.responsive-min .nav-list > li > .arrow::after, .rtl .sidebar.responsive-min .nav-list > li > .arrow::before { left: auto; right: -16px; }
+ .rtl .sidebar.responsive-min .nav-list > li > .arrow::before { left: auto; right: -17px; }
+ .rtl .sidebar.responsive-min .nav-list li > .arrow { right: auto; left: -1px; }
+ .rtl .sidebar.responsive-min .sidebar-shortcuts-large { left: auto; right: 42px; }
+ .rtl .sidebar.responsive-min .nav-list > li > .submenu li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 2px; padding-right: 30px; }
+ .rtl .sidebar.responsive-min .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 2px; padding-right: 45px; }
+ .rtl .sidebar.responsive-min + .main-content { margin-left: auto !important; margin-right: 43px !important; }
+ .rtl .sidebar.responsive-min + .main-content .breadcrumb { margin-left: auto; margin-right: 12px; }
+ .rtl .sidebar.responsive-max { left: auto; margin-left: auto; box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.15); right: 190px; margin-right: -190px; }
+ .rtl .sidebar.responsive-max + .main-content { margin-left: auto !important; margin-right: 43px !important; }
+ .rtl .sidebar.responsive-max + .main-content .breadcrumb { margin-left: auto; margin-right: 12px; }
+}
+@media only screen and (max-width: 991px) {
+ .rtl .sidebar.navbar-collapse .nav-list li > .submenu { border-right-width: 0px; }
+ .rtl .sidebar.navbar-collapse + .main-content .breadcrumb { margin-left: auto; margin-right: 12px; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu { left: auto; border-width: 1px 0px 0px !important; right: auto; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > a > .menu-icon { left: auto; right: 10px; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > a { padding: 7px 37px 9px 0px; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 20px; padding-right: 22px; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 20px; padding-right: 38px; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > a { text-align: right; padding-left: 0px; padding-right: 7px; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > a > .menu-icon { margin-right: auto; margin-left: 2px; }
+ .rtl .sidebar.navbar-collapse.menu-min .nav-list > li > a > .menu-text { padding-left: 0px; left: auto; padding-right: 0px; right: auto; }
+ .rtl .sidebar.navbar-collapse .nav-list a .badge, .rtl .sidebar.navbar-collapse .nav-list a .label { right: 4px; left: auto; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .rtl .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a, .rtl .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li.hover > .submenu > li > a { margin-left: auto !important; margin-right: 20px !important; }
+}
+@media only screen and (min-width: 992px) {
+ .rtl .main-content .h-sidebar + .page-content { margin-left: auto; margin-right: auto; }
+ .rtl .main-content .h-sidebar.sidebar-fixed { left: auto; right: 190px; }
+ .rtl .sidebar.compact + .main-content .h-sidebar.sidebar-fixed { left: auto; right: 105px; }
+ .rtl .sidebar.menu-min + .main-content .h-sidebar.sidebar-fixed { left: auto; right: 43px; }
+}
+.rtl .sidebar .nav-wrap + .ace-scroll { right: auto; left: 0px; }
+.rtl .sidebar .nav-wrap + .scrollout { right: auto; left: -8px; }
+.rtl .modal.ng-aside .modal-content { box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.5); }
+.rtl .breadcrumbs { padding: 0px 0px 0px 12px; }
+.rtl .breadcrumb { margin: 6px 12px 0px 22px; }
+.rtl .breadcrumb > li, .rtl .breadcrumb > li.active { padding: 0px 3px; }
+.rtl .breadcrumb > li + li::before { margin: 0px 0px 0px 8px; }
+@media only screen and (max-width: 991px) {
+ .rtl .menu-toggler + .sidebar.responsive + .main-content .breadcrumb { margin-left: auto; margin-right: 90px; }
+}
+@media only screen and (max-width: 320px) {
+ .rtl .breadcrumb { margin-left: auto; margin-right: 8px; }
+ .rtl .menu-toggler + .sidebar.responsive + .main-content .breadcrumb { margin-left: auto; margin-right: 36px; }
+}
+@media (min-width: 992px) {
+ .rtl .sidebar + .main-content .breadcrumbs-fixed { left: auto; right: 190px; }
+ .rtl .sidebar.compact + .main-content .breadcrumbs-fixed { left: auto; right: 105px; }
+ .rtl .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: auto; right: 43px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .rtl .breadcrumbs-fixed, .rtl .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: auto; right: 0px; }
+ .rtl .sidebar.responsive-max + .main-content .breadcrumbs-fixed, .rtl .sidebar.responsive-min + .main-content .breadcrumbs-fixed { left: auto; right: 43px; }
+}
+@media (min-width: 992px) {
+ .rtl .h-sidebar + .main-content .breadcrumbs.breadcrumbs-fixed { left: auto; right: auto; }
+}
+.rtl .nav-search { right: auto; left: 22px; }
+.rtl .sidebar > .nav-search { text-align: center; }
+.rtl .sidebar.menu-min .nav-search .form-search { left: auto; right: 5px; }
+@media (max-width: 991px) {
+ .rtl .sidebar.responsive-min .nav-search .form-search { left: auto; right: 5px; }
+}
+@media only screen and (max-width: 991px) {
+ .rtl .nav-search { right: auto; left: 10px; }
+}
+.rtl .btn.disabled:active, .rtl .btn[disabled]:active { left: auto; right: 0px; }
+.rtl .btn > .ace-icon { margin-right: auto; margin-left: 4px; }
+.rtl .btn > .icon-only.ace-icon { text-align: center; }
+.rtl .btn-lg > .ace-icon { margin-right: auto; margin-left: 6px; }
+.rtl .btn-sm > .ace-icon { margin-right: auto; margin-left: 3px; }
+.rtl .btn-mini > .ace-icon, .rtl .btn-minier > .ace-icon, .rtl .btn-xs > .ace-icon { margin-right: auto; margin-left: 2px; }
+.rtl .btn-group:first-child { margin-left: auto; margin-right: 0px; }
+.rtl .btn-group > .btn, .rtl .btn-group > .btn + .btn, .rtl .btn-group > .btn:first-child { margin: 0px 0px 0px 1px; }
+.rtl .btn-group > .btn > .caret { margin-left: auto; margin-right: 1px; }
+.rtl .btn-group + .btn, .rtl .btn-group > .btn { margin: 0px 0px 0px 1px; }
+.rtl .btn-group.btn-overlap > .btn { margin-right: auto; margin-left: -1px; }
+.rtl .btn-group.btn-corner > .btn:first-child { border-radius: 0px 8px 8px 0px; }
+.rtl .btn-group.btn-corner > .btn:last-child { border-radius: 8px 0px 0px 8px; }
+.rtl .btn-group.btn-corner > .btn.btn-sm:first-child { border-radius: 0px 6px 6px 0px; }
+.rtl .btn-group.btn-corner > .btn.btn-sm:last-child { border-radius: 6px 0px 0px 6px; }
+.rtl .btn-group.btn-corner > .btn.btn-mini:first-child, .rtl .btn-group.btn-corner > .btn.btn-xs:first-child { border-radius: 0px 4px 4px 0px; }
+.rtl .btn-group.btn-corner > .btn.btn-mini:last-child, .rtl .btn-group.btn-corner > .btn.btn-xs:last-child { border-radius: 4px 0px 0px 4px; }
+.rtl .btn.btn-app { text-align: center; }
+.rtl .btn.btn-app > .badge, .rtl .btn.btn-app > .label { right: auto; text-align: center; left: -2px; }
+.rtl .btn-group > .btn-app:first-child:not(:last-child):not(.dropdown-toggle) { margin-right: auto; margin-left: 24px; }
+.rtl .btn-group > .btn-app + .btn-app.dropdown-toggle { margin-left: auto; right: auto; margin-right: -23px; left: 0px; border-radius: 0px; }
+.rtl .btn.btn-app.btn-light, .rtl .btn.btn-app.btn-yellow { box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.08) inset !important; }
+.rtl .label.label-white { border-right-width: 2px; border-left-width: 1px; }
+.rtl .dropdown-submenu > a::after { margin-right: auto; margin-left: -5px; }
+.rtl .dropdown-navbar { box-shadow: 0px 2px 4px rgba(30, 30, 100, 0.25); }
+.rtl .dropdown-navbar > li > .ace-icon, .rtl .dropdown-navbar > li > a > .ace-icon { margin-right: auto !important; margin-left: 5px !important; }
+.rtl .dropdown-navbar > li.dropdown-footer > a { text-align: center; }
+.rtl .dropdown-navbar .ace-icon[class*="btn"] { margin: 0px 0px 0px 5px; text-align: center; }
+.rtl .dropdown-navbar .msg-body { margin-left: auto; margin-right: 50px; }
+.rtl .help-button { text-align: center; margin-left: auto; box-shadow: 0px 1px 0px 1px rgba(0, 0, 0, 0.2); margin-right: 4px; }
+.rtl .limiterBox::before { left: auto; margin-left: auto; right: 50%; margin-right: -5px; }
+.rtl .form-inline .checkbox [type="checkbox"] + label, .rtl .form-inline .radio [type="radio"] + label, .rtl .form-search .checkbox [type="checkbox"] + label, .rtl .form-search .radio [type="radio"] + label { float: right; margin-left: auto; margin-right: -20px; }
+.rtl .form-inline .form-inline .checkbox [type="checkbox"] + label, .rtl .form-inline .form-inline .radio [type="radio"] + label, .rtl .form-inline .form-search .checkbox [type="checkbox"] + label, .rtl .form-inline .form-search .radio [type="radio"] + label, .rtl .form-search .form-inline .checkbox [type="checkbox"] + label, .rtl .form-search .form-inline .radio [type="radio"] + label, .rtl .form-search .form-search .checkbox [type="checkbox"] + label, .rtl .form-search .form-search .radio [type="radio"] + label { margin-left: 3px; margin-right: 0px; }
+.rtl .ace-file-input .ace-file-container::before { right: auto; text-align: center; left: 0px; border-right-width: 4px; }
+.rtl .ace-file-input .ace-file-container .ace-file-name { padding-left: 0px; padding-right: 30px; }
+.rtl .ace-file-input .ace-file-container.selected { left: 16px; }
+.rtl .ace-file-input .ace-file-container .ace-icon { left: auto; text-align: center; right: 0px; }
+.rtl .ace-file-input .remove { right: auto; text-align: center; left: -8px; }
+.rtl .ace-file-input .ace-file-overlay { left: -10px; right: -2px; }
+.rtl .ace-file-input .ace-file-overlay > .overlay-content, .rtl .ace-file-multiple .ace-file-container { text-align: center; }
+.rtl .ace-file-multiple .ace-file-container.selected .ace-file-name .ace-icon { left: auto; text-align: center; right: 0px; }
+.rtl .ace-file-multiple .ace-file-container .ace-file-name { text-align: right; }
+.rtl .ace-file-multiple .ace-file-container .ace-file-name .ace-icon, .rtl .ace-file-multiple .ace-file-container .ace-file-name.large, .rtl .infobox-container, .rtl .progress[data-percent]::after, .rtl .widget-box-overlay, .rtl .widget-box-overlay > .loading-icon, .rtl .widget-toolbox.center, .rtl td.center, .rtl th.center, .rtl th.detail-col { text-align: center; }
+.rtl .ace-file-multiple .ace-file-container .ace-file-name img { margin: 4px 1px 4px 8px; }
+.rtl .ace-file-multiple .remove { right: auto; left: -11px; }
+.rtl .ace-file-multiple .ace-file-container.selected .ace-file-name .ace-icon { margin-right: 2px; margin-left: 4px; }
+.rtl .input-group > .btn + .btn { margin-left: auto; margin-right: 1px; }
+.rtl .form-group.has-success input:focus, .rtl .form-group.has-success select:focus, .rtl .form-group.has-success textarea:focus { box-shadow: 0px 0px 0px 2px rgba(130, 188, 58, 0.3); }
+.rtl .form-group.has-info input:focus, .rtl .form-group.has-info select:focus, .rtl .form-group.has-info textarea:focus { box-shadow: 0px 0px 0px 2px rgba(58, 120, 188, 0.3); }
+.rtl .form-group.has-error input:focus, .rtl .form-group.has-error select:focus, .rtl .form-group.has-error textarea:focus { box-shadow: 0px 0px 0px 2px rgba(219, 137, 120, 0.3); }
+.rtl .form-group.has-warning input:focus, .rtl .form-group.has-warning select:focus, .rtl .form-group.has-warning textarea:focus { box-shadow: 0px 0px 0px 2px rgba(216, 188, 65, 0.3); }
+@media only screen and (max-width: 767px) {
+ .rtl .help-inline { padding-left: 0px; padding-right: 0px; }
+}
+.rtl .accordion-style2.panel-group .panel-heading .accordion-toggle { border-width: 0px 2px 0px 0px; }
+.rtl .accordion-style2.panel-group .panel-heading .accordion-toggle.collapsed { border-width: 0px 1px 0px 0px; }
+.rtl .widget-header { padding-left: 0px; padding-right: 12px; }
+.rtl .widget-header-large { padding-left: 0px; padding-right: 18px; }
+.rtl .widget-header-small { padding-left: 0px; padding-right: 10px; }
+.rtl .widget-header > .widget-title > .ace-icon { margin-right: auto; margin-left: 5px; }
+.rtl .widget-toolbar { float: left; }
+.rtl .widget-toolbar::before { left: auto; border-width: 0px 0px 0px 1px; right: -1px; }
+.rtl .widget-color-dark > .widget-header > .widget-toolbar::before { box-shadow: 1px 0px 0px rgba(255, 255, 255, 0.2), 1px 0px 0px rgba(255, 255, 255, 0.1) inset; }
+.rtl .widget-toolbar > .widget-menu > a[data-action] > .ace-icon, .rtl .widget-toolbar > a[data-action] > .ace-icon { margin-right: auto; margin-left: 0px; }
+.rtl .widget-box.transparent > .widget-header { padding-left: 0px; padding-right: 3px; }
+.rtl .widget-box.transparent > .widget-header-large { padding-left: 0px; padding-right: 5px; }
+.rtl .widget-box.transparent > .widget-header-small { padding-left: 0px; padding-right: 1px; }
+.rtl .widget-toolbox.toolbox-vertical { border-right: medium none; border-left: 1px solid rgb(217, 217, 217); }
+.rtl li.item-black, .rtl li.item-blue, .rtl li.item-blue3, .rtl li.item-brown, .rtl li.item-default, .rtl li.item-green, .rtl li.item-green2, .rtl li.item-grey, .rtl li.item-orange, .rtl li.item-orange2, .rtl li.item-pink, .rtl li.item-purple, .rtl li.item-red, .rtl li.item-red2 { border-left-color: transparent; }
+.rtl .infobox { margin: -1px -1px 0px 0px; padding: 8px 9px 6px 3px; text-align: right; }
+.rtl .infobox > .infobox-icon > .ace-icon { padding: 1px 2px 0px 1px; text-align: center; box-shadow: -1px 1px 0px rgba(0, 0, 0, 0.2); }
+.rtl .infobox > .infobox-icon > .ace-icon::before { text-align: center; }
+.rtl .infobox > .infobox-data { text-align: right; padding-left: 0px; padding-right: 8px; }
+.rtl .infobox-dark { margin: 1px 0px 0px 1px; }
+.rtl .infobox > .infobox-chart { text-align: center; }
+.rtl .infobox > .stat { right: auto; padding-right: 0px; left: 20px; padding-left: 18px; }
+.rtl .infobox > .stat::before { right: auto; left: 4px; }
+.rtl .infobox > .stat::after { right: auto; left: 1px; }
+.rtl .infobox > .badge { right: auto; left: 20px; }
+.rtl .infobox.infobox-dark > .badge { right: auto; left: 2px; }
+.rtl .infobox-small, .rtl .infobox-small > .infobox-data { text-align: right; }
+.rtl .infobox-small .percentage, .rtl .infobox-small > .infobox-chart > .sparkline { margin-left: auto; margin-right: 2px; }
+.rtl .pricing-box:not(:first-child) { padding-left: 0px; padding-right: 7px; }
+.rtl .pricing-box:not(:last-child) { padding-right: 0px; padding-left: 7px; }
+.rtl .pricing-box .price { text-align: center; }
+.rtl .pricing-box .widget-header { text-align: center; padding-left: 0px; padding-right: 0px; }
+@media only screen and (max-width: 480px) {
+ .rtl .pricing-box { margin-left: auto; margin-right: -1px; }
+ .rtl .pricing-box:nth-child(2n+1) { padding-left: 0px !important; padding-right: 12px !important; }
+ .rtl .pricing-box:nth-child(2n) { padding-right: 0px !important; padding-left: 12px !important; }
+}
+.rtl .pricing-table-header { text-align: right; }
+.rtl .pricing-box-small .price, .rtl .pricing-table > li { text-align: center; }
+.rtl .pricing-table-header > li { padding: 7px 11px 7px 0px; }
+.rtl .pricing-box-small { margin-left: auto; margin-right: -2px; }
+.rtl .pricing-box-small:hover { box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.15); }
+.rtl .pricing-span { float: right !important; }
+.rtl .pricing-span-header { padding-right: 0px; padding-left: 0px; }
+.rtl .login-box .toolbar > div:first-child { float: right; text-align: right; }
+.rtl .login-box .toolbar > div:first-child > a { margin-left: auto; margin-right: 11px; }
+.rtl .login-box .toolbar > div:first-child + div { float: left; text-align: left; }
+.rtl .login-box .toolbar > div:first-child + div > a { margin-right: auto; margin-left: 11px; }
+.rtl .social-or-login { text-align: center; }
+.rtl .light-login .widget-box { box-shadow: 0px 0px 2px 1px rgba(0, 0, 0, 0.12); }
+.rtl .invoice-info-label { text-align: left; }
+.rtl .invoice-box .label-large[class*="arrowed"] { margin-left: auto !important; margin-right: 11px !important; }
+.rtl .ace-thumbnails > li { float: right; }
+.rtl .ace-thumbnails > li .tags { right: auto; direction: ltr; left: 0px; }
+.rtl .ace-thumbnails > li .tags > .label-holder { margin: 1px 0px 0px; direction: rtl; text-align: right; }
+.rtl .ace-thumbnails > li > .tools { left: auto; text-align: center; right: -30px; }
+.rtl .ace-thumbnails > li > :first-child > .text { text-align: center; }
+.rtl .ace-thumbnails > li > :first-child > .text::before { margin-right: auto; margin-left: 0px; }
+@media only screen and (max-width: 480px) {
+ .rtl .pricing-span-body, .rtl .pricing-span-header { padding-right: 0px; padding-left: 12px; }
+ .rtl .ace-thumbnails { text-align: center; }
+}
+.rtl .itemdiv { padding-right: 0px; padding-left: 3px; }
+.rtl .itemdiv > .user { left: auto; right: 0px; }
+.rtl .itemdiv > .body { margin-left: 12px; margin-right: 50px; }
+.rtl .itemdiv > .body > .time { right: auto; left: 9px; }
+.rtl .itemdiv > .body > .text { padding-left: 0px; padding-right: 7px; }
+.rtl .itemdiv > .body > .text::after { left: -12px; right: 16px; }
+.rtl .itemdiv > .body > .text > .ace-icon:first-child { margin-right: auto; margin-left: 4px; }
+.rtl .itemdiv.dialogdiv::before { left: auto; right: 19px; }
+.rtl .itemdiv.dialogdiv > .body { border-right-width: 2px; }
+.rtl .itemdiv.dialogdiv > .body::before { left: auto; border-width: 2px 2px 0px 0px; right: -7px; transform: rotate(45deg); }
+.rtl .itemdiv.dialogdiv > .body > .time { float: left; }
+.rtl .itemdiv.dialogdiv > .body > .text { padding-left: 0px; padding-right: 0px; }
+.rtl .itemdiv.memberdiv { float: right; }
+.rtl .itemdiv .tools { right: auto; left: 5px; }
+.rtl .itemdiv.commentdiv .tools { right: auto; left: 9px; }
+.rtl li[class*="item-"] { border-right-width: 3px; }
+.rtl li.item-orange { border-right-color: rgb(232, 177, 16); }
+.rtl li.item-orange2 { border-right-color: rgb(247, 146, 99); }
+.rtl li.item-red { border-right-color: rgb(213, 63, 64); }
+.rtl li.item-red2 { border-right-color: rgb(209, 91, 71); }
+.rtl li.item-green { border-right-color: rgb(154, 188, 50); }
+.rtl li.item-green2 { border-right-color: rgb(4, 144, 166); }
+.rtl li.item-blue { border-right-color: rgb(79, 153, 198); }
+.rtl li.item-blue2 { border-left-color: transparent; border-right-color: rgb(57, 131, 194); }
+.rtl li.item-blue3 { border-right-color: rgb(17, 68, 235); }
+.rtl li.item-pink { border-right-color: rgb(203, 111, 215); }
+.rtl li.item-purple { border-right-color: rgb(111, 60, 196); }
+.rtl li.item-black { border-right-color: rgb(80, 80, 80); }
+.rtl li.item-grey { border-right-color: rgb(160, 160, 160); }
+.rtl li.item-brown { border-right-color: brown; }
+.rtl li.item-default { border-right-color: rgb(171, 186, 195); }
+.rtl .profile-info-name { text-align: left; padding: 6px 4px 6px 10px; }
+.rtl .profile-users .memberdiv, .rtl .profile-users .user { text-align: center; }
+.rtl .profile-info-value { padding: 6px 6px 6px 4px; }
+.rtl .profile-info-value > span + span::before { margin-left: 3px; margin-right: 1px; }
+.rtl .profile-user-info-striped .profile-info-value { padding-left: 0px; padding-right: 12px; }
+.rtl .profile-picture { box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.15); }
+.rtl .profile-activity img { margin-right: 0px; margin-left: 10px; }
+.rtl .profile-activity .thumbicon { text-align: center; margin-right: 0px; margin-left: 10px; }
+.rtl .profile-activity .tools { right: auto; left: 12px; }
+.rtl .profile-users .user img:hover { box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.33); }
+.rtl .profile-users .memberdiv .body { margin: 8px 0px 0px; }
+.rtl .user-status { margin-right: auto; margin-left: 1px; }
+.rtl .tab-content.profile-edit-tab-content { box-shadow: -1px 1px 0px 0px rgba(0, 0, 0, 0.2); }
+@media only screen and (max-width: 480px) {
+ .rtl .profile-user-info-striped .profile-info-name { text-align: right; padding: 6px 10px 6px 4px; }
+ .rtl .profile-user-info-striped .profile-info-value { margin-left: auto; margin-right: 10px; }
+}
+@media only screen and (max-width: 479px) {
+ .rtl .inbox-tabs > .li-new-mail { text-align: left; }
+}
+.rtl .message-item .sender { margin: 0px 4px 0px 6px; }
+.rtl .message-item .summary { margin-left: auto; margin-right: 30px; }
+.rtl .message-item .summary .message-flags { right: auto; margin-right: auto; left: 100%; margin-left: 4px; }
+.rtl .message-item .attachment, .rtl .message-item .time { float: left; }
+.rtl .message-star { margin: 2px 6px 0px 4px; }
+.rtl .mail-tag:empty { margin: 0px 0px 0px 1px; }
+@media only screen and (max-width: 550px) {
+ .rtl .message-item .summary { margin: 8px 32px 0px 0px; }
+}
+.rtl .message-content { box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.02); }
+.rtl .message-footer input[type="text"], .rtl .message-footer-style2 .pagination > li > a, .rtl .message-footer-style2 .pagination > li > span, .rtl .message-loading-overlay, .rtl .message-loading-overlay > .ace-icon, .rtl .message-navbar { text-align: center; }
+.rtl ul.attachment-list { margin: 6px 8px 4px 0px; }
+.rtl .attached-file > .ace-icon { margin-right: auto; margin-left: 2px; }
+.rtl .message-navbar .nav-search { right: 5px; left: auto; }
+.rtl .inbox-folders .btn > .ace-icon:first-child { text-align: right; }
+.rtl .inbox-folders .btn.active::before { left: auto; border-left: medium none; right: -1px; border-right: 3px solid rgb(79, 153, 198); }
+.rtl .inbox-folders .btn .counter { right: auto; left: 8px; }
+.rtl .timeline-container::before { left: auto; right: 28px; }
+.rtl .timeline-item .transparent.widget-box { border-left: medium none; border-right: 3px solid rgb(218, 225, 229); }
+.rtl .timeline-item .transparent .widget-header > .widget-title { margin-left: auto; margin-right: 8px; }
+.rtl .timeline-item:nth-child(2n) .widget-box.transparent { border-left-color: transparent !important; border-right-color: rgb(219, 219, 219) !important; }
+.rtl .timeline-item .widget-box { margin-left: auto; margin-right: 60px; }
+.rtl .timeline-info { float: right; text-align: center; }
+.rtl .dataTable > thead > tr > th[class*="sort"]::after, .rtl .md-editor .md-controls { float: left; }
+.rtl .timeline-container:not(.timeline-style2) .timeline-indicator { text-align: center; }
+.rtl .timeline-label { margin-left: auto; margin-right: 34px; }
+.rtl .timeline-style2 .timeline-item::before { left: auto; right: 90px; }
+.rtl .timeline-style2 .timeline-item .transparent.widget-box { border-left: medium none !important; border-right: medium none !important; }
+.rtl .timeline-style2 .timeline-indicator { left: auto; right: 85px; }
+.rtl .timeline-style2 .timeline-date { text-align: left; margin-right: auto; margin-left: 25px; }
+.rtl .timeline-style2 .timeline-item .widget-box { margin-left: auto; margin-right: 112px; }
+.rtl .timeline-style2 .timeline-label { text-align: left; margin-left: auto; margin-right: 0px; }
+.rtl .timeline-time { text-align: center; }
+.rtl .search-media { padding-right: 0px; padding-left: 150px; }
+.rtl .search-media .search-actions { right: auto; left: 0px; }
+.rtl .search-media .search-actions::before, .rtl div.dt-button-background { right: 0px; left: auto; }
+.rtl .search-promotion.label { margin-left: auto; margin-right: -1px; }
+.rtl .dataTables_filter, .rtl .dataTables_paginate { text-align: left; }
+.rtl div.dataTables_processing { left: auto; margin-left: auto; text-align: center; right: 50%; margin-right: -40%; }
+.rtl .fc-event { padding: 1px 2px 2px 1px; }
+.rtl .fc-state-default, .rtl .fc-state-default .fc-button-inner { margin-left: auto; margin-right: 2px; }
+.rtl .fc .fc-button-group > * { margin: 0px 0px 0px 1px; }
+.rtl .external-event > .ace-icon:first-child { text-align: center; border-right: medium none; }
+@media only screen and (max-width: 480px) {
+ .rtl .fc-header td { text-align: right; }
+}
+.rtl .select2-container--open .select2-dropdown { box-shadow: 0px -4px 5px rgba(0, 0, 0, 0.15); }
+.rtl .select2-container--default .select2-selection .select2-selection__clear { right: auto; left: -32px; }
+.rtl .select2-container--default .select2-selection .select2-selection__choice__remove { margin-right: auto; margin-left: 3px; }
+.rtl .select2-search::before { right: auto; left: 12px; }
+.rtl .select2.tag-input-style .select2-selection .select2-selection__choice { margin-right: auto; padding: 6px 9px 7px 22px; margin-left: 2px; }
+.rtl .select2.tag-input-style .select2-selection .select2-selection__choice .select2-selection__choice__remove { right: auto; left: -2px; text-align: center; }
+.rtl .select2-result-single { margin-left: auto; margin-right: 0px; }
+.rtl .select2-container .select2-choice .select2-arrow b::before { left: auto; right: 5px; }
+.rtl .select2-search-field .select2-search::after { left: auto; right: -20px; }
+.rtl .select2-container-multi.tag-input-style .select2-choices .select2-search-choice { margin-right: auto; padding: 6px 9px 7px 22px; margin-left: 0px; }
+.rtl #cboxClose, .rtl .ace-spinner .spinbox-buttons.btn-group-vertical > .btn { margin-right: 0px; margin-left: auto; }
+.rtl .select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close { right: auto; left: 0px; text-align: center; }
+.rtl #cboxClose, .rtl #cboxNext, .rtl #cboxPrevious { text-align: center; }
+.rtl #cboxClose { right: auto; left: -14px; }
+.rtl #cboxLoadingGraphic, .rtl #cboxLoadingGraphic > .ace-icon { text-align: center; }
+.rtl .steps > li, .rtl .steps > li .step { text-align: center; }
+.rtl .steps > li:first-child::before { left: auto; right: 50%; }
+.rtl .steps > li .title, .rtl .steps > li.complete .step::before { text-align: center; }
+.rtl .tree { padding: 0px 9px 0px 0px; }
+.rtl .tree .tree-branch > .tree-branch-header > .tree-branch-name > .tree-label { margin-left: auto; margin-right: 2px; }
+.rtl .tree .tree-branch > .tree-branch-header > .tree-branch-name > .ace-icon:first-child { margin: -2px -2px 0px 0px; }
+.rtl .tree .tree-branch:last-child::after { left: auto; border-left: medium none; right: -10px; border-right: 2px solid rgb(255, 255, 255); }
+.rtl .tree .tree-branch .tree-branch-children, .rtl .tree .tree-branch .tree-branch-children.tree { margin: 0px 23px 0px 0px; }
+.rtl .tree .tree-branch .tree-branch-children.tree::before, .rtl .tree .tree-branch .tree-branch-children::before { left: auto; border-width: 0px 1px 0px 0px; right: -14px; }
+.rtl .tree .tree-item > .tree-item-name > .ace-icon:first-child { margin-right: auto; margin-left: 3px; text-align: center; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05); }
+.rtl .tree .tree-branch::before, .rtl .tree .tree-item::before { left: auto; right: -13px; }
+.rtl .tree .tree-branch, .rtl .tree .tree-item { border-left: medium none; border-right: 1px solid rgb(255, 255, 255); }
+.rtl .tree .tree-minus.ace-icon:first-child, .rtl .tree .tree-plus.ace-icon:first-child { text-align: center; }
+.rtl .tree .tree-minus.ace-icon:first-child::before, .rtl .tree .tree-plus.ace-icon:first-child::before { left: auto; right: 2px; }
+.rtl .tree .tree-plus.ace-icon:first-child::after { border-left: medium none; left: auto; border-right: 1px solid rgb(77, 104, 120); right: 5px; }
+.rtl .tree .tree-unselectable .tree-item > .tree-item-name > .tree-label > .ace-icon:first-child { text-align: center; }
+.rtl .tree .icon-open { padding-left: 0px; padding-right: 2px; }
+.rtl .tree-container { border-left-color: transparent; border-right-color: rgb(103, 178, 221); }
+.rtl .tree-container .tree::before { margin-left: auto; margin-right: -1px; }
+.rtl .gritter-item-wrapper { box-shadow: 0px 2px 10px rgba(50, 50, 50, 0.5); }
+.rtl .gritter-close { text-align: center; }
+.rtl .wysiwyg-toolbar .btn-group > .btn { text-align: center; margin-left: auto; margin-right: 1px; }
+.rtl .wysiwyg-toolbar .btn-group > .btn.dropdown-toggle > .ace-icon:last-child { margin-right: auto; margin-left: 4px; }
+.rtl .wysiwyg-style1 .btn-group::after, .rtl .wysiwyg-style2 .btn-group::after { border-left: medium none; }
+.rtl .wysiwyg-style2 .btn-group > .btn, .rtl .wysiwyg-style2 .btn-group > .inline > .btn { margin: 0px 0px 0px 1px !important; }
+.rtl .wysiwyg-toolbar .btn-colorpicker { background: rgba(0, 0, 0, 0) -moz-linear-gradient(100% 0% , rgb(207, 62, 115) 10%, rgb(255, 255, 255) 20%, rgb(34, 131, 197) 30%, rgb(255, 255, 255) 40%, rgb(135, 184, 127) 50%, rgb(255, 255, 255) 60%, rgb(255, 183, 82) 70%, rgb(255, 255, 255) 80%, rgb(209, 91, 71) 90%, rgb(255, 255, 255) 100%) repeat scroll 0% 0%; }
+.rtl .wysiwyg-style1 .btn-colorpicker { margin-left: auto; margin-right: 4px; }
+@media not all {
+ .rtl .wysiwyg-editor .ui-wrapper::after { right: auto; left: -3px; }
+}
+.rtl .wysiwyg-speech-input { right: auto; left: 0px; }
+.rtl .ace-settings-box, .rtl .btn.btn-app.ace-settings-btn, .rtl .page-content > .row .col-lg-12, .rtl .page-content > .row .col-md-12, .rtl .page-content > .row .col-sm-12, .rtl .page-content > .row .col-xs-12, .rtl .ui-jqgrid .ui-jqgrid-title { float: right; }
+.rtl .md-editor .md-controls .md-control { right: auto; padding: 3px 10px 3px 3px; left: 5px; }
+.rtl .md-editor.md-fullscreen-mode { left: auto; right: 0px; }
+.rtl .md-editor.md-fullscreen-mode .md-header { text-align: center; }
+.rtl .md-editor.md-fullscreen-mode .md-fullscreen-controls { right: auto; text-align: left; left: 20px; }
+.rtl .editable-clear-x::before, .rtl .editable-image + .editable-buttons, .rtl .editable-wysiwyg + .editable-buttons, .rtl .md-editor.md-fullscreen-mode .md-fullscreen-controls a, .rtl .ui-datepicker .ui-datepicker-next, .rtl .ui-datepicker .ui-datepicker-prev, .rtl .ui-datepicker td > a, .rtl .ui-datepicker td > span, .rtl .ui-jqgrid .loading, .rtl .ui-jqgrid .ui-pg-input, .rtl .ui-spinner-button { text-align: center; }
+.rtl .editable-input .ace-spinner { margin-right: auto; margin-left: 8px; }
+.rtl .editable-inline .editable-slider { margin-right: auto; margin-left: 4px; }
+.rtl .ui-datepicker { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.rtl .ui-datepicker .ui-datepicker-prev-hover { left: auto; right: 2px; }
+.rtl .ui-datepicker .ui-datepicker-next-hover { right: auto; left: 2px; }
+.rtl .ui-dialog, .rtl .ui-jqdialog { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.rtl .ui-dialog .widget-header, .rtl .ui-jqdialog .widget-header { border-width: 0px 0px 1px; }
+.rtl .ui-dialog .ui-dialog-titlebar-close, .rtl .ui-dialog .ui-jqdialog-titlebar-close, .rtl .ui-jqdialog .ui-dialog-titlebar-close, .rtl .ui-jqdialog .ui-jqdialog-titlebar-close { right: auto !important; text-align: center; left: 8px !important; }
+.rtl .ui-dialog .widget-header .ui-dialog-titlebar-close, .rtl .ui-dialog .widget-header .ui-jqdialog-titlebar-close, .rtl .ui-jqdialog .widget-header .ui-dialog-titlebar-close, .rtl .ui-jqdialog .widget-header .ui-jqdialog-titlebar-close { right: auto !important; left: 10px !important; }
+.rtl .ui-accordion .ui-accordion-header { padding: 8px 24px 9px 8px; }
+.rtl .ui-tabs .ui-tabs-nav li.ui-tabs-active > a { box-shadow: 0px -2px 3px 0px rgba(0, 0, 0, 0.15); }
+.rtl .ui-autocomplete, .rtl .ui-menu { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.rtl .ui-menu { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.rtl .ui-autocomplete { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.rtl .ui-spinner-down, .rtl .ui-spinner-up { right: auto; left: 5px; }
+.rtl .ui-jqgrid tr.ui-state-highlight.ui-row-ltr td { border-right-color: transparent; border-left-color: rgb(199, 211, 169); }
+.rtl .ui-jqgrid .ui-jqgrid-btable { border-left: medium none; border-right: 1px solid rgb(225, 225, 225); }
+.rtl .ui-jqgrid .loading { left: auto; right: 45%; }
+.rtl .ui-jqgrid .ui-jqgrid-labels { border-left: medium none !important; border-right: 1px solid rgb(225, 225, 225) !important; }
+.rtl .ui-jqgrid .ui-jqgrid-labels th { border-right: medium none !important; }
+.rtl .ui-jqgrid-labels th[id*="_cb"]:first-child > div { text-align: center !important; }
+.rtl .EditTable .navButton .fm-button .ace-icon, .rtl .dd-dragel > li > .dd2-handle, .rtl .dd-item > button, .rtl .dd-item > button::before, .rtl .dd2-handle, .rtl .dropzone .dz-default.dz-message, .rtl .ui-pg-div .ui-icon, .rtl .ui-pg-table > tbody > tr > .ui-pg-button > .ui-icon, .rtl .ui-pg-table > tbody > tr > .ui-pg-button > .ui-icon::before { text-align: center; }
+.rtl .ui-jqgrid .ui-icon { right: auto; left: 2px; }
+.rtl .ui-jqgrid .ui-jqgrid-titlebar-close { margin: 2px 0px 0px 8px; text-align: center; }
+@media only screen and (max-width: 767px) {
+ .rtl .ui-jqgrid .ui-jqgrid-pager > .ui-pager-control > .ui-pg-table > tbody > tr > td#grid-pager_center > .ui-pg-table { text-align: center; }
+}
+.rtl .dd-list .dd-list { padding-right: 30px; }
+.rtl .dd-dragel > li > .dd-handle { border-left: medium none; border-right: 2px solid rgb(119, 119, 119); }
+.rtl .dd-list > li[class*="item-"] > .dd-handle { border-left: medium none; }
+.rtl .dd2-handle[class*="btn-"] { border-right: medium none; border-left: 1px solid rgb(238, 238, 238); }
+.rtl .dd-dragel .dd2-handle[class*="btn-"] { border-right-color: transparent; border-left-color: rgb(238, 238, 238); }
+.rtl .dd2-handle.btn-yellow { border-right: medium none; border-left: 1px solid rgb(255, 255, 255); }
+.rtl .dd-dragel .dd2-handle.btn-yellow { border-right-color: transparent; border-left-color: rgb(255, 255, 255); }
+.rtl .dropzone .dz-default.dz-message { left: auto; margin-left: auto; right: 0px; margin-right: auto; }
+.rtl .tt-menu { text-align: right; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.rtl .multiselect-container > li > a > label { padding: 7px 20px 7px 10px; }
+.rtl .btn-scroll-up { right: auto; left: 2px; }
+@media (min-width: 768px) {
+ .rtl .main-container.container > .btn-scroll-up { right: auto; margin-left: auto; left: auto; margin-right: 714px; }
+}
+@media (min-width: 992px) {
+ .rtl .main-container.container > .btn-scroll-up { right: auto; margin-left: auto; left: auto; margin-right: 934px; }
+}
+@media (min-width: 1200px) {
+ .rtl .main-container.container > .btn-scroll-up { right: auto; margin-left: auto; left: auto; margin-right: 1134px; }
+}
+.rtl .ace-settings-container { right: auto; left: 0px; }
+.rtl .btn.btn-app.ace-settings-btn { text-align: center; border-radius: 0px 6px 6px 0px; }
+@media (max-width: 480px) {
+ .rtl .ace-settings-container { text-align: left; }
+ .rtl .ace-settings-box { text-align: right; }
+}
+.rtl .easy-pie-chart, .rtl .easyPieChart, .rtl .onpage-help-section { text-align: center; }
+.rtl .grid2, .rtl .grid3, .rtl .grid4 { float: right; border-left: medium none; border-right: 1px solid rgb(227, 227, 227); }
+.rtl .grid2:first-child, .rtl .grid3:first-child, .rtl .grid4:first-child { border-left: medium none; border-right: medium none; }
+.rtl .easy-pie-chart canvas, .rtl .easyPieChart canvas { left: auto; right: 0px; }
+.rtl .tags[class*="span"] { margin-left: auto; margin-right: 0px; }
+.rtl .tags .tag { padding: 4px 9px 5px 22px; margin-right: auto; margin-left: 3px; }
+.rtl .tags .tag .close { right: auto; text-align: center; left: 0px; }
+.rtl .legendLabel { padding-left: 0px; padding-right: 2px; }
+@media only screen and (max-width: 360px) {
+ .rtl .grid2, .rtl .grid3, .rtl .grid4 { border-right-width: 0px; }
+ .rtl .grid2 > [class*="pull-"], .rtl .grid3 > [class*="pull-"], .rtl .grid4 > [class*="pull-"] { right: auto; left: 11px; }
+}
+.rtl.no-skin .sidebar { border-width: 0px 0px 0px 1px; }
+.rtl.no-skin .nav-list li > .arrow::before { border-right-color: transparent; border-width: 10px 0px 10px 10px; left: auto; border-left-color: rgb(184, 184, 184); right: -10px; }
+.rtl.no-skin .nav-list li > .arrow::after { border-right-color: transparent; border-width: 10px 0px 10px 10px; left: auto; border-left-color: rgb(255, 255, 255); right: -9px; }
+.rtl.no-skin .nav-list > li.pull_up > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(255, 255, 255) !important; }
+.rtl.no-skin .nav-list li.active > a::after { border-right-color: transparent; border-left-color: rgb(43, 125, 188); }
+.rtl.no-skin .nav-list > li.active::after { right: auto; border-width: 0px 0px 0px 2px; left: -2px; }
+.rtl.no-skin .sidebar-scroll .nav-list > li.active::after { right: auto; left: 0px; }
+.rtl.no-skin .sidebar.menu-min .nav-list > li > a > .menu-text { box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.1); }
+.rtl.no-skin .sidebar.menu-min .nav-list > li > a.dropdown-toggle > .menu-text { box-shadow: -2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+.rtl.no-skin .sidebar.menu-min .nav-list > li.active > .submenu { border-right-color: rgb(131, 182, 209); }
+.rtl.no-skin .sidebar.menu-min .nav-list > li > .submenu { box-shadow: -2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+.rtl.no-skin .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: transparent; border-width: 8px 0px 8px 8px; left: auto; border-left-color: rgb(245, 245, 245); right: -8px; }
+.rtl.no-skin .sidebar.menu-min .nav-list > li > .arrow::before { border-width: 8px 0px 8px 8px; left: auto; right: -9px; }
+.rtl.no-skin .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(90, 158, 194); }
+.rtl.no-skin .sidebar.menu-min .nav-list > li.active > a > .menu-text { border-right-color: rgb(131, 182, 209); }
+.rtl.no-skin .sidebar.menu-min .sidebar-shortcuts-large { box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.1); }
+@media (max-width: 991px) {
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li > a > .menu-text { box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.1); }
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li > a.dropdown-toggle > .menu-text { box-shadow: -2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li.active > .submenu { border-left-color: transparent; border-right-color: rgb(131, 182, 209); }
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li > .submenu { box-shadow: -2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: transparent; border-width: 8px 0px 8px 8px; left: auto; border-left-color: rgb(245, 245, 245); right: -8px; }
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li > .arrow::before { border-width: 8px 0px 8px 8px; left: auto; right: -9px; }
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(90, 158, 194); }
+ .rtl.no-skin .sidebar.responsive-min .nav-list > li.active > a > .menu-text { border-left-color: transparent; border-right-color: rgb(131, 182, 209); }
+ .rtl.no-skin .sidebar.responsive-min .sidebar-shortcuts-large { box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.1); }
+}
+@media only screen and (min-width: 992px) {
+ .rtl.no-skin .nav-list li.hover > .submenu { box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.1); }
+ .rtl.no-skin .sidebar.h-sidebar::before { box-shadow: 0px -1px 1px 0px rgba(0, 0, 0, 0.05) inset; }
+ .rtl.no-skin .sidebar.h-sidebar .nav-list > li:hover, .rtl.no-skin .sidebar.h-sidebar .nav-list > li:hover + li { border-left-color: transparent; border-right-color: rgb(206, 221, 229); }
+ .rtl.no-skin .sidebar.h-sidebar .nav-list > li:last-child:hover { border-right-color: transparent; border-left-color: rgb(206, 221, 229); }
+ .rtl.no-skin .sidebar.h-sidebar .nav-list > li.active, .rtl.no-skin .sidebar.h-sidebar .nav-list > li.active + li, .rtl.no-skin .sidebar.h-sidebar .nav-list > li:hover + li.active { border-left-color: transparent; border-right-color: rgb(121, 176, 206); }
+ .rtl.no-skin .sidebar.h-sidebar .nav-list > li.active:last-child { border-right-color: transparent; border-left-color: rgb(121, 176, 206); }
+ .rtl.no-skin .sidebar.h-sidebar .nav-list > li.active > a::after { border-width: 0px 0px 2px; }
+ .rtl.no-skin .sidebar.h-sidebar .sidebar-shortcuts-large { box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.1); }
+ .rtl.no-skin .sidebar.h-sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: transparent; border-right-color: rgb(204, 204, 204); }
+}
+@media only screen and (max-width: 991px) {
+ .rtl.no-skin .sidebar { border-width: 0px 0px 1px 1px; }
+ .rtl.no-skin .sidebar.responsive-min { border-width: 0px 0px 0px 1px; }
+ .rtl.no-skin .sidebar.navbar-collapse { box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.1) !important; }
+}
+.rtl.no-skin .nav-list > li.highlight.active > a::after, .rtl.no-skin .nav-list > li.highlight.active > a::before { right: auto; border-width: 20px 10px 21px 0px; left: -9px; }
+.rtl.no-skin .nav-list > li.highlight.active > a::before { border-left-color: transparent; right: auto; border-right-color: rgb(160, 188, 205); left: -10px; }
+.rtl.no-skin .nav-list > li.highlight.active > a::after { border-left-color: transparent; border-right-color: rgb(242, 246, 249); }
+@media (min-width: 992px) {
+ .rtl.no-skin .sidebar.h-sidebar .nav-list > li.highlight.active > a::after, .rtl.no-skin .sidebar.h-sidebar .nav-list > li.highlight.active > a::before { left: auto; right: 50%; margin-left: auto; margin-right: -7px; }
+}
+.rtl .onpage-help-section > .help-icon-1 { left: auto; box-shadow: 0px 0px 2px 1px rgba(0, 0, 0, 0.4); right: 50%; }
+.rtl .onpage-help-section > .help-icon-2 { left: auto; right: -4px; }
+@media print {
+ .rtl .main-content .breadcrumbs { float: left; }
+}
+.rtl .dropdown-colorpicker .dropdown-menu > li, .rtl .nav-tabs > li { float: right; }
+.rtl.skin-1 .sidebar { border-left-width: 0px; }
+.rtl.skin-1 .nav-list li.active > a::after { border-right-color: transparent; right: auto; border-left-color: rgb(255, 255, 255); left: 0px; }
+.rtl.skin-1 .sidebar .nav-list > li.active.highlight > a::after { border-right-color: rgb(20, 26, 27); border-left-color: transparent; border-width: 20px 10px 20px 0px; right: auto; left: -9px; }
+.rtl.skin-1 .sidebar .nav-list > li.active.highlight > a::before { border-left-color: transparent; border-width: 20px 10px 20px 0px; right: auto; border-right-color: rgb(80, 107, 127); left: -11px; }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li.active.highlight > a::after { border-width: 20px 10px 20px 0px; }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li.active:hover > a::after { border-right-color: transparent; border-left-color: rgb(36, 42, 43); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: transparent; border-right-color: rgb(48, 86, 117); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li.active > a:not(.dropdown-toggle) > .menu-text { border-right-color: transparent; border-left-color: rgb(74, 92, 99); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li > .submenu, .rtl.skin-1 .sidebar.menu-min .nav-list > li > a > .menu-text { border-left: medium none; border-right: 1px solid rgb(24, 29, 31); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li.active > .submenu { border-left-color: transparent; border-right-color: rgb(48, 86, 117); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: transparent; border-left-color: rgb(65, 75, 81); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li > .arrow::before { border-right-color: transparent; border-left-color: rgb(17, 20, 21); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li.active > .arrow::after { border-right-color: transparent; border-left-color: rgb(36, 42, 43); }
+.rtl.skin-1 .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(80, 160, 221); }
+.rtl.skin-1 .sidebar.menu-min .sidebar-shortcuts-large { border-width: 0px 0px 1px 1px; }
+@media (max-width: 991px) {
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li.active.highlight > a::after { border-width: 20px 10px 20px 0px; }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li.active:hover > a::after { border-right-color: transparent; border-left-color: rgb(36, 42, 43); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li.active > a > .menu-text { border-left-color: transparent; border-right-color: rgb(48, 86, 117); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li.active > a:not(.dropdown-toggle) > .menu-text { border-right-color: transparent; border-left-color: rgb(74, 92, 99); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li > .submenu, .rtl.skin-1 .sidebar.responsive-min .nav-list > li > a > .menu-text { border-left: medium none; border-right: 1px solid rgb(24, 29, 31); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li.active > .submenu { border-left-color: transparent; border-right-color: rgb(48, 86, 117); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: transparent; border-left-color: rgb(65, 75, 81); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li > .arrow::before { border-right-color: transparent; border-left-color: rgb(17, 20, 21); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li.active > .arrow::after { border-right-color: transparent; border-left-color: rgb(36, 42, 43); }
+ .rtl.skin-1 .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(80, 160, 221); }
+ .rtl.skin-1 .sidebar.responsive-min .sidebar-shortcuts-large { border-width: 0px 0px 1px 1px; }
+}
+@media only screen and (min-width: 992px) {
+ .rtl.skin-1 .nav-list > li.active > .submenu li.hover > .submenu { border-left-color: transparent; border-right-color: rgb(71, 85, 97); }
+ .rtl.skin-1 .nav-list li.active > .submenu li.hover.active > .submenu, .rtl.skin-1 .nav-list li.hover.active > .submenu { border-left-color: transparent; border-right-color: rgb(48, 86, 117); }
+}
+@media only screen and (min-width: 992px) and (max-width: 991px) {
+ .rtl.skin-1 .sidebar.navbar-collapse .nav-list li.active > .submenu li.hover.active > .submenu, .rtl.skin-1 .sidebar.navbar-collapse .nav-list li.hover.active > .submenu, .rtl.skin-1 .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu { border-right-width: 0px; }
+}
+.rtl.skin-1 .nav-list li > .arrow::after { border-right-color: transparent; border-left-color: rgb(53, 60, 61); }
+.rtl.skin-1 .nav-list li > .arrow::before { border-right-color: transparent; border-left-color: rgb(29, 33, 34); }
+.rtl.skin-1 .nav-list > li.active > .arrow::after { border-right-color: transparent; border-left-color: rgb(23, 30, 31); }
+.rtl.skin-1 .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(48, 86, 117); }
+.rtl.skin-1 .nav-list > li.active > .submenu li.hover > .arrow::before { border-right-color: transparent; border-left-color: rgb(79, 110, 134); }
+.rtl.skin-1 .nav-list > li.active > .submenu li.hover.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(48, 86, 117); }
+.rtl.skin-1 .nav-list > li.active > .submenu li.hover > .arrow::after { border-right-color: transparent; border-left-color: rgb(23, 30, 31); }
+.rtl.skin-1 .nav-list li.pull_up > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(53, 60, 61) !important; }
+.rtl.skin-1 .nav-list li.pull_up > .arrow::before { border-right-color: transparent !important; border-left-color: rgb(29, 33, 34) !important; }
+.rtl.skin-1 .nav-list li.pull_up.active > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(23, 30, 31) !important; }
+.rtl.skin-1 .nav-list li.pull_up.active > .arrow::before { border-right-color: transparent !important; border-left-color: rgb(48, 86, 117) !important; }
+@media only screen and (min-width: 992px) {
+ .rtl.skin-1 .sidebar.h-sidebar .nav-list > li.hover.active > a::after { right: 50%; left: auto; margin-left: auto; margin-right: -8px; }
+ .rtl.skin-1 .sidebar.h-sidebar .nav-list > li:hover, .rtl.skin-1 .sidebar.h-sidebar .nav-list > li:hover + li { border-left-color: transparent; border-right-color: rgb(80, 101, 117); }
+ .rtl.skin-1 .sidebar.h-sidebar .nav-list > li:last-child:hover { border-right-color: transparent; border-left-color: rgb(80, 101, 117); }
+ .rtl.skin-1 .sidebar.h-sidebar .nav-list > li.active, .rtl.skin-1 .sidebar.h-sidebar .nav-list > li.active + li, .rtl.skin-1 .sidebar.h-sidebar .nav-list > li:hover + li.active { border-left-color: transparent; border-right-color: rgb(85, 115, 138); }
+ .rtl.skin-1 .sidebar.h-sidebar .nav-list > li.active:last-child { border-right-color: transparent; border-left-color: rgb(85, 115, 138); }
+ .rtl.skin-1 .sidebar.h-sidebar .nav-list > li.hover.active > .submenu { border-left-color: transparent; border-right-color: rgb(35, 40, 40); }
+ .rtl.skin-1 .sidebar.h-sidebar .nav-list > li.active > .arrow::after, .rtl.skin-1 .sidebar.h-sidebar .nav-list > li.active > .arrow::before, .rtl.skin-1 .sidebar.h-sidebar .nav-list > li > .arrow::after, .rtl.skin-1 .sidebar.h-sidebar .nav-list > li > .arrow::before, .rtl.skin-1 .sidebar.h-sidebar .sidebar-shortcuts-large::after, .rtl.skin-1 .sidebar.h-sidebar .sidebar-shortcuts-large::before { border-right-color: transparent; border-left-color: transparent; }
+ .rtl.skin-1 .main-content .h-sidebar.sidebar .nav-list { border-left: medium none; border-right: 1px solid rgb(74, 92, 99); }
+}
+.rtl.skin-2 .sidebar { border-left-width: 0px; }
+.rtl.skin-2 .nav-list li.active > a::after { border-right-color: transparent; right: auto; border-left-color: rgb(255, 255, 255); left: 0px; }
+.rtl.skin-2 .nav-list > li .submenu > li > a { padding-left: 0px; padding-right: 32px; }
+.rtl.skin-2 .nav-list > li .submenu > li > a > .menu-icon { left: auto; right: 12px; }
+@media only screen and (min-width: 992px) {
+ .rtl.skin-2 .nav-list > li .submenu > li.hover > a { padding-left: 0px; padding-right: 26px; }
+ .rtl.skin-2 .nav-list > li .submenu > li.hover > a > .menu-icon { left: auto; right: 6px; }
+}
+.rtl.skin-2 .nav-list > li > .submenu li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 0px; padding-right: 37px; }
+.rtl.skin-2 .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 0px; padding-right: 51px; }
+.rtl.skin-2 .nav-list li > .arrow::after { border-right-color: transparent; border-left-color: rgb(69, 48, 59); }
+.rtl.skin-2 .nav-list li > .arrow::before { border-right-color: transparent; border-left-color: rgb(25, 25, 25); }
+.rtl.skin-2 .nav-list > li.pull_up > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(69, 48, 59) !important; }
+.rtl.skin-2 .nav-list > li.pull_up > .arrow::before { border-right-color: transparent !important; border-left-color: rgb(25, 25, 25) !important; }
+.rtl.skin-2 .nav-list > li.active.highlight > a::after { border-right-color: rgb(189, 82, 137); border-left-color: transparent; border-width: 20px 10px 20px 0px; right: auto; left: -9px; }
+.rtl.skin-2 .nav-list > li:nth-child(1) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(1) > .arrow::after { border-right-color: transparent; border-left-color: rgb(42, 65, 55); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(1) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(42, 65, 55) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(2) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(2) > .arrow::after { border-right-color: transparent; border-left-color: rgb(54, 67, 47); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(2) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(54, 67, 47) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(3) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(3) > .arrow::after { border-right-color: transparent; border-left-color: rgb(62, 68, 42); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(3) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(62, 68, 42) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(4) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(4) > .arrow::after { border-right-color: transparent; border-left-color: rgb(67, 69, 42); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(4) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(67, 69, 42) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(5) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(5) > .arrow::after { border-right-color: transparent; border-left-color: rgb(72, 66, 42); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(5) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(72, 66, 42) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(6) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(6) > .arrow::after { border-right-color: transparent; border-left-color: rgb(73, 63, 42); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(6) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(73, 63, 42) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(7) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(7) > .arrow::after { border-right-color: transparent; border-left-color: rgb(73, 55, 42); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(7) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(73, 55, 42) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(8) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(8) > .arrow::after { border-right-color: transparent; border-left-color: rgb(71, 46, 48); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(8) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(71, 46, 48) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(9) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(9) > .arrow::after { border-right-color: transparent; border-left-color: rgb(69, 48, 59); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(9) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(69, 48, 59) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(10) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(10) > .arrow::after { border-right-color: transparent; border-left-color: rgb(66, 54, 70); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(10) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(66, 54, 70) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(11) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(11) > .arrow::after { border-right-color: transparent; border-left-color: rgb(46, 59, 71); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(11) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(46, 59, 71) !important; }
+.rtl.skin-2 .nav-list > li:nth-child(12) li > .arrow::after, .rtl.skin-2 .nav-list > li:nth-child(12) > .arrow::after { border-right-color: transparent; border-left-color: rgb(48, 67, 70); }
+.rtl.skin-2 .nav-list > li.pull_up:nth-child(12) > .arrow::after { border-right-color: transparent !important; border-left-color: rgb(48, 67, 70) !important; }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(1) > a::after { border-left-color: transparent; border-right-color: rgb(24, 166, 101); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(2) > a::after { border-left-color: transparent; border-right-color: rgb(106, 177, 74); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(3) > a::after { border-left-color: transparent; border-right-color: rgb(152, 188, 27); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(4) > a::after { border-left-color: transparent; border-right-color: rgb(183, 197, 28); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(5) > a::after { border-left-color: transparent; border-right-color: rgb(217, 180, 31); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(6) > a::after { border-left-color: transparent; border-right-color: rgb(223, 160, 32); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(7) > a::after { border-left-color: transparent; border-right-color: rgb(223, 114, 32); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(8) > a::after { border-left-color: transparent; border-right-color: rgb(212, 58, 72); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(9) > a::after { border-left-color: transparent; border-right-color: rgb(189, 82, 137); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(10) > a::after { border-left-color: transparent; border-right-color: rgb(185, 117, 208); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(11) > a::after { border-left-color: transparent; border-right-color: rgb(63, 138, 208); }
+.rtl.skin-2 .nav-list > li.active.highlight:nth-child(12) > a::after { border-left-color: transparent; border-right-color: rgb(75, 185, 202); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > a::after { border-width: 20px 10px 20px 0px; }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li > a > .menu-text { border-width: 0px 1px 0px 0px; margin-left: auto; margin-right: 1px; }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li > .submenu { border-width: 1px 1px 0px 0px; margin-left: auto; margin-right: 1px; }
+.rtl.skin-2 .sidebar.menu-min .sidebar-shortcuts-large { border-width: 0px 0px 1px 1px; }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: transparent; border-left-color: rgb(189, 82, 137); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > .arrow::before, .rtl.skin-2 .sidebar.menu-min .nav-list > li > .arrow::before { border-right-color: transparent; border-left-color: rgba(0, 0, 0, 0.7); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active:not(.highlight) > a:not(.dropdown-toggle) > .menu-text { border-right-color: transparent; border-left-color: rgb(85, 85, 85); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > a > .menu-text, .rtl.skin-2 .sidebar.menu-min .nav-list > li > a > .menu-text { border-left-color: transparent; border-right-color: rgba(0, 0, 0, 0.5); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.pull_up.active.highlight > a > .menu-text, .rtl.skin-2 .sidebar.menu-min .nav-list > li.pull_up > a > .menu-text { border-left-color: transparent; border-right-color: rgba(0, 0, 0, 0.7); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.pull_up.active:not(.highlight) > a > .menu-text { border-left-color: transparent; border-right-color: rgb(102, 102, 102); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(1) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(1) > .arrow::after { border-right-color: transparent; border-left-color: rgb(24, 166, 101); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(2) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(2) > .arrow::after { border-right-color: transparent; border-left-color: rgb(106, 177, 74); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(3) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(3) > .arrow::after { border-right-color: transparent; border-left-color: rgb(152, 188, 27); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(4) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(4) > .arrow::after { border-right-color: transparent; border-left-color: rgb(183, 197, 28); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(5) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(5) > .arrow::after { border-right-color: transparent; border-left-color: rgb(217, 180, 31); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(6) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(6) > .arrow::after { border-right-color: transparent; border-left-color: rgb(223, 160, 32); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(7) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(7) > .arrow::after { border-right-color: transparent; border-left-color: rgb(223, 114, 32); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(8) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(8) > .arrow::after { border-right-color: transparent; border-left-color: rgb(212, 58, 72); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(9) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(9) > .arrow::after { border-right-color: transparent; border-left-color: rgb(189, 82, 137); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(10) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(10) > .arrow::after { border-right-color: transparent; border-left-color: rgb(185, 117, 208); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(11) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(11) > .arrow::after { border-right-color: transparent; border-left-color: rgb(63, 138, 208); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(12) > .arrow::after, .rtl.skin-2 .sidebar.menu-min .nav-list > li:nth-child(12) > .arrow::after { border-right-color: transparent; border-left-color: rgb(75, 185, 202); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: transparent; border-right-color: rgb(119, 119, 119); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active > .arrow::after { border-right-color: transparent; border-left-color: rgb(36, 36, 36); }
+.rtl.skin-2 .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(136, 136, 136); }
+@media (max-width: 991px) {
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > a::after { border-width: 20px 10px 20px 0px; }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li > a > .menu-text { border-width: 0px 1px 0px 0px; margin-left: auto; margin-right: 1px; }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li > .submenu { border-width: 1px 1px 0px 0px; margin-left: auto; margin-right: 1px; }
+ .rtl.skin-2 .sidebar.responsive-min .sidebar-shortcuts-large { border-width: 0px 0px 1px 1px; }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: transparent; border-left-color: rgb(189, 82, 137); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > .arrow::before, .rtl.skin-2 .sidebar.responsive-min .nav-list > li > .arrow::before { border-right-color: transparent; border-left-color: rgba(0, 0, 0, 0.7); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active:not(.highlight) > a:not(.dropdown-toggle) > .menu-text { border-right-color: transparent; border-left-color: rgb(85, 85, 85); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > a > .menu-text, .rtl.skin-2 .sidebar.responsive-min .nav-list > li > a > .menu-text { border-left-color: transparent; border-right-color: rgba(0, 0, 0, 0.5); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.pull_up.active.highlight > a > .menu-text, .rtl.skin-2 .sidebar.responsive-min .nav-list > li.pull_up > a > .menu-text { border-left-color: transparent; border-right-color: rgba(0, 0, 0, 0.7); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.pull_up.active:not(.highlight) > a > .menu-text { border-left-color: transparent; border-right-color: rgb(102, 102, 102); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(1) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(1) > .arrow::after { border-right-color: transparent; border-left-color: rgb(24, 166, 101); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(2) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(2) > .arrow::after { border-right-color: transparent; border-left-color: rgb(106, 177, 74); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(3) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(3) > .arrow::after { border-right-color: transparent; border-left-color: rgb(152, 188, 27); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(4) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(4) > .arrow::after { border-right-color: transparent; border-left-color: rgb(183, 197, 28); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(5) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(5) > .arrow::after { border-right-color: transparent; border-left-color: rgb(217, 180, 31); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(6) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(6) > .arrow::after { border-right-color: transparent; border-left-color: rgb(223, 160, 32); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(7) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(7) > .arrow::after { border-right-color: transparent; border-left-color: rgb(223, 114, 32); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(8) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(8) > .arrow::after { border-right-color: transparent; border-left-color: rgb(212, 58, 72); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(9) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(9) > .arrow::after { border-right-color: transparent; border-left-color: rgb(189, 82, 137); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(10) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(10) > .arrow::after { border-right-color: transparent; border-left-color: rgb(185, 117, 208); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(11) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(11) > .arrow::after { border-right-color: transparent; border-left-color: rgb(63, 138, 208); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(12) > .arrow::after, .rtl.skin-2 .sidebar.responsive-min .nav-list > li:nth-child(12) > .arrow::after { border-right-color: transparent; border-left-color: rgb(75, 185, 202); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active > a > .menu-text { border-left-color: transparent; border-right-color: rgb(119, 119, 119); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active > .arrow::after { border-right-color: transparent; border-left-color: rgb(36, 36, 36); }
+ .rtl.skin-2 .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(136, 136, 136); }
+}
+@media only screen and (max-width: 991px) {
+ .rtl.skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 0px; padding-right: 42px; }
+ .rtl.skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: auto; padding-left: 0px; margin-right: 0px; padding-right: 58px; }
+}
+@media only screen and (min-width: 992px) and (max-width: 991px) {
+ .rtl.skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu { }
+ .rtl.skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a { margin-left: auto !important; padding-left: 0px !important; margin-right: 0px !important; padding-right: 37px !important; }
+ .rtl.skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: auto !important; padding-left: 0px !important; margin-right: 0px !important; padding-right: 51px !important; }
+ .rtl.skin-2 .sidebar.navbar-collapse .nav-list li.hover > .submenu li > a { padding-left: 0px !important; padding-right: 32px !important; }
+ .rtl.skin-2 .sidebar.navbar-collapse .nav-list > li .submenu > li.hover > a > .menu-icon { left: auto; right: 12px; }
+ .rtl.skin-2 .sidebar.navbar-collapse.menu-min .nav-list li.hover > .submenu li > a { padding-left: 0px; padding-right: 32px; }
+}
+@media only screen and (max-width: 991px) {
+ .rtl.skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu, .rtl.skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li > a > .menu-text { margin-left: auto; margin-right: 0px; }
+ .rtl.skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > a > .menu-icon { left: auto; right: 12px; }
+}
+@media only screen and (min-width: 768px) {
+ .rtl.skin-1 .container.main-container::before, .rtl.skin-2 .container.main-container::before { box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.1); }
+}
+@media only screen and (min-width: 992px) {
+ .rtl.skin-2 .sidebar.h-sidebar .nav-list > li.hover > .submenu { margin-left: auto; margin-right: -1px; }
+ .rtl.skin-2 .sidebar.h-sidebar .nav-list > li .submenu > li.hover > a { padding-left: 0px; padding-right: 22px; }
+ .rtl.skin-2 .sidebar.h-sidebar .nav-list > li .submenu > li.hover > a > .menu-icon { left: auto; right: 4px; }
+ .rtl.skin-2 .sidebar.h-sidebar .nav-list > li.hover.active > a::after { right: 50%; left: auto; margin-left: auto; margin-right: -8px; }
+ .rtl.skin-2 .sidebar.h-sidebar .nav-list > li.active.highlight > .arrow::after, .rtl.skin-2 .sidebar.h-sidebar .nav-list > li.active.highlight > .arrow::before, .rtl.skin-2 .sidebar.h-sidebar .nav-list > li.hover > .arrow::after, .rtl.skin-2 .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { border-right-color: transparent; border-left-color: transparent; }
+ .rtl.skin-2 .sidebar.h-sidebar.menu-min .nav-list > li > a > .menu-text { border-width: 1px 0px 0px; }
+ .rtl.skin-2 .main-content .h-sidebar.sidebar .nav-list { border-left: medium none; border-right: 1px solid rgb(87, 87, 87); }
+}
+.rtl.skin-2 .nav-list > li.active.highlight.disabled > a::after, .rtl.skin-2 .nav-list > li.active.highlight > a.disabled::after { border-left-color: transparent !important; border-right-color: rgb(85, 85, 85) !important; }
+.rtl.skin-3 .sidebar { border-width: 0px 0px 0px 1px; }
+.rtl.skin-3 .nav-list li.active > a::after { border-right-color: transparent; right: auto; border-left-color: rgb(255, 255, 255); left: -1px; }
+.rtl.skin-3 .nav-list li.active > a::before { border-right-color: transparent; right: auto; border-left-color: rgb(145, 186, 214); left: 0px; }
+.rtl.skin-3 .nav-list > li.highlight.active > a::after { border-left-color: transparent; border-right-color: rgb(243, 250, 255); }
+.rtl.skin-3 .nav-list > li.highlight.active > a::before { border-left-color: transparent; border-right-color: rgb(145, 186, 214); }
+.rtl.skin-3 .nav-list li > .arrow::before { border-right-color: transparent; border-left-color: rgb(127, 175, 207); }
+.rtl.skin-3 .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(112, 159, 191); }
+.rtl.skin-3 .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: transparent; border-left-color: rgb(237, 243, 247); }
+.rtl.skin-3 .sidebar.menu-min .nav-list > li.active.highlight > a::after, .rtl.skin-3 .sidebar.menu-min .nav-list > li.active.highlight > a::before { border-width: 20px 10px 21px 0px; }
+@media only screen and (max-width: 991px) {
+ .rtl.skin-3 .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: transparent; border-left-color: rgb(112, 159, 191); }
+ .rtl.skin-3 .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: transparent; border-left-color: rgb(237, 243, 247); }
+ .rtl.skin-3 .sidebar.responsive-min .nav-list > li.active.highlight > a::after, .rtl.skin-3 .sidebar.responsive-min .nav-list > li.active.highlight > a::before { border-width: 20px 10px 21px 0px; }
+ .rtl.skin-3 .sidebar.responsive-max { border-width: 0px 0px 1px 1px; }
+}
+.rtl.skin-3 .sidebar-scroll .nav-wrap-up + .sidebar-toggle::after { right: auto; border-right: medium none; left: -1px; border-left: 1px solid rgb(164, 198, 221); }
+.rtl.skin-3 .sidebar-shortcuts-mini { padding-left: 0px; padding-right: 1px; }
+.rtl.skin-3 .sidebar-shortcuts-mini > .btn { margin: 1px 0px 0px 1px; }
+@media only screen and (min-width: 992px) {
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li:hover, .rtl.skin-3 .sidebar.h-sidebar .nav-list > li:hover + li { border-left-color: transparent; border-right-color: rgb(149, 186, 210); }
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li:last-child:hover { border-right-color: transparent; border-left-color: rgb(149, 186, 210); }
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li.active, .rtl.skin-3 .sidebar.h-sidebar .nav-list > li.active + li, .rtl.skin-3 .sidebar.h-sidebar .nav-list > li:hover + li.active { border-left-color: transparent; border-right-color: rgb(164, 198, 221); }
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li.active:last-child { border-right-color: transparent; border-left-color: rgb(164, 198, 221); }
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li.active > a::after { left: auto; right: 50%; margin-left: auto; margin-right: -7px; }
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li.active > a::before { left: auto; right: 50%; margin-left: auto !important; margin-right: -8px !important; }
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { border-right-color: transparent; border-left-color: transparent; }
+ .rtl.skin-3 .sidebar.h-sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: transparent; border-right-color: rgb(164, 198, 221); }
+}
+.make-rtl { direction: rtl; text-align: right; }
+.make-ltr { direction: ltr; text-align: left; }
+body.rtl, html.rtl { direction: rtl; text-align: right; overflow-x: hidden; }
+.rtl .nav-scroll.scroll-active .scroll-track { right: auto; left: 0px; }
+@media only screen and (max-width: 991px) {
+ .rtl .navbar .navbar-nav > li, .rtl .navbar .navbar-nav > li:first-child { border-width: 1px 0px 0px; }
+}
+.rtl .dropdown-menu { text-align: right; }
+.rtl .ace-switch + .lbl, .rtl .knob-container { direction: ltr; text-align: left; }
+.rtl input.ace[type="radio"] + .lbl::before, .rtl input.ace[type="radio"] ~ .lbl::before, .rtl input.ace[type="checkbox"] + .lbl::before, .rtl input.ace[type="checkbox"] ~ .lbl::before { margin-right: auto; margin-left: 1px; }
+.rtl input.ace + .lbl.padding-16::before, .rtl input.ace ~ .lbl.padding-16::before { margin-left: 16px; }
+.rtl input.ace + .lbl.padding-12::before, .rtl input.ace ~ .lbl.padding-12::before { margin-left: 12px; }
+.rtl input.ace + .lbl.padding-8::before, .rtl input.ace ~ .lbl.padding-8::before { margin-left: 8px; }
+.rtl input.ace + .lbl.padding-4::before, .rtl input.ace ~ .lbl.padding-4::before { margin-left: 4px; }
+.rtl input.ace + .lbl.padding-0::before, .rtl input.ace ~ .lbl.padding-0::before { margin-left: 0px; }
+.rtl .breadcrumb > li + li::before { content: ""; float: right; }
+.rtl .dropdown-menu, .rtl .item-list, .rtl .nav-list, .rtl .navbar-nav { margin: 0px; }
+.rtl .ace-file-input .ace-file-container.selected { right: 0px; }
+.rtl .ace-file-multiple .ace-file-container .ace-file-name { padding: 0px; }
+.rtl .ui-slider-small .ui-slider-handle { right: auto; }
+.rtl li[class*="item-"] { border-left: 1px solid rgb(221, 221, 221); }
+.rtl .itemdiv.dialogdiv > .body { margin-left: 12px; margin-right: 50px; border-left-width: 1px; }
+.rtl.no-skin .sidebar.menu-min .nav-list > li.active > .submenu, .rtl.no-skin .sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(204, 204, 204); }
+.rtl.no-skin .sidebar.menu-min .nav-list > li.active > .submenu, .rtl.skin-3 .sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(164, 198, 221); }
+.rtl .sidebar + .main-content .breadcrumbs-fixed { left: 0px; }
+@media (min-width: 768px) {
+ .rtl.skin-3 .main-container.container::before { box-shadow: 0px 0px 0px 1px rgba(50, 100, 200, 0.1); }
+ .rtl .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed, .rtl .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: auto; right: auto; }
+}
+@media (min-width: 992px) {
+ .rtl .sidebar.compact + .main-content .breadcrumbs-fixed, .rtl .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: 0px; }
+ .rtl.no-skin .sidebar.h-sidebar .nav-list > li.active > .submenu { border-color: rgb(204, 204, 204) !important; }
+ .rtl.skin-3 .sidebar.h-sidebar .nav-list > li.active > .submenu { border-color: rgb(164, 198, 221) !important; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .rtl .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a, .rtl .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li.hover > .submenu > li > a { margin-right: 20px !important; }
+ .rtl .breadcrumbs-fixed, .rtl .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: 0px !important; }
+ .rtl .container.main-container .breadcrumbs-fixed, .rtl .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: auto !important; }
+}
+@media (max-width: 767px) and (min-width: 992px) {
+ .rtl .container.main-container .breadcrumbs-fixed, .rtl .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: 0px !important; }
+}
+.rtl .sidebar:not(.h-sidebar) .nav-list > li.highlight.active > a::after { border-width: 20px 10px 21px !important; left: -20px !important; }
+.rtl .sidebar:not(.h-sidebar) .nav-list > li.highlight.active > a::before { border-width: 20px 10px 21px !important; left: -21px !important; }
+.rtl .sidebar.menu-min .nav-list > li > .submenu::after { border-left-width: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: inherit; display: block; right: -1px; left: auto; }
+.rtl .popover.bottom .arrow::after, .rtl .popover.top .arrow::after { margin-left: auto; margin-right: -10px; }
+.rtl .nav-tabs { margin: 0px; }
+.rtl .tabs-below > .nav-tabs { margin-top: -1px; }
+.rtl .btn-group-vertical > .btn, .rtl .btn-group-vertical > .btn-group, .rtl .btn-group-vertical > .btn-group > .btn, .rtl .nav-stacked > li { float: none; }
+.rtl .nav-tabs > li:first-child > a { margin-left: -1px; margin-right: auto; }
+.rtl .tabs-left > .nav-tabs > li:first-child > a { margin-right: -1px; margin-left: auto; }
+.rtl .tabs-left > .nav-tabs > li.active > a { margin-left: -1px; margin-right: -1px; }
+.rtl .tabs-right > .nav-tabs > li.active > a { margin-left: -1px; margin-right: -2px; }
+.rtl .nav-tabs[class*="tab-color-"] > li > a { margin-right: 3px; margin-left: auto; }
+.rtl .dropdown-navbar .nav-tabs > li > a::before { left: auto; right: 0px; }
+.rtl .nav.nav-tabs.padding-32 { padding-left: 0px; padding-right: 32px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-32, .tabs-right > .rtl .nav.nav-tabs.padding-32 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-30 { padding-left: 0px; padding-right: 30px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-30, .tabs-right > .rtl .nav.nav-tabs.padding-30 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-28 { padding-left: 0px; padding-right: 28px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-28, .tabs-right > .rtl .nav.nav-tabs.padding-28 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-26 { padding-left: 0px; padding-right: 26px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-26, .tabs-right > .rtl .nav.nav-tabs.padding-26 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-24 { padding-left: 0px; padding-right: 24px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-24, .tabs-right > .rtl .nav.nav-tabs.padding-24 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-22 { padding-left: 0px; padding-right: 22px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-22, .tabs-right > .rtl .nav.nav-tabs.padding-22 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-20 { padding-left: 0px; padding-right: 20px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-20, .tabs-right > .rtl .nav.nav-tabs.padding-20 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-18 { padding-left: 0px; padding-right: 18px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-18, .tabs-right > .rtl .nav.nav-tabs.padding-18 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-16 { padding-left: 0px; padding-right: 16px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-16, .tabs-right > .rtl .nav.nav-tabs.padding-16 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-14 { padding-left: 0px; padding-right: 14px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-14, .tabs-right > .rtl .nav.nav-tabs.padding-14 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-12 { padding-left: 0px; padding-right: 12px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-12, .tabs-right > .rtl .nav.nav-tabs.padding-12 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-10 { padding-left: 0px; padding-right: 10px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-10, .tabs-right > .rtl .nav.nav-tabs.padding-10 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-8 { padding-left: 0px; padding-right: 8px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-8, .tabs-right > .rtl .nav.nav-tabs.padding-8 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-6 { padding-left: 0px; padding-right: 6px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-6, .tabs-right > .rtl .nav.nav-tabs.padding-6 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-4 { padding-left: 0px; padding-right: 4px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-4, .tabs-right > .rtl .nav.nav-tabs.padding-4 { padding-right: 0px; }
+.rtl .nav.nav-tabs.padding-2 { padding-left: 0px; padding-right: 2px; }
+.tabs-left > .rtl .nav.nav-tabs.padding-2, .tabs-right > .rtl .nav.nav-tabs.padding-2 { padding-right: 0px; }
+.rtl .message-navbar .messagebar-item-left ~ .nav-search { left: auto; }
+.rtl .message-navbar .messagebar-item-right ~ .nav-search { left: auto; right: 60px; }
+@media only screen and (max-width: 767px) {
+ .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu { right: auto; left: -100px; }
+ .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu::before { right: auto; left: 120px; }
+ .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu { right: auto; left: -80px; }
+ .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu::before { right: auto; left: 100px; }
+}
+@media only screen and (min-width: 480px) and (max-width: 767px) {
+ .rtl .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(1) > .dropdown-menu, .rtl .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(2) > .dropdown-menu { left: -60px; right: auto; }
+ .rtl .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(1) > .dropdown-menu::after, .rtl .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(1) > .dropdown-menu::before, .rtl .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(2) > .dropdown-menu::after, .rtl .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(2) > .dropdown-menu::before { right: auto; left: 80px; }
+}
+@media only screen and (max-width: 480px) {
+ .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu { right: auto; left: -120px; }
+ .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu::before { right: auto; left: 140px; }
+ .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu { right: auto; left: -120px; }
+ .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu::before { right: auto; left: 110px; }
+ .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu { right: auto; left: -50px; }
+ .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu::before { right: auto; left: 70px; }
+}
+@media only screen and (max-width: 479px) {
+ .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu { left: auto; right: -10px; }
+ .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(4) > .dropdown-menu::before { right: 30px; left: auto; }
+ .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu { left: auto; right: -50px; }
+ .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(3) > .dropdown-menu::before { left: auto; right: 75px; }
+ .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu { left: auto; right: -70px; }
+ .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu::before { left: auto; right: 90px; }
+}
+@media only screen and (max-width: 319px) {
+ .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu { left: auto; right: -110px; }
+ .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu::after, .rtl .ace-nav > li:nth-last-child(2) > .dropdown-menu::before { left: auto; right: 130px; }
+ .rtl .ace-nav > li:nth-child(2):nth-last-child(2) > .dropdown-menu { left: auto; right: -85px; }
+ .rtl .ace-nav > li:nth-child(2):nth-last-child(2) > .dropdown-menu::after, .rtl .ace-nav > li:nth-child(2):nth-last-child(2) > .dropdown-menu::before { left: auto; right: 105px; }
+ .rtl .ace-nav > li:nth-child(1):nth-last-child(3) > .dropdown-menu { left: auto; right: -35px; }
+ .rtl .ace-nav > li:nth-child(1):nth-last-child(3) > .dropdown-menu::after, .rtl .ace-nav > li:nth-child(1):nth-last-child(3) > .dropdown-menu::before { left: auto; right: 55px; }
+ .rtl .ace-nav > li:nth-child(1):nth-last-child(2) > .dropdown-menu { left: auto; right: -60px; }
+ .rtl .ace-nav > li:nth-child(1):nth-last-child(2) > .dropdown-menu::after, .rtl .ace-nav > li:nth-child(1):nth-last-child(2) > .dropdown-menu::before { left: auto; right: 75px; }
+}
+.rtl .input-group-addon:first-child { border-right: 1px solid rgb(204, 204, 204); }
+.rtl .input-group-addon:last-child { border-left: 1px solid rgb(204, 204, 204); }
+.rtl .footer .footer-inner { right: 0px; left: 0px; }
+.rtl .sidebar ~ .footer .footer-inner { right: 190px; left: 0px; }
+@media (min-width: 992px) {
+ .rtl .sidebar.compact ~ .footer .footer-inner { right: 105px; left: 0px; }
+}
+.rtl .sidebar.menu-min ~ .footer .footer-inner { right: 43px; left: 0px; }
+@media (min-width: 992px) {
+ .rtl .sidebar.h-sidebar ~ .footer .footer-inner { right: 0px; left: 0px; }
+}
+@media (max-width: 991px) {
+ .rtl .footer .footer-inner, .rtl .sidebar.compact ~ .footer .footer-inner, .rtl .sidebar.menu-min ~ .footer .footer-inner, .rtl .sidebar ~ .footer .footer-inner { right: 0px; left: 0px; }
+ .rtl .sidebar.responsive-min ~ .footer .footer-inner { right: 43px; left: 0px; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .rtl .container.main-container .footer .footer-inner { margin-right: auto; }
+}
+@media (min-width: 992px) {
+ .rtl .container.main-container .footer .footer-inner { margin-left: auto; margin-right: 190px; }
+}
+@media (min-width: 1200px) {
+ .rtl .container.main-container .footer .footer-inner { margin-left: auto; margin-right: 190px; }
+ .rtl .container.main-container .sidebar.compact ~ .footer .footer-inner { margin-left: auto; margin-right: 105px; }
+}
+@media (min-width: 992px) {
+ .rtl .container.main-container .sidebar.compact ~ .footer .footer-inner { margin-left: auto; margin-right: 105px; }
+ .rtl .container.main-container .sidebar.menu-min ~ .footer .footer-inner { margin-left: auto; margin-right: 43px; }
+}
+@media (min-width: 1200px) {
+ .rtl .container.main-container .sidebar.menu-min ~ .footer .footer-inner { margin-left: auto; margin-right: 43px; }
+ .rtl .container.main-container .sidebar.h-sidebar ~ .footer .footer-inner { margin-right: 0px; }
+}
+@media (min-width: 992px) {
+ .rtl .container.main-container .sidebar.h-sidebar ~ .footer .footer-inner { margin-right: 0px; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .rtl .container.main-container .sidebar.responsive-min ~ .footer .footer-inner { margin-right: 43px; margin-left: auto; }
+}
+@media only screen and (max-width: 991px) and (min-width: 992px) {
+ .rtl .navbar.navbar-fixed-top + .main-container .sidebar.responsive.push_away.display.compact ~ .footer .footer-inner { transform: translateX(-105px); }
+}
+@media only screen and (max-width: 991px) {
+ .rtl .navbar.navbar-fixed-top + .main-container .sidebar.responsive.push_away.display ~ .footer .footer-inner { transform: translateX(-190px); }
+ .rtl .navbar.navbar-fixed-top + .main-container .sidebar.responsive.push_away.display.menu-min ~ .footer .footer-inner { transform: translateX(-43px); }
+}
+.rtl blockquote p, .rtl blockquote small { text-align: left; }
+.rtl blockquote small::before { content: ""; }
+.rtl blockquote small::after { content: " —"; }
+.rtl .blockquote-reverse p, .rtl .blockquote-reverse small, .rtl blockquote.pull-right p, .rtl blockquote.pull-right small { text-align: right; }
+.rtl .blockquote-reverse small::after, .rtl blockquote.pull-right small::after { content: ""; }
+.rtl .blockquote-reverse small::before, .rtl blockquote.pull-right small::before { content: "— "; }
+.rtl .fc-grid th { text-align: center; }
+.rtl .external-event > .ace-icon:first-child { margin-right: 0px; margin-left: 5px; border-right-width: 0px; border-left: 1px solid rgb(255, 255, 255); }
+.rtl #cboxCurrent { left: auto; right: 64px; }
+.rtl #cboxNext, .rtl #cboxPrevious { margin-left: 0px; margin-right: 5px; }
+.rtl #cboxPrevious { left: auto; right: 27px; }
+.rtl #cboxNext { left: auto; right: 0px; }
+.rtl .ace-spinner .spinner-buttons > button.btn:active { left: auto; top: auto; }
+.rtl .wizard-steps { margin-right: 0px; }
+.rtl .wizard-actions { text-align: left; }
+.rtl .wizard-steps li:first-child::before { right: 50%; left: auto; }
+.rtl .tree { padding-left: 0px; padding-right: 9px; }
+.rtl .tree::before { left: auto; right: 0px; border-width: 0px 1px 0px 0px; }
+.rtl .tree .tree-folder .tree-folder-header .tree-folder-name { margin-left: 0px; margin-right: 2px; }
+.rtl .tree .tree-folder .tree-folder-header > .ace-icon:first-child { margin: -2px -2px 0px 0px; }
+.rtl .tree .tree-folder:last-child::after { left: auto; right: -15px; border-left: medium none; border-right: 1px solid rgb(255, 255, 255); }
+.rtl .tree .tree-folder .tree-folder-content { margin-left: 0px; margin-right: 23px; }
+.rtl .tree .tree-folder .tree-folder-content::before { left: auto; right: -14px; border-width: 0px 1px 0px 0px; }
+.rtl .tree .tree-item .tree-item-name { margin-left: 0px; margin-right: 3px; }
+.rtl .tree .tree-item .tree-item-name > .ace-icon:first-child { margin-right: 0px; margin-left: 3px; }
+.rtl .tree .tree-folder::before, .rtl .tree .tree-item::before { left: auto; right: -13px; }
+.rtl .tree .tree-loading { margin-left: 0px; margin-right: 36px; }
+.rtl #gritter-notice-wrapper { left: 20px; right: auto; }
+.rtl .gritter-close { right: auto; left: 3px; }
+.rtl .gritter-image { float: right; }
+.rtl .gritter-with-image, .rtl .gritter-without-image { float: left; }
+.rtl .wysiwyg-toolbar .dropdown-menu { text-align: right; }
+.rtl .wysiwyg-toolbar .wysiwyg-choose-file { margin-left: auto; }
+.rtl .wysiwyg-toolbar .btn-group > .btn, .rtl .wysiwyg-toolbar .btn-group > .inline > .btn { float: none; }
+.rtl .wysiwyg-style1 .btn-group::after, .rtl .wysiwyg-style2 .btn-group::after { left: auto; border-left-width: 0px; right: -2px; border-right: 1px solid rgb(225, 230, 234); }
+.rtl .wysiwyg-toolbar .dropdown-menu input[type="text"] { margin-left: 0px; margin-right: 8px; }
+.rtl .wysiwyg-toolbar .dropdown-menu .btn { margin-right: 1px; margin-left: 8px; }
+.rtl .widget-body .md-header { margin-left: 0px; margin-right: 9px; }
+.rtl .widget-body .md-header .btn-inverse { padding-right: 0px; padding-left: 5px; }
+.rtl .editable-buttons { margin-left: auto; margin-right: 1px; }
+.rtl .editable-buttons .btn { margin: 0px 0px 0px 1px; }
+.rtl .ui-datepicker .ui-datepicker-prev::before { content: ""; }
+.rtl .ui-datepicker .ui-datepicker-next::before { content: ""; }
+.rtl .ui-menu .ui-menu-item .ui-menu-icon { float: left; left: 4px; right: auto; }
+.rtl .ui-menu .ui-menu-item .ui-menu-icon::before { content: ""; }
+.rtl .ui-dialog .ui-dialog-titlebar-close, .rtl .ui-jqdialog .ui-jqdialog-titlebar-close { left: 8px !important; right: auto !important; }
+.rtl .ui-tabs .ui-tabs-nav li { float: right; margin-right: 0px; margin-left: 0.2em; }
+.rtl .ui-tabs .ui-tabs-nav li a { float: right; }
+.rtl .ui-tabs .ui-tabs-nav li.ui-state-default > a { margin-right: auto; margin-left: -1px; }
+.rtl .ui-accordion .ui-accordion-header { padding-right: 24px; padding-left: 8px; }
+.rtl .ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: auto; right: 10px; }
+.rtl .ui-accordion .ui-accordion-header .ui-accordion-header-icon::before { content: ""; }
+.rtl .ui-accordion .ui-accordion-header.ui-state-active .ui-accordion-header-icon::before { content: ""; }
+.rtl .ui-jqgrid .ui-jqgrid-hdiv { border-width: 1px 1px 0px 0px; }
+.rtl .ui-jqgrid .ui-jqgrid-labels th { border-right-width: 0px !important; border-left: 1px solid rgb(225, 225, 225) !important; text-align: right !important; }
+.rtl .ui-jqgrid .ui-jqgrid-labels th:first-child { border-right: 1px solid rgb(225, 225, 225) !important; }
+.rtl .ui-jqgrid-labels th[id*="_cb"]:first-child { text-align: center !important; }
+.rtl .ui-jqgrid-sortable { padding-left: 0px; padding-right: 4px; }
+.rtl .ui-jqdialog-content .searchFilter table { margin-left: auto; margin-right: 4px; }
+.rtl .ui-jqdialog-content .searchFilter .add-group, .rtl .ui-jqdialog-content .searchFilter .add-rule, .rtl .ui-jqdialog-content .searchFilter .delete-group { margin-left: auto !important; margin-right: 4px !important; }
+.rtl .ui-jqdialog-content .CaptionTD { text-align: left; }
+.rtl .ui-jqdialog .ui-widget-header .ui-jqdialog-title { text-align: right; padding-left: 0px; padding-right: 12px; float: right !important; }
+.rtl .dd-list { margin-right: 0px; }
+.rtl .dd-list .dd-list { padding-left: 0px; }
+.rtl .dd2-handle + .dd2-content, .rtl .dd2-handle + .dd2-content[class*="btn-"] { padding-left: 0px; padding-right: 44px; }
+.rtl .dd-item > button { float: right; margin: 5px 5px 5px 1px; left: auto; right: 1px; }
+.rtl .dd2-item.dd-item > button { margin-left: 5px; margin-right: 34px; }
+.rtl .dd-dragel > li > .dd-handle { border-left-width: 0px; }
+.rtl .dd-list > li[class*="item-"] { border-left-width: 0px; border-right-width: 0px; }
+.rtl .dd-list > li[class*="item-"] > .dd-handle { border-right-width: 2px; border-right-style: solid; border-right-color: inherit; border-left-color: rgb(218, 226, 234); border-left-width: 1px; }
+.rtl .dd-list > li > .dd-handle .sticker { right: auto; left: 0px; }
+.rtl .dd-dragel > li > .dd2-handle, .rtl .dd2-handle { left: auto; right: 0px; border-width: 1px 0px 0px 1px; }
+.rtl ol.linenums { margin-right: 33px; }
+.rtl ol.linenums li { padding-left: 0px; padding-right: 12px; }
+.rtl .prettyprint.linenums { box-shadow: -40px 0px 0px rgb(251, 251, 252) inset, -41px 0px 0px rgb(236, 236, 240) inset; }
+.rtl .tt-dropdown-menu { text-align: right; direction: rtl; }
diff --git a/at-admin/static/index/ace-skins.min.css b/at-admin/static/index/ace-skins.min.css
new file mode 100644
index 0000000..50ef474
--- /dev/null
+++ b/at-admin/static/index/ace-skins.min.css
@@ -0,0 +1,768 @@
+/* Code tidied up by ScrapBook */
+.skin-2 .sidebar-shortcuts .btn:focus, .skin-3 .sidebar-shortcuts-large > .btn:focus { outline: 0px none; }
+.skin-1 { background-color: rgb(74, 79, 86); }
+.skin-1 .navbar { background: rgb(44, 106, 160) none repeat scroll 0% 0%; }
+.skin-1 .sidebar { background-color: rgb(34, 42, 45); border-right-width: 0px; }
+.skin-1 .nav-list > li { border-color: rgb(63, 78, 84); }
+.skin-1 .nav-list > li > a { background-color: rgb(34, 42, 45); color: rgb(186, 194, 200); }
+.skin-1 .nav-list > li:hover > a { background-color: rgb(65, 75, 81); color: rgb(225, 234, 241); }
+.skin-1 .nav-list > li.open:hover > a, .skin-1 .nav-list > li.open > a { color: rgb(133, 192, 236); background-color: rgb(34, 42, 45); }
+.skin-1 .nav-list > li.active:hover > a, .skin-1 .nav-list > li.active > a { background-color: rgb(20, 26, 27); color: rgb(123, 183, 229); }
+.skin-1 .nav-list > li:hover::before { background-color: rgb(98, 156, 201); }
+.skin-1 .nav-list > li.active::before { display: block; background-color: rgb(77, 150, 198); }
+.skin-1 .nav-list li.active > a::after { border-right-color: rgb(255, 255, 255); border-width: 11px 7px; top: 8px; right: 0px; }
+.skin-1 .nav-list > li.active > .submenu li.active > a::after { top: 5px; }
+.skin-1 .nav-list > li .submenu { background-color: rgb(51, 61, 63); }
+.skin-1 .nav-list > li.active .submenu { background-color: rgb(24, 30, 32); }
+.skin-1 .nav-list > li .submenu > li > a { border-top-style: solid; border-top-color: rgb(69, 77, 78); background-color: rgb(51, 61, 63); }
+.skin-1 .nav-list > li .submenu > li > a:hover { background-color: rgb(45, 54, 56); }
+.skin-1 .nav-list > li.active .submenu > li > a { border-top-color: rgb(34, 37, 38); background-color: rgb(24, 30, 32); }
+.skin-1 .nav-list > li.active .submenu > li > a:hover { background-color: rgb(20, 25, 26); }
+.skin-1 .nav-list > li > .submenu { border-top-color: rgb(80, 90, 91); }
+.skin-1 .nav-list > li.active > .submenu { border-top-color: rgb(47, 62, 68); }
+.skin-1 .nav-list > li > .submenu > li > a { color: rgb(217, 223, 230); }
+.skin-1 .nav-list > li > .submenu > li:hover > a { color: rgb(138, 180, 222); }
+.skin-1 .nav-list > li > .submenu > li.active > a { color: rgb(123, 183, 229); background-color: rgb(22, 27, 29); }
+.skin-1 .nav-list > li > .submenu::before, .skin-1 .nav-list > li > .submenu > li::before { border-color: rgb(100, 108, 112); }
+.skin-1 .nav-list > li.active > .submenu::before, .skin-1 .nav-list > li.active > .submenu > li::before { border-color: rgb(63, 78, 84); }
+.skin-1 .nav-list > li .submenu li > .submenu li > a { color: rgb(217, 223, 230); }
+.skin-1 .nav-list > li .submenu li > .submenu li:hover > a { color: rgb(138, 180, 222); }
+.skin-1 .nav-list > li .submenu li.open > a, .skin-1 .nav-list > li .submenu li > .submenu > li.open > a { color: rgb(133, 192, 236); }
+.skin-1 .nav-list > li .submenu li > .submenu li.active > a { color: rgb(97, 168, 221); }
+.skin-1 .nav-list > li .submenu li > .submenu li.active:hover > a { color: rgb(133, 192, 236); }
+.skin-1 .sidebar .nav-list > li.active.highlight, .skin-1 .sidebar .nav-list > li.active.highlight + li { border-color: rgb(80, 107, 127); }
+.skin-1 .sidebar .nav-list > li.active.highlight + li:last-child { border-bottom-color: rgb(63, 78, 84); }
+.skin-1 .sidebar .nav-list > li.active.highlight > a::after { border-right-color: transparent; border-left-color: rgb(20, 26, 27); border-width: 20px 0px 20px 10px; z-index: 1; top: 0px; right: -9px; }
+.skin-1 .sidebar .nav-list > li.active.highlight > a::before { border-style: solid; border-color: transparent; border-width: 20px 0px 20px 10px; content: ""; position: absolute; right: -11px; top: 0px; z-index: 1; }
+.skin-1 .sidebar-shortcuts, .skin-1 .sidebar-shortcuts-mini, .skin-1 .sidebar > .nav-search { background-color: rgb(34, 42, 45); border-color: rgb(63, 78, 84); }
+.skin-1 .sidebar-toggle { background-color: rgb(24, 30, 33); border-color: rgb(63, 78, 84); }
+.skin-1 .sidebar-toggle > .ace-icon { background-color: rgb(34, 42, 45); color: rgb(170, 170, 170); border-color: rgb(170, 170, 170); }
+.skin-1 .breadcrumbs { border-width: 0px; background-color: rgb(240, 240, 240); }
+@media (min-width: 992px) {
+ .skin-1 .breadcrumbs.breadcrumbs-fixed { border-bottom-width: 1px; }
+}
+@media only screen and (max-width: 991px) {
+ .skin-1 .sidebar.responsive { border-width: 0px; box-shadow: none; }
+ .skin-1 .sidebar.responsive .nav-list li.active > a::after { display: none; }
+ .skin-1 .sidebar.responsive .nav-list > li.active.highlight > a::after { display: block; }
+}
+.skin-1 .sidebar.menu-min .nav-list > li.open > a { background-color: rgb(34, 42, 45); color: rgb(186, 194, 200); }
+.skin-1 .sidebar.menu-min .nav-list > li.active > a::after { border-width: 9px 6px; top: 10px; }
+.skin-1 .sidebar.menu-min .nav-list > li.active.highlight > a::after { border-width: 20px 0px 20px 10px; top: 0px; }
+.skin-1 .sidebar.menu-min .nav-list > li.active:hover > a::after { border-right-color: rgb(36, 42, 43); }
+.skin-1 .sidebar.menu-min .nav-list > li.active > a, .skin-1 .sidebar.menu-min .nav-list > li.active > a:hover { background-color: rgb(20, 26, 27); color: rgb(123, 183, 229); }
+.skin-1 .sidebar.menu-min .nav-list > li:hover > a { color: rgb(225, 234, 241); }
+.skin-1 .sidebar.menu-min .nav-list > li > a > .menu-text { background-color: rgb(65, 75, 81); }
+.skin-1 .sidebar.menu-min .nav-list > li.active > a > .menu-text { background-color: rgb(36, 42, 43); border-style: solid; border-color: rgb(59, 69, 71) rgb(59, 69, 71) rgb(59, 69, 71) rgb(48, 86, 117); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 1px 0px; }
+.skin-1 .sidebar.menu-min .nav-list > li.active > a:not(.dropdown-toggle) > .menu-text { border-width: 1px; border-top-color: rgb(74, 92, 99); border-bottom-color: rgb(74, 92, 99); border-right-color: rgb(74, 92, 99); }
+.skin-1 .sidebar.menu-min .nav-list > li.active:hover > a, .skin-1 .sidebar.menu-min .nav-list > li.active > a > .menu-text { color: rgb(123, 183, 229); }
+.skin-1 .sidebar.menu-min .nav-list > li.open.active > a { background-color: rgb(20, 26, 27); }
+.skin-1 .sidebar.menu-min .nav-list > li > .submenu, .skin-1 .sidebar.menu-min .nav-list > li > a > .menu-text { border-width: 0px 0px 0px 1px; border-left: 1px solid rgb(24, 29, 31); box-shadow: none; }
+.skin-1 .sidebar.menu-min .nav-list > li > .submenu { border-top-style: solid; background-color: rgb(51, 61, 63); border-top-color: rgb(90, 96, 106); border-top-width: 1px !important; }
+.skin-1 .sidebar.menu-min .nav-list > li > .submenu::after { display: none; }
+.skin-1 .sidebar.menu-min .nav-list > li.active > .submenu { background-color: rgb(24, 30, 32); border-top-color: rgb(59, 69, 71); border-left-color: rgb(48, 86, 117); }
+.skin-1 .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: rgb(65, 75, 81); }
+.skin-1 .sidebar.menu-min .nav-list > li > .arrow::before { border-right-color: rgb(17, 20, 21); }
+.skin-1 .sidebar.menu-min .nav-list > li.active > .arrow::after { border-right-color: rgb(36, 42, 43); }
+.skin-1 .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: rgb(80, 160, 221); }
+.skin-1 .sidebar.menu-min .sidebar-shortcuts-large { background-color: rgb(34, 42, 45); box-shadow: none; border-style: solid; border-color: rgb(74, 92, 99); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 1px 0px; top: 0px; }
+@media (max-width: 991px) {
+ .skin-1 .sidebar.responsive-min .nav-list > li.open > a { background-color: rgb(34, 42, 45); color: rgb(186, 194, 200); }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > a::after { border-width: 9px 6px; top: 10px; }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active.highlight > a::after { border-width: 20px 0px 20px 10px; top: 0px; }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active:hover > a::after { border-right-color: rgb(36, 42, 43); }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > a, .skin-1 .sidebar.responsive-min .nav-list > li.active > a:hover { background-color: rgb(20, 26, 27); color: rgb(123, 183, 229); }
+ .skin-1 .sidebar.responsive-min .nav-list > li:hover > a { color: rgb(225, 234, 241); }
+ .skin-1 .sidebar.responsive-min .nav-list > li > a > .menu-text { background-color: rgb(65, 75, 81); }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > a > .menu-text { background-color: rgb(36, 42, 43); border-style: solid; border-color: rgb(59, 69, 71) rgb(59, 69, 71) rgb(59, 69, 71) rgb(48, 86, 117); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 1px 0px; }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > a:not(.dropdown-toggle) > .menu-text { border-width: 1px; border-top-color: rgb(74, 92, 99); border-bottom-color: rgb(74, 92, 99); border-right-color: rgb(74, 92, 99); }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active:hover > a, .skin-1 .sidebar.responsive-min .nav-list > li.active > a > .menu-text { color: rgb(123, 183, 229); }
+ .skin-1 .sidebar.responsive-min .nav-list > li.open.active > a { background-color: rgb(20, 26, 27); }
+ .skin-1 .sidebar.responsive-min .nav-list > li > .submenu, .skin-1 .sidebar.responsive-min .nav-list > li > a > .menu-text { border-width: 0px 0px 0px 1px; border-left: 1px solid rgb(24, 29, 31); box-shadow: none; }
+ .skin-1 .sidebar.responsive-min .nav-list > li > .submenu { border-top-style: solid; background-color: rgb(51, 61, 63); border-top-color: rgb(90, 96, 106); border-top-width: 1px !important; }
+ .skin-1 .sidebar.responsive-min .nav-list > li > .submenu::after { display: none; }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > .submenu { background-color: rgb(24, 30, 32); border-top-color: rgb(59, 69, 71); border-left-color: rgb(48, 86, 117); }
+ .skin-1 .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: rgb(65, 75, 81); }
+ .skin-1 .sidebar.responsive-min .nav-list > li > .arrow::before { border-right-color: rgb(17, 20, 21); }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > .arrow::after { border-right-color: rgb(36, 42, 43); }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: rgb(80, 160, 221); }
+ .skin-1 .sidebar.responsive-min .sidebar-shortcuts-large { background-color: rgb(34, 42, 45); box-shadow: none; border-style: solid; border-color: rgb(74, 92, 99); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 1px 0px; top: 0px; }
+ .skin-1 .sidebar.responsive-min .nav-list > li.active > a::after { display: block; }
+ .skin-1 .sidebar.responsive-max .nav-list li.active > a::after { display: none; }
+ .skin-1 .sidebar.responsive-max .nav-list > li.highlight.active > a::after { display: block; }
+}
+@media only screen and (min-width: 992px) {
+ .skin-1 .nav-list li.hover > .submenu { padding-left: 0px; padding-bottom: 2px; padding-right: 0px; border-color: rgb(35, 40, 40); }
+ .skin-1 .nav-list li.hover > .submenu > li > a { border-top-width: 1px; margin-bottom: 0px; margin-top: 0px; }
+ .skin-1 .nav-list li.hover > .submenu > li:first-child > a { border-top-width: 0px; }
+ .skin-1 .nav-list > li > .submenu li.hover > .submenu { padding: 3px 2px; }
+ .skin-1 .nav-list > li.active > .submenu li.hover > .submenu { border-left-color: rgb(71, 85, 97); background-color: rgb(23, 30, 31); }
+ .skin-1 .nav-list li.active > .submenu li.hover.active > .submenu, .skin-1 .nav-list li.hover.active > .submenu { border-left-color: rgb(48, 86, 117); }
+ .skin-1 .sidebar.navbar-collapse .nav-list > li.open.hover:not(:hover):not(:focus):not(.active) > a { color: rgb(186, 194, 200); }
+ .skin-1 .sidebar.navbar-collapse .nav-list > li.open.hover:hover > a { color: rgb(225, 234, 241); background-color: rgb(65, 75, 81); }
+ .skin-1 .sidebar.navbar-collapse .nav-list > li.active.hover:hover > a { color: rgb(123, 183, 229); background-color: rgb(20, 26, 27); }
+ .skin-1 .sidebar.navbar-collapse .nav-list > li > .submenu li.open.hover:not(:hover):not(:focus):not(.active) > a { color: rgb(217, 223, 230); }
+}
+@media only screen and (min-width: 992px) and (max-width: 991px) {
+ .skin-1 .sidebar.navbar-collapse .nav-list li.hover > .submenu { padding-bottom: 0px; border-top-color: rgb(80, 90, 91); }
+ .skin-1 .sidebar.navbar-collapse .nav-list li.hover.active > .submenu { border-top-color: rgb(47, 62, 68); }
+ .skin-1 .sidebar.navbar-collapse .nav-list li.active > .submenu li.hover.active > .submenu, .skin-1 .sidebar.navbar-collapse .nav-list li.hover.active > .submenu, .skin-1 .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu { border-left-width: 0px; }
+ .skin-1 .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu { padding: 0px; }
+ .skin-1 .sidebar.navbar-collapse .nav-list li li.hover > .submenu > li:first-child > a { border-top-width: 1px; }
+}
+.skin-1 .sidebar.navbar-collapse .nav-list > li .submenu > li.hover:hover > a { background-color: rgb(45, 54, 56); }
+.skin-1 .sidebar.navbar-collapse .nav-list > li.active .submenu > li.hover:hover > a { background-color: rgb(20, 25, 26); }
+@media only screen and (min-width: 992px) {
+ .skin-1 .sidebar:not(.navbar-collapse) .nav-list > li .submenu > li.hover:hover > a { background-color: rgb(45, 54, 56); }
+ .skin-1 .sidebar:not(.navbar-collapse) .nav-list > li.active .submenu > li.hover:hover > a { background-color: rgb(20, 25, 26); }
+}
+.skin-1 .nav-list li > .arrow::after { border-right-color: rgb(53, 60, 61); }
+.skin-1 .nav-list li > .arrow::before { border-right-color: rgb(29, 33, 34); }
+.skin-1 .nav-list > li.active > .arrow::after { border-right-color: rgb(23, 30, 31); }
+.skin-1 .nav-list > li.active > .arrow::before { border-right-color: rgb(48, 86, 117); }
+.skin-1 .nav-list > li.active > .submenu li.hover > .arrow::before { border-right-color: rgb(79, 110, 134); }
+.skin-1 .nav-list > li.active > .submenu li.hover.active > .arrow::before { border-right-color: rgb(48, 86, 117); }
+.skin-1 .nav-list > li.active > .submenu li.hover > .arrow::after { border-right-color: rgb(23, 30, 31); }
+.skin-1 .nav-list li.pull_up > .arrow::after { border-right-color: rgb(53, 60, 61) !important; }
+.skin-1 .nav-list li.pull_up > .arrow::before { border-right-color: rgb(29, 33, 34) !important; }
+.skin-1 .nav-list li.pull_up.active > .arrow::after { border-right-color: rgb(23, 30, 31) !important; }
+.skin-1 .nav-list li.pull_up.active > .arrow::before { border-right-color: rgb(48, 86, 117) !important; }
+.skin-1 .main-container .menu-toggler { background-color: rgb(68, 68, 68); }
+.skin-1 .main-container .menu-toggler::before { border-top-color: rgb(135, 184, 127); border-bottom-color: rgb(111, 179, 224); }
+.skin-1 .main-container .menu-toggler::after { border-top-color: rgb(255, 162, 77); border-bottom-color: rgb(209, 91, 71); }
+.skin-1 .main-container .menu-toggler > .toggler-text { border-top-color: rgb(68, 68, 68); }
+.skin-1.display { background-color: rgb(93, 130, 162); }
+.skin-1.display::before { border-top-color: rgb(181, 211, 176); border-bottom-color: rgb(174, 212, 238); }
+.skin-1.display::after { border-top-color: rgb(255, 202, 154); border-bottom-color: rgb(224, 146, 132); }
+.skin-1.display > .toggler-text { border-top-color: rgb(93, 130, 162); }
+.skin-1 .navbar .navbar-toggle { background-color: rgb(77, 157, 204); }
+.skin-1 .navbar .navbar-toggle:focus { background-color: rgb(77, 157, 204); border-color: transparent; }
+.skin-1 .navbar .navbar-toggle:hover { background-color: rgb(57, 146, 198); border-color: rgba(255, 255, 255, 0.1); }
+.skin-1 .navbar .navbar-toggle.display, .skin-1 .navbar .navbar-toggle[data-toggle="collapse"]:not(.collapsed) { background-color: rgb(51, 132, 179); box-shadow: 1px 1px 2px 0px rgba(0, 0, 0, 0.25) inset; border-color: rgba(255, 255, 255, 0.35); }
+@media only screen and (min-width: 768px) {
+ .skin-1 .container.main-container::before { box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.1); }
+}
+@media only screen and (min-width: 992px) {
+ .skin-1 .sidebar.h-sidebar::before { background-color: rgb(56, 66, 74); border-bottom-color: rgb(74, 92, 99); }
+ .skin-1 .sidebar.h-sidebar .nav-list { border-bottom-width: 0px; }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.active::before { display: block; }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.hover.active > a::after { border-color: transparent transparent rgb(255, 255, 255); border-width: 8px; top: auto; bottom: 0px; right: auto; left: 50%; margin-left: -8px; content: ""; display: block; }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.highlight.active > a::before, .skin-1 .sidebar.h-sidebar .nav-list > li.hover.active.hover-show > a::after, .skin-1 .sidebar.h-sidebar .nav-list > li.hover.active:hover > a::after { display: none; }
+ .skin-1 .sidebar.h-sidebar + .main-content .breadcrumbs { border-color: rgb(232, 232, 232); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li { border-color: rgb(63, 78, 84); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li:hover, .skin-1 .sidebar.h-sidebar .nav-list > li:hover + li { border-left-color: rgb(80, 101, 117); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li:last-child:hover { border-right-color: rgb(80, 101, 117); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.active, .skin-1 .sidebar.h-sidebar .nav-list > li.active + li, .skin-1 .sidebar.h-sidebar .nav-list > li:hover + li.active { border-left-color: rgb(85, 115, 138); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.active:last-child { border-right-color: rgb(85, 115, 138); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.hover > .submenu { border-top-color: rgb(35, 40, 40); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.hover.active > .submenu { border-top-color: rgb(48, 86, 117); border-left-color: rgb(35, 40, 40); }
+ .skin-1 .sidebar.h-sidebar .sidebar-shortcuts-large { background-color: rgb(34, 42, 45); border-width: 1px; border-style: solid; border-color: rgb(48, 86, 117) rgb(35, 40, 40) rgb(35, 40, 40); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; top: 100%; }
+ .skin-1 .sidebar.h-sidebar .nav-list > li > .arrow::after { border-right-color: transparent; border-bottom-color: rgb(53, 60, 61); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li > .arrow::before { border-right-color: transparent; border-bottom-color: rgb(25, 28, 28); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.active > .arrow::before, .skin-1 .sidebar.h-sidebar .sidebar-shortcuts-large::before { border-right-color: transparent; border-bottom-color: rgb(80, 160, 221); }
+ .skin-1 .sidebar.h-sidebar .nav-list > li.active > .arrow::after, .skin-1 .sidebar.h-sidebar .sidebar-shortcuts-large::after { border-right-color: transparent; border-bottom-color: rgb(23, 30, 31); }
+ .skin-1 .sidebar.h-sidebar .sidebar-shortcuts-large::after { border-bottom-color: rgb(34, 42, 45); }
+ .skin-1 .sidebar.h-sidebar.menu-min .nav-list > li > a > .menu-text { border-width: 1px 0px 0px; border-top-color: rgb(24, 29, 31); }
+ .skin-1 .sidebar.h-sidebar.menu-min .nav-list > li.active > a > .menu-text { border-top-color: rgb(48, 86, 117); }
+ .skin-1 .sidebar.h-sidebar.menu-min .nav-list > li.active > .submenu { border-top-color: rgb(59, 69, 71); }
+ .skin-1 .sidebar.h-sidebar.menu-min .nav-list > li > .arrow::after { border-bottom-color: rgb(65, 75, 81); }
+ .skin-1 .sidebar.h-sidebar.menu-min .nav-list > li > .arrow::before { border-bottom-color: rgb(17, 20, 21); }
+ .skin-1 .sidebar.h-sidebar.menu-min .nav-list > li.active > .arrow::after { border-bottom-color: rgb(36, 42, 43); }
+ .skin-1 .sidebar.h-sidebar.menu-min .nav-list > li.active > .arrow::before { border-bottom-color: rgb(80, 160, 221); }
+ .skin-1 .h-sidebar.sidebar-fixed + .main-content { padding-top: 86px; }
+ .skin-1 .h-sidebar.sidebar-fixed.no-gap + .main-content { padding-top: 72px; }
+ .skin-1 .h-sidebar.sidebar-fixed.menu-min + .main-content { padding-top: 61px; }
+ .skin-1 .h-sidebar.sidebar-fixed.menu-min.no-gap + .main-content { padding-top: 47px; }
+ .skin-1 .main-content .h-sidebar.sidebar .nav-list { border-left: 1px solid rgb(74, 92, 99); }
+}
+.skin-1 .sidebar-scroll .sidebar-shortcuts { border-bottom-color: rgb(74, 92, 99); }
+.skin-1 .sidebar-scroll .sidebar-toggle { border-top-color: rgb(74, 92, 99); }
+.skin-1 .scrollout .scroll-track { background-color: transparent; }
+.skin-1 .scrollout .scroll-bar { background-color: rgba(0, 0, 0, 0.2); }
+@media only screen and (min-width: 768px) and (max-width: 991px) {
+ .skin-1 .navbar.navbar-collapse { background-color: transparent; }
+ .skin-1 .navbar.navbar-collapse .navbar-container, .skin-1 .navbar.navbar-collapse::before { background: rgb(44, 106, 160) none repeat scroll 0% 0%; }
+}
+.skin-1 .nav-list > li.disabled::before { display: none !important; }
+.skin-1 .nav-list > li.disabled > a { background-color: rgb(51, 51, 51) !important; color: rgb(170, 170, 170) !important; }
+.skin-1 .nav-list li .submenu > li.disabled > a, .skin-1 .nav-list li.disabled .submenu > li > a { background-color: rgb(68, 68, 68) !important; color: rgb(160, 160, 160) !important; cursor: not-allowed !important; }
+.skin-1 .nav-list li .submenu > li.disabled > a > .menu-icon, .skin-1 .nav-list li.disabled .submenu > li > a > .menu-icon { display: none; }
+.skin-1 .nav-list > li.disabled .submenu > li > a { border-top-color: rgb(80, 80, 80); }
+.skin-2 { background-color: rgb(92, 92, 92); }
+.skin-2 .navbar { background: rgb(198, 72, 126) none repeat scroll 0% 0%; }
+.skin-2 .sidebar { background-color: rgb(80, 80, 80); border-right-width: 0px; }
+.skin-2 .nav-list > li { border-color: rgb(72, 72, 72); }
+.skin-2 .nav-list > li:first-child { border-top-color: rgb(90, 90, 90); }
+.skin-2 .nav-list > li:last-child { border-bottom-color: rgb(98, 98, 98); }
+.skin-2 .nav-list > li > a { background-color: rgb(57, 57, 57); color: rgb(230, 230, 230); }
+.skin-2 .nav-list > li.hover-show > a, .skin-2 .nav-list > li.open > a, .skin-2 .nav-list > li:hover > a { background-color: rgb(189, 82, 137); }
+.skin-2 .nav-list > li > a > .arrow, .skin-2 .nav-list > li > a > .menu-text { color: rgb(230, 230, 230); }
+.skin-2 .nav-list > li.hover-show > a > .menu-text, .skin-2 .nav-list > li:hover > a > .menu-text { font-weight: 700; color: rgba(0, 0, 0, 0.6); }
+.skin-2 .nav-list > li.hover-show > a > .arrow, .skin-2 .nav-list > li.hover-show > a > .menu-icon, .skin-2 .nav-list > li:hover > a > .arrow, .skin-2 .nav-list > li:hover > a > .menu-icon { color: rgb(255, 255, 255); }
+.skin-2 .nav-list > li.open > a > .menu-text { font-weight: 700; color: rgba(0, 0, 0, 0.6); }
+.skin-2 .nav-list > li.open > a > .arrow, .skin-2 .nav-list > li.open > a > .menu-icon { color: rgb(255, 255, 255); }
+.skin-2 .nav-list > li.active > a { background-color: rgb(36, 36, 36); color: rgb(255, 255, 255); }
+.skin-2 .nav-list > li.active > a > .menu-icon { color: inherit; }
+.skin-2 .nav-list > li.active.highlight > a > .menu-icon, .skin-2 .nav-list > li.active > a > .arrow, .skin-2 .nav-list > li.active > a > .menu-text { color: rgb(255, 255, 255); }
+.skin-2 .nav-list > li.active.hover-show > a, .skin-2 .nav-list > li.active.open:not(.highlight) > a, .skin-2 .nav-list > li.active.open > a, .skin-2 .nav-list > li.active:hover > a, .skin-2 .nav-list > li.active.hover-show:not(.highlight) > a, .skin-2 .nav-list > li.active:hover:not(.highlight) > a { background-color: rgb(36, 36, 36); }
+.skin-2 .nav-list > li.active.highlight > a { background-color: rgb(189, 82, 137); }
+.skin-2 .nav-list li.active > a::after { border-right-color: rgb(255, 255, 255); border-width: 11px 7px; top: 8px; right: 0px; }
+.skin-2 .nav-list > li.active > .submenu li.active > a::after { top: 6px; }
+.skin-2 .nav-list > li::before { top: 0px; height: 39px; }
+.skin-2 .nav-list > li.active::before { display: block; background-color: rgb(206, 125, 167); }
+.skin-2 .nav-list > li.active.highlight::before, .skin-2 .nav-list > li::before { background-color: rgb(222, 168, 196); }
+.skin-2 .nav-list > li > .submenu { border-top-width: 0px; background-color: rgb(69, 48, 59); }
+.skin-2 .nav-list > li > .submenu > li, .skin-2 .nav-list > li > .submenu > li > .submenu, .skin-2 .nav-list > li > .submenu > li > .submenu > li, .skin-2 .nav-list > li > .submenu > li > .submenu > li .submenu, .skin-2 .nav-list > li > .submenu > li > .submenu > li .submenu li { background-color: inherit; }
+.skin-2 .nav-list > li .submenu > li > a { border-top: 1px solid rgba(255, 255, 255, 0.08); background-color: transparent; padding-left: 32px; }
+.skin-2 .nav-list > li .submenu > li > a:hover { background-color: rgba(0, 0, 0, 0.1); color: rgb(255, 255, 255); }
+.skin-2 .nav-list > li .submenu > li > a:hover > .menu-icon { background-color: transparent; }
+.skin-2 .nav-list > li.active .submenu > li > a:hover { background-color: rgba(0, 0, 0, 0.1); }
+.skin-2 .nav-list > li > .submenu > li > a { color: rgb(238, 238, 238); }
+.skin-2 .nav-list > li > .submenu > li:first-child > a { border-top-width: 0px; }
+.skin-2 .nav-list > li > .submenu > li.active > a { background-color: rgba(0, 0, 0, 0.05); font-weight: 700; }
+.skin-2 .nav-list > li > .submenu > li.active > a > .menu-icon { color: inherit; background-color: transparent; }
+.skin-2 .nav-list li .submenu li > a { color: rgb(238, 238, 238); font-size: 13px; }
+.skin-2 .nav-list > li > .submenu::before, .skin-2 .nav-list > li > .submenu > li::before { display: none; }
+.skin-2 .nav-list > li .submenu > li > a > .menu-icon { left: 12px; }
+@media only screen and (min-width: 992px) {
+ .skin-2 .nav-list > li .submenu > li.hover > a { padding-left: 26px; }
+ .skin-2 .nav-list > li .submenu > li.hover > a > .menu-icon { left: 6px; }
+}
+.skin-2 .nav-list > li > .submenu li > .submenu > li > a { margin-left: 0px; padding-left: 37px; padding-top: 8px; padding-bottom: 10px; border-top-width: 0px; }
+.skin-2 .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: 0px; padding-left: 51px; }
+.skin-2 .nav-list > li > .submenu li.active > a, .skin-2 .nav-list > li > .submenu li.hover-show > a, .skin-2 .nav-list > li > .submenu li.open > a, .skin-2 .nav-list > li > .submenu li:hover > a { color: rgb(218, 129, 175); }
+.skin-2 .nav-list > li > .submenu li > a > .ace-icon { background-color: transparent; }
+.skin-2 .nav-list > li.active.highlight .badge, .skin-2 .nav-list > li.active.highlight .label, .skin-2 .nav-list > li.hover-show:not(.active) > a .badge, .skin-2 .nav-list > li.hover-show:not(.active) > a .label, .skin-2 .nav-list > li.open:not(.active) > a .badge, .skin-2 .nav-list > li.open:not(.active) > a .label, .skin-2 .nav-list > li:hover:not(.active) > a .badge, .skin-2 .nav-list > li:hover:not(.active) > a .label { background-color: rgba(0, 0, 0, 0.5) !important; }
+.skin-2 .nav-list > li.active.highlight .badge.badge-transparent, .skin-2 .nav-list > li.active.highlight .label.label-transparent, .skin-2 .nav-list > li.hover-show:not(.active) > a .badge.badge-transparent, .skin-2 .nav-list > li.hover-show:not(.active) > a .label.label-transparent, .skin-2 .nav-list > li.open:not(.active) > a .badge.badge-transparent, .skin-2 .nav-list > li.open:not(.active) > a .label.label-transparent, .skin-2 .nav-list > li:hover:not(.active) > a .badge.badge-transparent, .skin-2 .nav-list > li:hover:not(.active) > a .label.label-transparent { color: rgba(255, 255, 255, 0.8) !important; background-color: transparent !important; }
+.skin-2 .nav-list > li.active.highlight .badge.badge-transparent .ace-icon, .skin-2 .nav-list > li.active.highlight .label.label-transparent .ace-icon, .skin-2 .nav-list > li.hover-show:not(.active) > a .badge.badge-transparent .ace-icon, .skin-2 .nav-list > li.hover-show:not(.active) > a .label.label-transparent .ace-icon, .skin-2 .nav-list > li.open:not(.active) > a .badge.badge-transparent .ace-icon, .skin-2 .nav-list > li.open:not(.active) > a .label.label-transparent .ace-icon, .skin-2 .nav-list > li:hover:not(.active) > a .badge.badge-transparent .ace-icon, .skin-2 .nav-list > li:hover:not(.active) > a .label.label-transparent .ace-icon { color: rgba(255, 255, 255, 0.8) !important; }
+.skin-2 .nav-list li > .arrow::after { border-right-color: rgb(69, 48, 59); }
+.skin-2 .nav-list li > .arrow::before { border-right-color: rgb(25, 25, 25); }
+.skin-2 .nav-list > li.pull_up > .arrow::after { border-right-color: rgb(69, 48, 59) !important; }
+.skin-2 .nav-list > li.pull_up > .arrow::before { border-right-color: rgb(25, 25, 25) !important; }
+.skin-2 .nav-list > li.active.highlight > a::after { border-right-color: transparent; border-left-color: rgb(189, 82, 137); border-width: 20px 0px 20px 10px; z-index: 1; top: 0px; right: -9px; display: block; }
+.skin-2 .nav-list > li:nth-child(1) > a { color: rgb(0, 190, 103); }
+.skin-2 .nav-list > li.open:nth-child(1) > a, .skin-2 .nav-list > li.hover-show:nth-child(1) > a, .skin-2 .nav-list > li:nth-child(1):hover > a { background-color: rgb(24, 166, 101); }
+.skin-2 .nav-list > li:nth-child(1) > .submenu { background-color: rgb(42, 65, 55); }
+.skin-2 .nav-list > li:nth-child(1) li > .arrow::after, .skin-2 .nav-list > li:nth-child(1) > .arrow::after { border-right-color: rgb(42, 65, 55); }
+.skin-2 .nav-list > li.pull_up:nth-child(1) > .arrow::after { border-right-color: rgb(42, 65, 55) !important; }
+.skin-2 .nav-list > li:nth-child(1) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(1) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(1) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(1) > .submenu li:hover > a { color: rgb(30, 237, 142); }
+.skin-2 .nav-list > li.active:nth-child(1)::before { background-color: rgb(82, 188, 140); }
+.skin-2 .nav-list > li.active.highlight:nth-child(1)::before, .skin-2 .nav-list > li:nth-child(1)::before { background-color: rgb(139, 211, 178); }
+.skin-2 .nav-list > li:nth-child(2) > a { color: rgb(94, 208, 43); }
+.skin-2 .nav-list > li.open:nth-child(2) > a, .skin-2 .nav-list > li.hover-show:nth-child(2) > a, .skin-2 .nav-list > li:nth-child(2):hover > a { background-color: rgb(106, 177, 74); }
+.skin-2 .nav-list > li:nth-child(2) > .submenu { background-color: rgb(54, 67, 47); }
+.skin-2 .nav-list > li:nth-child(2) li > .arrow::after, .skin-2 .nav-list > li:nth-child(2) > .arrow::after { border-right-color: rgb(54, 67, 47); }
+.skin-2 .nav-list > li.pull_up:nth-child(2) > .arrow::after { border-right-color: rgb(54, 67, 47) !important; }
+.skin-2 .nav-list > li:nth-child(2) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(2) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(2) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(2) > .submenu li:hover > a { color: rgb(146, 210, 117); }
+.skin-2 .nav-list > li.active:nth-child(2)::before { background-color: rgb(143, 196, 120); }
+.skin-2 .nav-list > li.active.highlight:nth-child(2)::before, .skin-2 .nav-list > li:nth-child(2)::before { background-color: rgb(180, 216, 165); }
+.skin-2 .nav-list > li:nth-child(3) > a { color: rgb(167, 215, 0); }
+.skin-2 .nav-list > li.open:nth-child(3) > a, .skin-2 .nav-list > li.hover-show:nth-child(3) > a, .skin-2 .nav-list > li:nth-child(3):hover > a { background-color: rgb(152, 188, 27); }
+.skin-2 .nav-list > li:nth-child(3) > .submenu { background-color: rgb(62, 68, 42); }
+.skin-2 .nav-list > li:nth-child(3) li > .arrow::after, .skin-2 .nav-list > li:nth-child(3) > .arrow::after { border-right-color: rgb(62, 68, 42); }
+.skin-2 .nav-list > li.pull_up:nth-child(3) > .arrow::after { border-right-color: rgb(62, 68, 42) !important; }
+.skin-2 .nav-list > li:nth-child(3) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(3) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(3) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(3) > .submenu li:hover > a { color: rgb(197, 239, 53); }
+.skin-2 .nav-list > li.active:nth-child(3)::before { background-color: rgb(178, 205, 84); }
+.skin-2 .nav-list > li.active.highlight:nth-child(3)::before, .skin-2 .nav-list > li:nth-child(3)::before { background-color: rgb(204, 222, 141); }
+.skin-2 .nav-list > li:nth-child(4) > a { color: rgb(206, 225, 0); }
+.skin-2 .nav-list > li.open:nth-child(4) > a, .skin-2 .nav-list > li.hover-show:nth-child(4) > a, .skin-2 .nav-list > li:nth-child(4):hover > a { background-color: rgb(183, 197, 28); }
+.skin-2 .nav-list > li:nth-child(4) > .submenu { background-color: rgb(67, 69, 42); }
+.skin-2 .nav-list > li:nth-child(4) li > .arrow::after, .skin-2 .nav-list > li:nth-child(4) > .arrow::after { border-right-color: rgb(67, 69, 42); }
+.skin-2 .nav-list > li.pull_up:nth-child(4) > .arrow::after { border-right-color: rgb(67, 69, 42) !important; }
+.skin-2 .nav-list > li:nth-child(4) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(4) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(4) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(4) > .submenu li:hover > a { color: rgb(224, 239, 62); }
+.skin-2 .nav-list > li.active:nth-child(4)::before { background-color: rgb(201, 211, 85); }
+.skin-2 .nav-list > li.active.highlight:nth-child(4)::before, .skin-2 .nav-list > li:nth-child(4)::before { background-color: rgb(219, 226, 142); }
+.skin-2 .nav-list > li:nth-child(5) > a { color: rgb(248, 198, 0); }
+.skin-2 .nav-list > li.open:nth-child(5) > a, .skin-2 .nav-list > li.hover-show:nth-child(5) > a, .skin-2 .nav-list > li:nth-child(5):hover > a { background-color: rgb(217, 180, 31); }
+.skin-2 .nav-list > li:nth-child(5) > .submenu { background-color: rgb(72, 66, 42); }
+.skin-2 .nav-list > li:nth-child(5) li > .arrow::after, .skin-2 .nav-list > li:nth-child(5) > .arrow::after { border-right-color: rgb(72, 66, 42); }
+.skin-2 .nav-list > li.pull_up:nth-child(5) > .arrow::after { border-right-color: rgb(72, 66, 42) !important; }
+.skin-2 .nav-list > li:nth-child(5) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(5) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(5) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(5) > .submenu li:hover > a { color: rgb(241, 209, 83); }
+.skin-2 .nav-list > li.active:nth-child(5)::before { background-color: rgb(227, 198, 87); }
+.skin-2 .nav-list > li.active.highlight:nth-child(5)::before, .skin-2 .nav-list > li:nth-child(5)::before { background-color: rgb(236, 217, 143); }
+.skin-2 .nav-list > li:nth-child(6) > a { color: rgb(255, 171, 0); }
+.skin-2 .nav-list > li.open:nth-child(6) > a, .skin-2 .nav-list > li.hover-show:nth-child(6) > a, .skin-2 .nav-list > li:nth-child(6):hover > a { background-color: rgb(223, 160, 32); }
+.skin-2 .nav-list > li:nth-child(6) > .submenu { background-color: rgb(73, 63, 42); }
+.skin-2 .nav-list > li:nth-child(6) li > .arrow::after, .skin-2 .nav-list > li:nth-child(6) > .arrow::after { border-right-color: rgb(73, 63, 42); }
+.skin-2 .nav-list > li.pull_up:nth-child(6) > .arrow::after { border-right-color: rgb(73, 63, 42) !important; }
+.skin-2 .nav-list > li:nth-child(6) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(6) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(6) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(6) > .submenu li:hover > a { color: rgb(242, 192, 90); }
+.skin-2 .nav-list > li.active:nth-child(6)::before { background-color: rgb(231, 184, 88); }
+.skin-2 .nav-list > li.active.highlight:nth-child(6)::before, .skin-2 .nav-list > li:nth-child(6)::before { background-color: rgb(239, 208, 143); }
+.skin-2 .nav-list > li:nth-child(7) > a { color: rgb(255, 110, 0); }
+.skin-2 .nav-list > li.open:nth-child(7) > a, .skin-2 .nav-list > li.hover-show:nth-child(7) > a, .skin-2 .nav-list > li:nth-child(7):hover > a { background-color: rgb(223, 114, 32); }
+.skin-2 .nav-list > li:nth-child(7) > .submenu { background-color: rgb(73, 55, 42); }
+.skin-2 .nav-list > li:nth-child(7) li > .arrow::after, .skin-2 .nav-list > li:nth-child(7) > .arrow::after { border-right-color: rgb(73, 55, 42); }
+.skin-2 .nav-list > li.pull_up:nth-child(7) > .arrow::after { border-right-color: rgb(73, 55, 42) !important; }
+.skin-2 .nav-list > li:nth-child(7) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(7) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(7) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(7) > .submenu li:hover > a { color: rgb(242, 155, 90); }
+.skin-2 .nav-list > li.active:nth-child(7)::before { background-color: rgb(231, 150, 88); }
+.skin-2 .nav-list > li.active.highlight:nth-child(7)::before, .skin-2 .nav-list > li:nth-child(7)::before { background-color: rgb(239, 185, 143); }
+.skin-2 .nav-list > li:nth-child(8) > a { color: rgb(242, 28, 48); }
+.skin-2 .nav-list > li.open:nth-child(8) > a, .skin-2 .nav-list > li.hover-show:nth-child(8) > a, .skin-2 .nav-list > li:nth-child(8):hover > a { background-color: rgb(212, 58, 72); }
+.skin-2 .nav-list > li:nth-child(8) > .submenu { background-color: rgb(71, 46, 48); }
+.skin-2 .nav-list > li:nth-child(8) li > .arrow::after, .skin-2 .nav-list > li:nth-child(8) > .arrow::after { border-right-color: rgb(71, 46, 48); }
+.skin-2 .nav-list > li.pull_up:nth-child(8) > .arrow::after { border-right-color: rgb(71, 46, 48) !important; }
+.skin-2 .nav-list > li:nth-child(8) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(8) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(8) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(8) > .submenu li:hover > a { color: rgb(234, 113, 124); }
+.skin-2 .nav-list > li.active:nth-child(8)::before { background-color: rgb(223, 107, 118); }
+.skin-2 .nav-list > li.active.highlight:nth-child(8)::before, .skin-2 .nav-list > li:nth-child(8)::before { background-color: rgb(234, 157, 164); }
+.skin-2 .nav-list > li:nth-child(9) > a { color: rgb(219, 52, 138); }
+.skin-2 .nav-list > li.open:nth-child(9) > a, .skin-2 .nav-list > li.hover-show:nth-child(9) > a, .skin-2 .nav-list > li:nth-child(9):hover > a { background-color: rgb(189, 82, 137); }
+.skin-2 .nav-list > li:nth-child(9) > .submenu { background-color: rgb(69, 48, 59); }
+.skin-2 .nav-list > li:nth-child(9) li > .arrow::after, .skin-2 .nav-list > li:nth-child(9) > .arrow::after { border-right-color: rgb(69, 48, 59); }
+.skin-2 .nav-list > li.pull_up:nth-child(9) > .arrow::after { border-right-color: rgb(69, 48, 59) !important; }
+.skin-2 .nav-list > li:nth-child(9) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(9) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(9) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(9) > .submenu li:hover > a { color: rgb(218, 129, 175); }
+.skin-2 .nav-list > li.active:nth-child(9)::before { background-color: rgb(206, 125, 167); }
+.skin-2 .nav-list > li.active.highlight:nth-child(9)::before, .skin-2 .nav-list > li:nth-child(9)::before { background-color: rgb(222, 168, 196); }
+.skin-2 .nav-list > li:nth-child(10) > a { color: rgb(197, 94, 231); }
+.skin-2 .nav-list > li.open:nth-child(10) > a, .skin-2 .nav-list > li.hover-show:nth-child(10) > a, .skin-2 .nav-list > li:nth-child(10):hover > a { background-color: rgb(185, 117, 208); }
+.skin-2 .nav-list > li:nth-child(10) > .submenu { background-color: rgb(66, 54, 70); }
+.skin-2 .nav-list > li:nth-child(10) li > .arrow::after, .skin-2 .nav-list > li:nth-child(10) > .arrow::after { border-right-color: rgb(66, 54, 70); }
+.skin-2 .nav-list > li.pull_up:nth-child(10) > .arrow::after { border-right-color: rgb(66, 54, 70) !important; }
+.skin-2 .nav-list > li:nth-child(10) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(10) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(10) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(10) > .submenu li:hover > a { color: rgb(217, 169, 233); }
+.skin-2 .nav-list > li.active:nth-child(10)::before { background-color: rgb(203, 152, 220); }
+.skin-2 .nav-list > li.active.highlight:nth-child(10)::before, .skin-2 .nav-list > li:nth-child(10)::before { background-color: rgb(220, 186, 231); }
+.skin-2 .nav-list > li:nth-child(11) > a { color: rgb(33, 139, 238); }
+.skin-2 .nav-list > li.open:nth-child(11) > a, .skin-2 .nav-list > li.hover-show:nth-child(11) > a, .skin-2 .nav-list > li:nth-child(11):hover > a { background-color: rgb(63, 138, 208); }
+.skin-2 .nav-list > li:nth-child(11) > .submenu { background-color: rgb(46, 59, 71); }
+.skin-2 .nav-list > li:nth-child(11) li > .arrow::after, .skin-2 .nav-list > li:nth-child(11) > .arrow::after { border-right-color: rgb(46, 59, 71); }
+.skin-2 .nav-list > li.pull_up:nth-child(11) > .arrow::after { border-right-color: rgb(46, 59, 71) !important; }
+.skin-2 .nav-list > li:nth-child(11) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(11) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(11) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(11) > .submenu li:hover > a { color: rgb(116, 176, 231); }
+.skin-2 .nav-list > li.active:nth-child(11)::before { background-color: rgb(111, 167, 220); }
+.skin-2 .nav-list > li.active.highlight:nth-child(11)::before, .skin-2 .nav-list > li:nth-child(11)::before { background-color: rgb(159, 196, 232); }
+.skin-2 .nav-list > li:nth-child(12) > a { color: rgb(46, 206, 231); }
+.skin-2 .nav-list > li.open:nth-child(12) > a, .skin-2 .nav-list > li.hover-show:nth-child(12) > a, .skin-2 .nav-list > li:nth-child(12):hover > a { background-color: rgb(75, 185, 202); }
+.skin-2 .nav-list > li:nth-child(12) > .submenu { background-color: rgb(48, 67, 70); }
+.skin-2 .nav-list > li:nth-child(12) li > .arrow::after, .skin-2 .nav-list > li:nth-child(12) > .arrow::after { border-right-color: rgb(48, 67, 70); }
+.skin-2 .nav-list > li.pull_up:nth-child(12) > .arrow::after { border-right-color: rgb(48, 67, 70) !important; }
+.skin-2 .nav-list > li:nth-child(12) > .submenu li.active > a, .skin-2 .nav-list > li:nth-child(12) > .submenu li.hover-show > a, .skin-2 .nav-list > li:nth-child(12) > .submenu li.open > a, .skin-2 .nav-list > li:nth-child(12) > .submenu li:hover > a { color: rgb(126, 214, 227); }
+.skin-2 .nav-list > li.active:nth-child(12)::before { background-color: rgb(120, 202, 215); }
+.skin-2 .nav-list > li.active.highlight:nth-child(12)::before, .skin-2 .nav-list > li:nth-child(12)::before { background-color: rgb(165, 220, 228); }
+@media only screen and (min-width: 992px) {
+ .skin-2 .nav-list > li > .submenu li > .submenu > li.hover > a { border-top-width: 1px; padding-bottom: 9px; }
+ .skin-2 .nav-list > li > .submenu li > .submenu > li.hover:first-child > a { border-top-width: 0px; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(1) > a { color: rgb(0, 190, 103); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(1) > .arrow::after { border-bottom-color: rgb(42, 65, 55); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(2) > a { color: rgb(94, 208, 43); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(2) > .arrow::after { border-bottom-color: rgb(54, 67, 47); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(3) > a { color: rgb(167, 215, 0); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(3) > .arrow::after { border-bottom-color: rgb(62, 68, 42); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(4) > a { color: rgb(206, 225, 0); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(4) > .arrow::after { border-bottom-color: rgb(67, 69, 42); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(5) > a { color: rgb(248, 198, 0); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(5) > .arrow::after { border-bottom-color: rgb(72, 66, 42); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(6) > a { color: rgb(255, 171, 0); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(6) > .arrow::after { border-bottom-color: rgb(73, 63, 42); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(7) > a { color: rgb(255, 110, 0); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(7) > .arrow::after { border-bottom-color: rgb(73, 55, 42); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(8) > a { color: rgb(242, 28, 48); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(8) > .arrow::after { border-bottom-color: rgb(71, 46, 48); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(9) > a { color: rgb(219, 52, 138); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(9) > .arrow::after { border-bottom-color: rgb(69, 48, 59); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(10) > a { color: rgb(197, 94, 231); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(10) > .arrow::after { border-bottom-color: rgb(66, 54, 70); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(11) > a { color: rgb(33, 139, 238); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(11) > .arrow::after { border-bottom-color: rgb(46, 59, 71); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(12) > a { color: rgb(46, 206, 231); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover:nth-child(12) > .arrow::after { border-bottom-color: rgb(48, 67, 70); }
+}
+.skin-2 .nav-list > li.highlight.active:nth-child(1) > a { background-color: rgb(24, 166, 101); }
+.skin-2 .nav-list > li.active.highlight:nth-child(1) > a::after { border-left-color: rgb(24, 166, 101); }
+.skin-2 .nav-list > li.highlight.active:nth-child(2) > a { background-color: rgb(106, 177, 74); }
+.skin-2 .nav-list > li.active.highlight:nth-child(2) > a::after { border-left-color: rgb(106, 177, 74); }
+.skin-2 .nav-list > li.highlight.active:nth-child(3) > a { background-color: rgb(152, 188, 27); }
+.skin-2 .nav-list > li.active.highlight:nth-child(3) > a::after { border-left-color: rgb(152, 188, 27); }
+.skin-2 .nav-list > li.highlight.active:nth-child(4) > a { background-color: rgb(183, 197, 28); }
+.skin-2 .nav-list > li.active.highlight:nth-child(4) > a::after { border-left-color: rgb(183, 197, 28); }
+.skin-2 .nav-list > li.highlight.active:nth-child(5) > a { background-color: rgb(217, 180, 31); }
+.skin-2 .nav-list > li.active.highlight:nth-child(5) > a::after { border-left-color: rgb(217, 180, 31); }
+.skin-2 .nav-list > li.highlight.active:nth-child(6) > a { background-color: rgb(223, 160, 32); }
+.skin-2 .nav-list > li.active.highlight:nth-child(6) > a::after { border-left-color: rgb(223, 160, 32); }
+.skin-2 .nav-list > li.highlight.active:nth-child(7) > a { background-color: rgb(223, 114, 32); }
+.skin-2 .nav-list > li.active.highlight:nth-child(7) > a::after { border-left-color: rgb(223, 114, 32); }
+.skin-2 .nav-list > li.highlight.active:nth-child(8) > a { background-color: rgb(212, 58, 72); }
+.skin-2 .nav-list > li.active.highlight:nth-child(8) > a::after { border-left-color: rgb(212, 58, 72); }
+.skin-2 .nav-list > li.highlight.active:nth-child(9) > a { background-color: rgb(189, 82, 137); }
+.skin-2 .nav-list > li.active.highlight:nth-child(9) > a::after { border-left-color: rgb(189, 82, 137); }
+.skin-2 .nav-list > li.highlight.active:nth-child(10) > a { background-color: rgb(185, 117, 208); }
+.skin-2 .nav-list > li.active.highlight:nth-child(10) > a::after { border-left-color: rgb(185, 117, 208); }
+.skin-2 .nav-list > li.highlight.active:nth-child(11) > a { background-color: rgb(63, 138, 208); }
+.skin-2 .nav-list > li.active.highlight:nth-child(11) > a::after { border-left-color: rgb(63, 138, 208); }
+.skin-2 .nav-list > li.highlight.active:nth-child(12) > a { background-color: rgb(75, 185, 202); }
+.skin-2 .nav-list > li.active.highlight:nth-child(12) > a::after { border-left-color: rgb(75, 185, 202); }
+.skin-2 .sidebar-shortcuts .btn { background-color: rgb(85, 85, 85) !important; border-radius: 32px; border-width: 2px; }
+.skin-2 .sidebar-shortcuts .btn:hover { background-color: rgb(34, 34, 34) !important; }
+.skin-2 .sidebar-shortcuts-mini .btn { border-radius: 32px; border-width: 2px; opacity: 1; padding: 6px; }
+.skin-2 .sidebar-shortcuts, .skin-2 .sidebar-shortcuts-mini, .skin-2 .sidebar > .nav-search { background-color: rgb(57, 57, 57); }
+.skin-2 .sidebar-toggle { background-color: rgb(47, 47, 47); border-color: rgb(118, 118, 118); }
+.skin-2 .sidebar-toggle::before { border-color: inherit; }
+.skin-2 .sidebar-toggle > .ace-icon { background-color: rgb(51, 51, 51); border-color: rgb(170, 170, 170); color: rgb(170, 170, 170); }
+.skin-2 .breadcrumbs { border-width: 0px; background-color: rgb(231, 242, 248); border-radius: 4px; margin: 8px 8px 0px; }
+@media (min-width: 992px) {
+ .skin-2 .breadcrumbs.breadcrumbs-fixed + .page-content { padding-top: 57px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .skin-2 .breadcrumbs.breadcrumbs-fixed + .page-content { padding-top: 54px; }
+ .skin-2 .menu-toggler + .sidebar.reponsive + .main-content .breadcrumbs.breadcrumbs-fixed + .page-content { padding-top: 49px; }
+ .skin-2 .container.main-container .breadcrumbs-fixed, .skin-2 .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed, .skin-2 .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 734px; }
+ .skin-2 .container.main-container .sidebar.responsive-min + .main-content .breadcrumbs-fixed { width: 691px; }
+}
+@media (min-width: 992px) {
+ .skin-2 .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed { width: 843px; }
+ .skin-2 .container.main-container .breadcrumbs-fixed { width: 964px; }
+ .skin-2 .container.main-container .sidebar + .main-content .breadcrumbs-fixed { width: 758px; }
+ .skin-2 .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 905px; }
+}
+@media (min-width: 1200px) {
+ .skin-2 .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed { width: 1043px; }
+ .skin-2 .container.main-container .breadcrumbs-fixed { width: 1148px; }
+ .skin-2 .container.main-container .sidebar + .main-content .breadcrumbs-fixed { width: 958px; }
+ .skin-2 .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 1105px; }
+}
+@media only screen and (max-width: 991px) {
+ .skin-2 .breadcrumbs { margin: 5px 5px 0px; }
+ .skin-2 .menu-toggler + .sidebar.responsive + .main-content .breadcrumbs { margin: 0px; border-radius: 0px; }
+ .skin-2 .sidebar { border-width: 0px; box-shadow: none; }
+ .skin-2 .nav-list li.active > a::after { display: none; }
+}
+.skin-2 .sidebar.menu-min .nav-list > li.open > a { color: rgb(230, 230, 230); }
+.skin-2 .sidebar.menu-min .nav-list > li.active > a { color: rgb(255, 255, 255); }
+.skin-2 .sidebar.menu-min .nav-list > li.active > a::after { border-width: 9px 6px; top: 10px; }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > a::after { border-width: 20px 0px 20px 10px; top: 0px; }
+.skin-2 .sidebar.menu-min .nav-list > li > a > .menu-text { background-color: inherit; font-weight: 700; color: rgba(0, 0, 0, 0.6); border-width: 0px 0px 0px 1px; border-style: solid; border-color: rgba(0, 0, 0, 0.4); box-shadow: none; margin-left: 1px; }
+.skin-2 .sidebar.menu-min .nav-list > li.active > a > .menu-text { background-color: inherit; color: rgb(255, 255, 255); }
+.skin-2 .sidebar.menu-min .nav-list > li > .submenu { border-style: solid; border-width: 1px 0px 0px 1px; border-color: rgba(0, 0, 0, 0.3); box-shadow: none; margin-left: 1px; }
+.skin-2 .sidebar.menu-min .nav-list > li > .submenu::after { display: none; }
+.skin-2 .sidebar.menu-min .nav-list > li.active > .submenu { border-top-color: rgba(0, 0, 0, 0.5); }
+.skin-2 .sidebar.menu-min .sidebar-shortcuts-large { background-color: rgb(57, 57, 57); box-shadow: none; border-style: solid; border-color: rgb(102, 102, 102); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 1px 0px; top: 0px; }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: rgb(189, 82, 137); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > .arrow::before, .skin-2 .sidebar.menu-min .nav-list > li > .arrow::before { border-right-color: rgba(0, 0, 0, 0.7); }
+.skin-2 .sidebar.menu-min .nav-list > li.active:not(.highlight) > a:not(.dropdown-toggle) > .menu-text { border-width: 1px; border-top-color: rgb(85, 85, 85); border-bottom-color: rgb(85, 85, 85); border-right-color: rgb(85, 85, 85); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight > a > .menu-text, .skin-2 .sidebar.menu-min .nav-list > li > a > .menu-text { border-left-color: rgba(0, 0, 0, 0.5); }
+.skin-2 .sidebar.menu-min .nav-list > li.pull_up.active.highlight > a > .menu-text, .skin-2 .sidebar.menu-min .nav-list > li.pull_up > a > .menu-text { border-left-color: rgba(0, 0, 0, 0.7); }
+.skin-2 .sidebar.menu-min .nav-list > li.pull_up.active:not(.highlight) > a > .menu-text { border-left-color: rgb(102, 102, 102); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(1) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(1) > .arrow::after { border-right-color: rgb(24, 166, 101); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(2) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(2) > .arrow::after { border-right-color: rgb(106, 177, 74); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(3) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(3) > .arrow::after { border-right-color: rgb(152, 188, 27); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(4) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(4) > .arrow::after { border-right-color: rgb(183, 197, 28); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(5) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(5) > .arrow::after { border-right-color: rgb(217, 180, 31); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(6) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(6) > .arrow::after { border-right-color: rgb(223, 160, 32); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(7) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(7) > .arrow::after { border-right-color: rgb(223, 114, 32); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(8) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(8) > .arrow::after { border-right-color: rgb(212, 58, 72); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(9) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(9) > .arrow::after { border-right-color: rgb(189, 82, 137); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(10) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(10) > .arrow::after { border-right-color: rgb(185, 117, 208); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(11) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(11) > .arrow::after { border-right-color: rgb(63, 138, 208); }
+.skin-2 .sidebar.menu-min .nav-list > li.active.highlight:nth-child(12) > .arrow::after, .skin-2 .sidebar.menu-min .nav-list > li:nth-child(12) > .arrow::after { border-right-color: rgb(75, 185, 202); }
+.skin-2 .sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(119, 119, 119); }
+.skin-2 .sidebar.menu-min .nav-list > li.active > .arrow::after { border-right-color: rgb(36, 36, 36); }
+.skin-2 .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: rgb(136, 136, 136); }
+@media (max-width: 991px) {
+ .skin-2 .sidebar.responsive .nav-list > li.active > a::after { display: none; }
+ .skin-2 .sidebar.responsive .nav-list > li.active.highlight > a::after { display: block; }
+ .skin-2 .sidebar.responsive-min .nav-list > li.open > a { color: rgb(230, 230, 230); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > a { color: rgb(255, 255, 255); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > a::after { border-width: 9px 6px; top: 10px; }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > a::after { border-width: 20px 0px 20px 10px; top: 0px; }
+ .skin-2 .sidebar.responsive-min .nav-list > li > a > .menu-text { background-color: inherit; font-weight: 700; color: rgba(0, 0, 0, 0.6); border-width: 0px 0px 0px 1px; border-style: solid; border-color: rgba(0, 0, 0, 0.4); box-shadow: none; margin-left: 1px; }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > a > .menu-text { background-color: inherit; color: rgb(255, 255, 255); }
+ .skin-2 .sidebar.responsive-min .nav-list > li > .submenu { border-style: solid; border-width: 1px 0px 0px 1px; border-color: rgba(0, 0, 0, 0.3); box-shadow: none; margin-left: 1px; }
+ .skin-2 .sidebar.responsive-min .nav-list > li > .submenu::after { display: none; }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > .submenu { border-top-color: rgba(0, 0, 0, 0.5); }
+ .skin-2 .sidebar.responsive-min .sidebar-shortcuts-large { background-color: rgb(57, 57, 57); box-shadow: none; border-style: solid; border-color: rgb(102, 102, 102); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 1px 0px; top: 0px; }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: rgb(189, 82, 137); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > .arrow::before, .skin-2 .sidebar.responsive-min .nav-list > li > .arrow::before { border-right-color: rgba(0, 0, 0, 0.7); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active:not(.highlight) > a:not(.dropdown-toggle) > .menu-text { border-width: 1px; border-top-color: rgb(85, 85, 85); border-bottom-color: rgb(85, 85, 85); border-right-color: rgb(85, 85, 85); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight > a > .menu-text, .skin-2 .sidebar.responsive-min .nav-list > li > a > .menu-text { border-left-color: rgba(0, 0, 0, 0.5); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.pull_up.active.highlight > a > .menu-text, .skin-2 .sidebar.responsive-min .nav-list > li.pull_up > a > .menu-text { border-left-color: rgba(0, 0, 0, 0.7); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.pull_up.active:not(.highlight) > a > .menu-text { border-left-color: rgb(102, 102, 102); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(1) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(1) > .arrow::after { border-right-color: rgb(24, 166, 101); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(2) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(2) > .arrow::after { border-right-color: rgb(106, 177, 74); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(3) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(3) > .arrow::after { border-right-color: rgb(152, 188, 27); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(4) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(4) > .arrow::after { border-right-color: rgb(183, 197, 28); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(5) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(5) > .arrow::after { border-right-color: rgb(217, 180, 31); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(6) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(6) > .arrow::after { border-right-color: rgb(223, 160, 32); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(7) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(7) > .arrow::after { border-right-color: rgb(223, 114, 32); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(8) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(8) > .arrow::after { border-right-color: rgb(212, 58, 72); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(9) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(9) > .arrow::after { border-right-color: rgb(189, 82, 137); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(10) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(10) > .arrow::after { border-right-color: rgb(185, 117, 208); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(11) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(11) > .arrow::after { border-right-color: rgb(63, 138, 208); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active.highlight:nth-child(12) > .arrow::after, .skin-2 .sidebar.responsive-min .nav-list > li:nth-child(12) > .arrow::after { border-right-color: rgb(75, 185, 202); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(119, 119, 119); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > .arrow::after { border-right-color: rgb(36, 36, 36); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: rgb(136, 136, 136); }
+ .skin-2 .sidebar.responsive-min .nav-list > li.active > a::after { display: block; }
+}
+@media only screen and (min-width: 992px) {
+ .skin-2 .nav-list li.hover > .submenu { padding-left: 0px; padding-right: 0px; border: 1px solid rgba(0, 0, 0, 0.4); }
+ .skin-2 .nav-list li.hover > .submenu > li > a { margin-bottom: 0px; margin-top: 0px; }
+ .skin-2 .nav-list li.hover > .submenu > li:first-child > a { border-top-width: 0px; }
+ .skin-2 .nav-list li .submenu > li.hover.active > a { background-color: rgba(0, 0, 0, 0.05); }
+ .skin-2 .nav-list > li > .submenu li.hover > .submenu { padding: 2px; }
+ .skin-2 .nav-list > li > .submenu li > .submenu > li.hover > a { border-top-color: rgba(255, 255, 255, 0.08); }
+ .skin-2 .menu-min .nav-list > li.active.hover-show > a::after, .skin-2 .menu-min .nav-list > li.active:hover > a::after, .skin-2 .nav-list > li.active.hover.hover-show > a.dropdown-toggle::after, .skin-2 .nav-list > li.active.hover:hover > a.dropdown-toggle::after { display: none; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li.open.hover:not(:hover):not(:focus):not(.active) > a { background-color: rgb(57, 57, 57); font-weight: 400; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li.open.hover:not(:hover):not(:focus):not(.active) > a > .arrow, .skin-2 .sidebar.navbar-collapse .nav-list > li.open.hover:not(:hover):not(:focus):not(.active) > a > .menu-icon, .skin-2 .sidebar.navbar-collapse .nav-list > li.open.hover:not(:hover):not(:focus):not(.active) > a > .menu-text { color: inherit; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li.open.hover:not(:hover):not(:focus):not(.active) > a { color: rgb(238, 238, 238); }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu > li.open.hover:not(:hover):not(:focus):not(.active) > a > .menu-icon { display: none; }
+ .skin-2 .sidebar:not(.navbar-collapse) .nav-list > li .submenu > li.hover.hover-show > a, .skin-2 .sidebar:not(.navbar-collapse) .nav-list > li .submenu > li.hover:hover > a { background-color: rgba(0, 0, 0, 0.1); }
+ .skin-2 .sidebar:not(.navbar-collapse) .nav-list > li.active .submenu > li.hover.hover-show > a, .skin-2 .sidebar:not(.navbar-collapse) .nav-list > li.active .submenu > li.hover:hover > a { background-color: rgba(0, 0, 0, 0.1); }
+}
+@media only screen and (max-width: 991px) {
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu::before, .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu > li::before, .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu > li > .submenu::before { display: none; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li::before { height: 41px !important; top: 0px; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li > a { margin-left: 0px; padding-left: 42px; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: 0px; padding-left: 58px; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li.active.highlight > a > .menu-text, .skin-2 .sidebar.navbar-collapse .nav-list > li > a > .menu-text { border-width: 0px; }
+}
+@media only screen and (min-width: 992px) and (max-width: 991px) {
+ .skin-2 .sidebar.navbar-collapse .nav-list > li.hover > .submenu { padding-bottom: 0px; }
+ .skin-2 .sidebar.navbar-collapse .nav-list li.hover > .submenu { border-width: 0px; }
+ .skin-2 .sidebar.navbar-collapse .nav-list li li.hover.hover-show > a, .skin-2 .sidebar.navbar-collapse .nav-list li li.hover:hover > a { background-color: transparent; }
+ .skin-2 .sidebar.navbar-collapse .nav-list li li.hover > a:hover { background-color: rgba(0, 0, 0, 0.1); }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu > li.active.hover.hover-show > a, .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu > li.active.hover:hover > a { background-color: rgba(0, 0, 0, 0.05); }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu > li.active.hover > a:hover { background-color: rgba(0, 0, 0, 0.1); }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu { padding: 0px; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a { margin-left: 0px !important; padding-left: 37px !important; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: 0px !important; padding-left: 51px !important; }
+ .skin-2 .sidebar.navbar-collapse .nav-list li.hover > .submenu li > a { padding-left: 32px !important; }
+ .skin-2 .sidebar.navbar-collapse .nav-list li.hover > .submenu li > a > .menu-icon { background-color: transparent; }
+ .skin-2 .sidebar.navbar-collapse .nav-list li.hover > .submenu > li.active > a { background-color: transparent; font-weight: 400; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li.hover > .submenu > li.active > a { background-color: rgba(0, 0, 0, 0.05); font-weight: 700; }
+ .skin-2 .sidebar.navbar-collapse .nav-list li.hover > .submenu > li.active > a:hover, .skin-2 .sidebar.navbar-collapse .nav-list > li .submenu > li.hover.hover-show > a, .skin-2 .sidebar.navbar-collapse .nav-list > li .submenu > li.hover:hover > a, .skin-2 .sidebar.navbar-collapse .nav-list > li.active .submenu > li.hover.hover-show > a, .skin-2 .sidebar.navbar-collapse .nav-list > li.active .submenu > li.hover:hover > a { background-color: rgba(0, 0, 0, 0.1); }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li.hover > a { border-top-width: 0px; }
+ .skin-2 .sidebar.navbar-collapse .nav-list > li .submenu > li.hover > a > .menu-icon { left: 12px; }
+ .skin-2 .sidebar.navbar-collapse.menu-min .nav-list li.hover > .submenu li > a { padding-left: 32px; }
+}
+@media only screen and (max-width: 991px) {
+ .skin-2 .sidebar.navbar-collapse.menu-min .sidebar-shortcuts-large { border-width: 0px; }
+ .skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li > a > .menu-text { font-weight: 400; color: rgb(230, 230, 230); margin-left: 0px; }
+ .skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li:hover > a > .menu-text { font-weight: 700; color: rgba(0, 0, 0, 0.6); }
+ .skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li.active > a > .menu-text { font-weight: 700; color: rgb(255, 255, 255); }
+ .skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu { margin-left: 0px; border-top-width: 0px; }
+ .skin-2 .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > a > .menu-icon { left: 12px; }
+}
+@media (min-width: 992px) {
+ .skin-2 .sidebar.compact .nav-list > li::before { height: auto; bottom: 0px; }
+}
+.skin-2 .main-container .menu-toggler { background-color: rgb(214, 133, 176); }
+.skin-2 .main-container .menu-toggler::after, .skin-2 .main-container .menu-toggler::before { border-top-color: rgb(255, 255, 255); border-bottom-color: rgb(255, 255, 255); }
+.skin-2 .main-container .menu-toggler > .toggler-text { border-top-color: rgb(214, 133, 176); }
+.skin-2 .navbar .navbar-toggle { background-color: rgb(219, 120, 161); }
+.skin-2 .navbar .navbar-toggle:focus { background-color: rgb(219, 120, 161); border-color: transparent; }
+.skin-2 .navbar .navbar-toggle:hover { background-color: rgb(215, 104, 150); border-color: rgba(255, 255, 255, 0.1); }
+.skin-2 .navbar .navbar-toggle.display, .skin-2 .navbar .navbar-toggle[data-toggle="collapse"]:not(.collapsed) { background-color: rgb(210, 88, 139); box-shadow: 1px 1px 2px 0px rgba(0, 0, 0, 0.25) inset; border-color: rgba(255, 255, 255, 0.35); }
+@media only screen and (min-width: 768px) {
+ .skin-2 .container.main-container::before { box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.1); }
+}
+@media only screen and (min-width: 992px) {
+ .skin-2 .sidebar.h-sidebar { background-color: rgb(57, 57, 57); }
+ .skin-2 .sidebar.h-sidebar::before { background-color: rgb(118, 118, 118); border-bottom-color: rgb(123, 123, 123); }
+ .skin-2 .sidebar.h-sidebar .nav-list { border-bottom-width: 0px; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li > a > .menu-text { color: rgb(230, 230, 230); font-weight: 400; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover-show > a > .menu-text, .skin-2 .sidebar.h-sidebar .nav-list > li:hover > a > .menu-text { color: rgb(255, 255, 255); font-weight: 400; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.active > a > .menu-text { font-weight: 700; color: rgb(255, 255, 255); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li::before { left: 0px; right: 0px; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover > .submenu { margin-left: -1px; border-width: 1px; border-top-color: rgba(0, 0, 0, 0.4); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li .submenu > li.hover > a { padding-left: 22px; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li .submenu > li.hover > a > .menu-icon { left: 4px; }
+ .skin-2 .sidebar.h-sidebar.compact .nav-list > li.active::before { height: 2px; bottom: auto; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.highlight.active > a::after { display: none; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover.active > a::after { display: block; border-color: transparent transparent rgb(255, 255, 255); border-width: 8px; top: auto; bottom: 0px; right: auto; left: 50%; margin-left: -8px; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover.active.hover-show > a::after, .skin-2 .sidebar.h-sidebar .nav-list > li.hover.active:hover > a::after { display: none; }
+ .skin-2 .sidebar.h-sidebar .sidebar-shortcuts-large { background-color: rgb(80, 80, 80); border-width: 1px 0px 0px !important; border-top-style: solid; border-top-color: rgb(119, 119, 119); top: 100%; }
+ .skin-2 .sidebar.h-sidebar .sidebar-shortcuts-mini { padding-top: 2px; }
+ .skin-2 .sidebar.h-sidebar .sidebar-shortcuts-mini > .btn { padding: 7px; }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.active.highlight > .arrow::after { border-right-color: transparent; border-bottom-color: rgb(189, 82, 137); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.active.highlight > .arrow::before { border-right-color: transparent; border-bottom-color: rgb(25, 25, 25); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover > .arrow::after { border-right-color: transparent; border-bottom-color: rgb(69, 48, 59); }
+ .skin-2 .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { border-right-color: transparent; border-bottom-color: rgb(25, 25, 25); }
+ .skin-2 .sidebar.h-sidebar .sidebar-shortcuts-large::after { border-bottom-color: rgb(80, 80, 80); }
+ .skin-2 .sidebar.h-sidebar .sidebar-shortcuts-large::before { border-bottom-color: rgb(153, 153, 153); }
+ .skin-2 .sidebar.h-sidebar.menu-min .sidebar-shortcuts-mini { padding-top: 3px; }
+ .skin-2 .sidebar.h-sidebar.menu-min .sidebar-shortcuts-mini > .btn { padding: 6px; }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li > a > .menu-text { border-width: 1px 0px 0px; border-top-color: rgba(0, 0, 0, 0.5); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight > .arrow::before, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li > .arrow::before { border-bottom-color: rgba(0, 0, 0, 0.7); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(1) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(1) > .arrow::after { border-bottom-color: rgb(24, 166, 101); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(2) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(2) > .arrow::after { border-bottom-color: rgb(106, 177, 74); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(3) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(3) > .arrow::after { border-bottom-color: rgb(152, 188, 27); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(4) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(4) > .arrow::after { border-bottom-color: rgb(183, 197, 28); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(5) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(5) > .arrow::after { border-bottom-color: rgb(217, 180, 31); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(6) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(6) > .arrow::after { border-bottom-color: rgb(223, 160, 32); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(7) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(7) > .arrow::after { border-bottom-color: rgb(223, 114, 32); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(8) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(8) > .arrow::after { border-bottom-color: rgb(212, 58, 72); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(9) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(9) > .arrow::after { border-bottom-color: rgb(189, 82, 137); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(10) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(10) > .arrow::after { border-bottom-color: rgb(185, 117, 208); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(11) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(11) > .arrow::after { border-bottom-color: rgb(63, 138, 208); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight:nth-child(12) > .arrow::after, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li:nth-child(12) > .arrow::after { border-bottom-color: rgb(75, 185, 202); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active > .arrow::after { border-bottom-color: rgb(36, 36, 36); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active > .arrow::before { border-bottom-color: rgb(136, 136, 136); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active.highlight > a > .menu-text, .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li > a > .menu-text { border-top-color: rgba(0, 0, 0, 0.5); }
+ .skin-2 .sidebar.h-sidebar.menu-min .nav-list > li.active > a > .menu-text { border-top-color: rgb(119, 119, 119); }
+ .skin-2 .sidebar.h-sidebar + .main-content .breadcrumbs { border-color: rgb(213, 231, 241); top: 2px; }
+ .skin-2 .h-sidebar.sidebar-fixed + .main-content { padding-top: 86px; }
+ .skin-2 .h-sidebar.sidebar-fixed.no-gap + .main-content { padding-top: 72px; }
+ .skin-2 .h-sidebar.sidebar-fixed.menu-min + .main-content { padding-top: 61px; }
+ .skin-2 .h-sidebar.sidebar-fixed.menu-min.no-gap + .main-content { padding-top: 47px; }
+ .skin-2 .main-content .h-sidebar.sidebar .nav-list { border-left: 1px solid rgb(87, 87, 87); }
+}
+.skin-2 .sidebar-scroll .sidebar-shortcuts { border-bottom-color: rgb(85, 85, 85); }
+.skin-2 .sidebar-scroll .sidebar-toggle { border-top-color: rgb(85, 85, 85); }
+.skin-3 .nav-list > li.open + li, .skin-3 .nav-list > li:hover + li { border-top-color: rgb(149, 186, 210) !important; }
+.skin-2 .scrollout .scroll-track { background-color: transparent; }
+.skin-2 .scrollout .scroll-bar { background-color: rgba(0, 0, 0, 0.2); }
+@media only screen and (min-width: 768px) and (max-width: 991px) {
+ .skin-2 .navbar.navbar-collapse { background-color: transparent; }
+ .skin-2 .navbar.navbar-collapse .navbar-container, .skin-2 .navbar.navbar-collapse::before { background: rgb(198, 72, 126) none repeat scroll 0% 0%; }
+}
+.skin-2 .nav-list > li.disabled::before { display: none !important; }
+.skin-2 .nav-list > li.disabled > a, .skin-2 .nav-list > li > a.disabled { background-color: rgb(85, 85, 85) !important; color: rgb(204, 204, 204) !important; }
+.skin-2 .nav-list > li.disabled > a > .menu-text, .skin-2 .nav-list > li > a.disabled > .menu-text { color: rgb(204, 204, 204) !important; }
+.skin-2 .nav-list > li.disabled > a .badge, .skin-2 .nav-list > li.disabled > a .label, .skin-2 .nav-list > li > a.disabled .badge, .skin-2 .nav-list > li > a.disabled .label { background-color: rgba(0, 0, 0, 0.5) !important; }
+.skin-2 .nav-list > li.active.highlight.disabled > a::after, .skin-2 .nav-list > li.active.highlight > a.disabled::after { border-left-color: rgb(85, 85, 85) !important; }
+.skin-2 .nav-list li .submenu > li.disabled > a, .skin-2 .nav-list li .submenu > li > a.disabled, .skin-2 .nav-list li.disabled .submenu > li > a, .skin-2 .nav-list li > a.disabled + .submenu > li > a { background-color: rgb(102, 102, 102) !important; color: rgb(221, 221, 221) !important; cursor: not-allowed !important; }
+.skin-2 .nav-list li .submenu > li.disabled > a > .menu-icon, .skin-2 .nav-list li .submenu > li > a.disabled > .menu-icon, .skin-2 .nav-list li.disabled .submenu > li > a > .menu-icon, .skin-2 .nav-list li > a.disabled + .submenu > li > a > .menu-icon { display: none; }
+.skin-3 { background-color: rgb(187, 187, 187); }
+.skin-3 .main-container::before { background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb(238, 245, 250) 0px, rgb(255, 255, 255) 8%) repeat scroll 0px 4px / 100% 26px; }
+@media (min-width: 768px) {
+ .skin-2 .container.main-container .sidebar.h-sidebar + .main-content .breadcrumbs-fixed { width: auto; }
+ .skin-3 .main-container.container::before { box-shadow: 0px 0px 0px 1px rgba(50, 100, 200, 0.1); }
+}
+.skin-3 .navbar { background: rgb(64, 64, 64) none repeat scroll 0% 0%; }
+.skin-3 .sidebar { background-color: rgb(219, 219, 219); border-style: solid; border-width: 0px 1px 0px 0px; border-color: rgb(164, 198, 221); }
+.skin-3 .nav-list > li { border-color: rgb(242, 242, 242); }
+.skin-3 .nav-list > li.open, .skin-3 .nav-list > li:hover { border-color: rgb(149, 186, 210) !important; }
+.skin-3 .nav-list > li > a { background-color: rgb(227, 227, 227); color: rgb(90, 90, 90); }
+.skin-3 .nav-list > li > a > .arrow { color: inherit; }
+.skin-3 .nav-list > li > a:focus { background-color: rgb(232, 232, 232); color: rgb(90, 90, 90); }
+.skin-3 .nav-list > li.active, .skin-3 .nav-list > li.active + li { border-color: rgb(164, 198, 221) !important; }
+.skin-3 .nav-list > li.active + li:last-child { border-bottom-color: rgb(242, 242, 242) !important; }
+.skin-3 .nav-list > li.active + li:last-child:hover { border-bottom-color: rgb(149, 186, 210) !important; }
+.skin-3 .nav-list > li:hover > a { background-color: rgb(255, 255, 255); color: rgb(51, 125, 187); }
+.skin-3 .nav-list > li.open:hover > a, .skin-3 .nav-list > li.open > a { color: rgb(51, 125, 187); background-color: rgb(248, 248, 248); }
+.skin-3 .nav-list > li.open > a > .arrow { color: inherit; }
+.skin-3 .nav-list > li.active.highlight > a, .skin-3 .nav-list > li.active > a { background-color: rgb(243, 250, 255) !important; color: rgb(77, 150, 203) !important; }
+.skin-3 .nav-list > li.open::before, .skin-3 .nav-list > li:hover::before { display: block; background-color: rgb(79, 138, 180) !important; }
+.skin-3 .nav-list > li.active::before { display: block; background-color: rgb(77, 150, 203) !important; }
+.skin-3 .page-content { background-color: transparent; }
+.skin-3 .infobox-container .infobox:not(.infobox-dark) { border-style: solid; background-color: transparent; }
+.skin-3 .nav-list > li.active::after { display: none; }
+.skin-3 .nav-list li.active > a::after { border-right-color: rgb(255, 255, 255); border-width: 12px 8px; top: 7px; right: -1px; }
+.skin-3 .nav-list li.active > a::before { display: block; content: ""; position: absolute; background-color: transparent; border-style: solid; border-color: transparent rgb(145, 186, 214) transparent transparent; right: 0px; border-width: 12px 8px; top: 7px; }
+.skin-3 .nav-list > li.active > .submenu li.active > a::after, .skin-3 .nav-list > li.active > .submenu li.active > a::before { top: 4px; }
+.skin-3 .nav-list li.active.open > a::before { display: none; }
+.skin-3 .nav-list li.highlight.active.open > a::before { display: block; }
+.skin-3 .nav-list li.active:not(.open) li.active > a::before { display: none !important; }
+.skin-3 .nav-list > li.highlight.active > a::after { border-left-color: rgb(243, 250, 255); }
+.skin-3 .nav-list > li.highlight.active > a::before { border-left-color: rgb(145, 186, 214); }
+.skin-3 .nav-list li > .arrow::before { border-right-color: rgb(127, 175, 207); }
+.skin-3 .nav-list > li .submenu > li.active:not(.open) > a { background-color: rgb(245, 247, 250); }
+.skin-3 .nav-list > li .submenu > li.active:not(.open) > a:hover { background-color: rgb(241, 245, 249); }
+@media only screen and (max-width: 991px) {
+ .skin-3 .sidebar.responsive .nav-list > li.active.open > a::after { display: none; }
+}
+@media only screen and (min-width: 992px) {
+ .skin-3 .nav-list li.hover > .submenu { border-color: rgb(153, 191, 217); }
+ .skin-3 .nav-list li.hover.active > a::before { display: block; }
+ .skin-3 .nav-list li.hover .submenu > li.active > a::before { display: none; }
+}
+.skin-3 .sidebar.menu-min .nav-list > li > a > .menu-text { background-color: rgb(241, 245, 249); border-color: rgb(164, 198, 221); }
+.skin-3 .sidebar.menu-min .nav-list > li.active > a > .menu-text { background-color: rgb(237, 243, 247); }
+.skin-3 .sidebar.menu-min .nav-list > li > .submenu { border-color: rgb(201, 218, 229) rgb(164, 198, 221) rgb(164, 198, 221); }
+.skin-3 .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: rgb(112, 159, 191); }
+.skin-3 .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: rgb(237, 243, 247); }
+.skin-3 .sidebar.menu-min .nav-list li.active > a::after, .skin-3 .sidebar.menu-min .nav-list li.active > a::before { display: none; }
+.skin-3 .sidebar.menu-min .nav-list > li.active > a::after, .skin-3 .sidebar.menu-min .nav-list > li.active > a::before { display: block; border-width: 9px 7px; top: 10px; }
+.skin-3 .sidebar.menu-min .nav-list > li.active.highlight > a::after, .skin-3 .sidebar.menu-min .nav-list > li.active.highlight > a::before { border-width: 20px 0px 21px 10px; top: -1px; }
+.skin-3 .sidebar.menu-min .nav-list > li.active.hover-show > a::after, .skin-3 .sidebar.menu-min .nav-list > li.active.hover-show > a::before, .skin-3 .sidebar.menu-min .nav-list > li.active:hover > a::after, .skin-3 .sidebar.menu-min .nav-list > li.active:hover > a::before { display: none; }
+.skin-3 .sidebar.menu-min .sidebar-shortcuts-large { background-color: rgb(245, 245, 245); }
+@media only screen and (max-width: 991px) {
+ .skin-3 .sidebar.menu-min.responsive .nav-list > li.active > a::after, .skin-3 .sidebar.menu-min.responsive .nav-list > li.active > a::before { display: none; }
+ .skin-3 .sidebar.responsive { border-bottom-width: 1px !important; }
+ .skin-3 .sidebar.responsive .nav-list > li.active.open > a::after { display: none; }
+ .skin-3 .sidebar.responsive .nav-list > li.active.highlight > a::after, .skin-3 .sidebar.responsive .nav-list > li.active.highlight > a::before { display: block; }
+ .skin-3 .nav-list li.active > a::after, .skin-3 .nav-list li.active > a::before, .skin-3 .sidebar.responsive-min .nav-list li.active > a::after, .skin-3 .sidebar.responsive-min .nav-list li.active > a::before { display: none; }
+ .skin-3 .sidebar.navbar-collapse { border-bottom-color: rgb(164, 198, 221); }
+ .skin-3 .sidebar.responsive-min .nav-list > li > a > .menu-text { background-color: rgb(241, 245, 249); border-color: rgb(164, 198, 221); }
+ .skin-3 .sidebar.responsive-min .nav-list > li.active > a > .menu-text { background-color: rgb(237, 243, 247); }
+ .skin-3 .sidebar.responsive-min .nav-list > li > .submenu { border-color: rgb(201, 218, 229) rgb(164, 198, 221) rgb(164, 198, 221); }
+ .skin-3 .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: rgb(112, 159, 191); }
+ .skin-3 .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: rgb(237, 243, 247); }
+ .skin-3 .sidebar.responsive-min .nav-list > li.active > a::after, .skin-3 .sidebar.responsive-min .nav-list > li.active > a::before { display: block; border-width: 9px 7px; top: 10px; }
+ .skin-3 .sidebar.responsive-max .nav-list li.hover.active > a::before, .skin-3 .sidebar.responsive-max .nav-list > li.active.open > a::after, .skin-3 .sidebar.responsive-min .nav-list > li.active.hover-show > a::after, .skin-3 .sidebar.responsive-min .nav-list > li.active.hover-show > a::before, .skin-3 .sidebar.responsive-min .nav-list > li.active:hover > a::after, .skin-3 .sidebar.responsive-min .nav-list > li.active:hover > a::before { display: none; }
+ .skin-3 .sidebar.responsive-min .nav-list > li.active.highlight > a::after, .skin-3 .sidebar.responsive-min .nav-list > li.active.highlight > a::before { border-width: 20px 0px 21px 10px; top: -1px; }
+ .skin-3 .sidebar.responsive-min .sidebar-shortcuts-large { background-color: rgb(245, 245, 245); }
+ .skin-3 .sidebar.responsive-max { border-width: 0px 1px 1px 0px; }
+ .skin-3 .sidebar.responsive-max .nav-list > li.active.highlight > a::after, .skin-3 .sidebar.responsive-max .nav-list > li.active.highlight > a::before { display: block; }
+ .skin-3 .sidebar.navbar-collapse .sidebar-shortcuts-large { background-color: transparent; }
+ .skin-3 .sidebar.navbar-collapse .nav-list > li::before { height: 43px !important; }
+ .skin-3 .sidebar.navbar-collapse .sidebar-shortcuts { padding: 0px 0px 3px !important; }
+}
+.skin-3 .sidebar-shortcuts, .skin-3 .sidebar-shortcuts-mini, .skin-3 .sidebar > .nav-search { background-color: rgb(219, 219, 219); }
+.skin-3 .sidebar-toggle { background-color: rgb(208, 208, 208); border-color: rgb(242, 242, 242); }
+.skin-3 .sidebar-toggle::before { border-color: rgb(242, 242, 242); }
+.skin-3 .sidebar-toggle > .ace-icon { background-color: rgb(255, 255, 255); border-color: rgb(153, 153, 153); color: rgb(153, 153, 153); }
+.skin-3 .sidebar-scroll .nav-wrap-up + .sidebar-toggle::after { display: block; content: ""; position: absolute; top: 0px; bottom: 0px; right: -1px; border-right: 1px solid rgb(164, 198, 221); }
+.skin-3 .main-container .menu-toggler { background-color: rgb(98, 168, 209); color: rgb(255, 255, 255); }
+.skin-3 .navbar .navbar-toggle, .skin-3 .navbar .navbar-toggle:focus { background-color: rgb(100, 140, 174); border-color: rgba(255, 255, 255, 0.15); }
+.skin-3 .main-container .menu-toggler::after, .skin-3 .main-container .menu-toggler::before { border-color: rgb(255, 255, 255); }
+.skin-3 .main-container .menu-toggler > .toggler-text { border-top-color: rgb(98, 168, 209); }
+.skin-3 .main-container .menu-toggler > .toggler-text::after { color: rgb(255, 255, 255); }
+.skin-3 .navbar .navbar-toggle { transition: background-color 0.1s ease 0s; }
+.skin-3 .navbar .navbar-toggle:hover { background-color: rgb(87, 130, 167); border-color: rgba(255, 255, 255, 0.15); }
+.skin-3 .navbar .navbar-toggle.display, .skin-3 .navbar .navbar-toggle[data-toggle="collapse"]:not(.collapsed) { background-color: rgb(80, 120, 153); border-color: rgba(255, 255, 255, 0.3); }
+.skin-3 .breadcrumbs { border-width: 0px; background-color: rgb(231, 242, 248); border-radius: 4px; margin: 8px 8px 0px; }
+@media (min-width: 992px) {
+ .skin-3 .breadcrumbs.breadcrumbs-fixed + .page-content { padding-top: 57px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .skin-3 .breadcrumbs.breadcrumbs-fixed + .page-content { padding-top: 54px; }
+ .skin-3 .menu-toggler + .sidebar.reponsive + .main-content .breadcrumbs.breadcrumbs-fixed + .page-content { padding-top: 49px; }
+ .skin-3 .container.main-container .breadcrumbs-fixed, .skin-3 .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed, .skin-3 .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 734px; }
+ .skin-3 .container.main-container .sidebar.responsive-min + .main-content .breadcrumbs-fixed { width: 691px; }
+}
+@media (min-width: 992px) {
+ .skin-3 .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed { width: 843px; }
+ .skin-3 .container.main-container .breadcrumbs-fixed { width: 964px; }
+ .skin-3 .container.main-container .sidebar + .main-content .breadcrumbs-fixed { width: 758px; }
+ .skin-3 .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 905px; }
+}
+@media (min-width: 1200px) {
+ .skin-3 .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed { width: 1043px; }
+ .skin-3 .container.main-container .breadcrumbs-fixed { width: 1148px; }
+ .skin-3 .container.main-container .sidebar + .main-content .breadcrumbs-fixed { width: 958px; }
+ .skin-3 .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 1105px; }
+}
+@media only screen and (max-width: 991px) {
+ .skin-3 .breadcrumbs { margin: 5px 5px 0px; }
+ .skin-3 .menu-toggler + .sidebar.responsive + .main-content .breadcrumbs { margin: 0px; border-radius: 0px; }
+ .skin-3 .nav-list li.active > a::after, .skin-3 .nav-list li.active > a::before { display: none; }
+}
+.skin-3 .sidebar-shortcuts-large > .btn { line-height: 26px; border-width: 1px; }
+.skin-3 .sidebar-shortcuts-mini { padding-top: 3px; padding-bottom: 3px; padding-left: 1px; }
+.skin-3 .sidebar-shortcuts-mini > .btn { border-width: 1px; opacity: 1; padding: 7px; margin: 1px 1px 0px 0px; }
+@media only screen and (min-width: 992px) {
+ .skin-3 .nav-list > li.active.hover.hover-show > a.dropdown-toggle::after, .skin-3 .nav-list > li.active.hover.hover-show > a.dropdown-toggle::before, .skin-3 .nav-list > li.active.hover:hover > a.dropdown-toggle::after, .skin-3 .nav-list > li.active.hover:hover > a.dropdown-toggle::before { display: none; }
+ .skin-3 .sidebar.h-sidebar { background-color: rgb(227, 227, 227); }
+ .skin-3 .sidebar.h-sidebar::before { background-color: rgb(203, 208, 214); border-bottom-width: 0px; }
+ .skin-3 .sidebar.h-sidebar .sidebar-shortcuts-mini > .btn { padding: 8px; }
+ .skin-3 .sidebar.h-sidebar .sidebar-shortcuts-large { background-color: rgb(255, 255, 255); line-height: 36px; }
+ .skin-3 .sidebar.h-sidebar + .main-content .breadcrumbs { border-color: rgb(213, 231, 241); top: 2px; }
+ .skin-3 .sidebar.h-sidebar .nav-list > li.hover > .submenu { border-color: rgb(164, 198, 221); }
+ .skin-3 .sidebar.h-sidebar .nav-list > li { border-color: rgb(242, 242, 242); }
+ .skin-3 .sidebar.h-sidebar .nav-list > li:hover, .skin-3 .sidebar.h-sidebar .nav-list > li:hover + li { border-left-color: rgb(149, 186, 210); }
+ .skin-3 .sidebar.h-sidebar .nav-list > li.active, .skin-3 .sidebar.h-sidebar .nav-list > li.active + li, .skin-3 .sidebar.h-sidebar .nav-list > li:hover + li.active, .skin-3 .sidebar.h-sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(164, 198, 221); }
+ .skin-3 .sidebar.h-sidebar .nav-list > li:last-child:hover { border-right-color: rgb(149, 186, 210); }
+ .skin-3 .sidebar.h-sidebar .nav-list > li.active:last-child { border-right-color: rgb(164, 198, 221); }
+ .skin-3 .sidebar.h-sidebar .nav-list > li.active > a::after { top: auto; right: auto; bottom: -2px; left: 50%; margin-left: -7px; border-color: transparent transparent rgb(255, 255, 255); border-width: 8px 7px !important; }
+ .skin-3 .sidebar.h-sidebar .nav-list > li.active > a::before { display: block; top: auto; right: auto; bottom: -1px; left: 50%; margin-left: -8px !important; border-width: 8px !important; border-color: transparent transparent rgb(116, 173, 215); }
+ .skin-3 .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { border-right-color: transparent; border-bottom-color: rgb(127, 175, 207); }
+ .skin-3 .sidebar.h-sidebar.menu-min .sidebar-shortcuts { max-width: 52px; padding-left: 2px; padding-right: 2px; }
+ .skin-3 .sidebar.h-sidebar.menu-min .sidebar-shortcuts-mini > .btn { padding: 7px; }
+ .skin-3 .sidebar.h-sidebar.menu-min .nav-list > li.hover > .submenu { border-top-color: rgb(201, 218, 229); }
+ .skin-3 .sidebar.h-sidebar.menu-min .nav-list > li > .arrow::after { border-bottom-color: rgb(237, 243, 247); }
+}
+.skin-3 .sidebar-scroll .sidebar-shortcuts { }
+.skin-3 .sidebar-scroll .sidebar-toggle { border-top-color: rgb(153, 182, 201); }
+@media only screen and (min-width: 768px) and (max-width: 991px) {
+ .skin-3 .navbar.navbar-collapse { background-color: transparent; }
+ .skin-3 .navbar.navbar-collapse .navbar-container, .skin-3 .navbar.navbar-collapse::before { background: rgb(64, 64, 64) none repeat scroll 0% 0%; }
+}
+.skin-3 .nav-list > li.disabled::before { display: none !important; }
diff --git a/at-admin/static/index/ace.min.css b/at-admin/static/index/ace.min.css
new file mode 100644
index 0000000..55212bf
--- /dev/null
+++ b/at-admin/static/index/ace.min.css
@@ -0,0 +1,4047 @@
+/* Code tidied up by ScrapBook */
+.main-content, body, html { min-height: 100%; }
+.alert, .well { border-radius: 0px; }
+.nav-list > li .submenu > li > a:hover, .nav-list > li > a, a:active, a:focus { text-decoration: none; }
+html { position: relative; }
+body { background-color: rgb(228, 230, 233); padding-bottom: 0px; font-family: "Open Sans"; font-size: 13px; color: rgb(57, 57, 57); line-height: 1.5; }
+h1, h2, h3, h4, h5, h6 { font-family: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif; }
+.main-container::before { display: block; content: ""; position: absolute; z-index: -2; width: 100%; max-width: inherit; bottom: 0px; top: 0px; background-color: rgb(255, 255, 255); }
+.main-container.container, .rtl .main-container.container { padding-left: 0px; padding-right: 0px; }
+.main-container.container::before { box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1); width: inherit; }
+@media (max-width: 767px) {
+ .main-container.container::before { box-shadow: none; width: 100%; }
+}
+.main-content { margin-left: 0px; padding: 0px; }
+.main-content::after, .main-content::before { content: " "; display: table; }
+.nav-list li.active > a::after, .nav-list > li::before, .nav-list > li > .submenu::before, .nav-list > li > .submenu > li::before, .sidebar .sidebar-toggle::before, .sidebar.menu-min .nav-list > li > .submenu::after, .sidebar::before, li.divider::before { content: ""; }
+.main-content::after { clear: both; }
+.sidebar + .main-content { margin-left: 190px; }
+.page-content { background-color: rgb(255, 255, 255); position: relative; margin: 0px; padding: 8px 20px 24px; }
+.page-header { margin: 0px 0px 12px; border-bottom: 1px dotted rgb(226, 226, 226); padding-bottom: 16px; padding-top: 7px; }
+.page-header h1 { padding: 0px; margin: 0px 8px; font-size: 24px; font-weight: lighter; color: rgb(38, 121, 181); }
+h1, h2, h3, h4, h5, h6 { font-weight: 400; }
+.page-header h1 small { margin: 0px 6px; font-size: 14px; font-weight: 400; color: rgb(128, 137, 160); }
+h1.block, h2.block, h3.block, h4.block, h5.block, h6.block { margin-bottom: 16px; }
+.ajax-loading-overlay { position: absolute; z-index: 1999; left: 0px; right: 0px; top: 0px; bottom: 0px; background-color: rgba(255, 255, 255, 0.5); }
+.ajax-loading-overlay > .ajax-loading-icon { position: relative; left: 8px; top: 8px; }
+.ajax-loading-overlay.content-loaded { background-color: rgba(255, 255, 255, 0.4); }
+.ajax-loading-overlay.almost-loaded { background-color: rgba(255, 255, 255, 0.3); }
+.ajax-loading-overlay.ajax-overlay-body { position: fixed; z-index: 2999; }
+.ajax-loading-overlay.ajax-overlay-body > .ajax-loading-icon { left: 8px; top: 8px; }
+.ace-icon { text-align: center; }
+h1 { font-size: 32px; }
+h1.smaller { font-size: 31px; }
+h1.bigger { font-size: 33px; }
+h2 { font-size: 26px; }
+h2.smaller { font-size: 25px; }
+h2.bigger { font-size: 27px; }
+h3 { font-size: 22px; }
+h3.smaller { font-size: 21px; }
+h3.bigger { font-size: 23px; }
+h4 { font-size: 18px; }
+h4.smaller { font-size: 17px; }
+h4.bigger { font-size: 19px; }
+h5 { font-size: 15px; }
+h5.smaller { font-size: 14px; }
+h5.bigger { font-size: 16px; }
+h6 { font-size: 13px; }
+h6.smaller { font-size: 12px; }
+h6.bigger { font-size: 14px; }
+ol, ul { padding: 0px; margin: 0px 0px 10px 25px; }
+ol.margin-5, ul.margin-5 { margin-left: 5px; }
+ol.margin-10, ul.margin-10 { margin-left: 10px; }
+ol.margin-15, ul.margin-15 { margin-left: 15px; }
+ol.margin-20, ul.margin-20 { margin-left: 20px; }
+li > ol, li > ul { margin-left: 18px; }
+.list-inline, .list-unstyled { margin-left: 0px; }
+.list-inline > li > .ace-icon:first-child, .list-unstyled > li > .ace-icon:first-child { width: 18px; text-align: center; }
+.spaced > li { margin-top: 9px; margin-bottom: 9px; }
+.spaced2 > li { margin-top: 15px; margin-bottom: 15px; }
+li.divider { margin-top: 3px; margin-bottom: 3px; height: 0px; font-size: 0px; }
+.spaced > li.divider { margin-top: 5px; margin-bottom: 5px; }
+.spaced2 > li.divider { margin-top: 8px; margin-bottom: 8px; }
+li.divider::before { display: inline-block; }
+.blockquote-reverse, blockquote, blockquote.pull-right { border-color: rgb(229, 234, 241); }
+pre.prettyprint { white-space: pre-wrap; }
+.well h1, .well h2, .well h3, .well h4, .well h5, .well h6 { margin-top: 0px; }
+.well h1, .well h2, .well h3 { line-height: 36px; }
+.alert { font-size: 14px; }
+.list-group-item, .no-radius, .pager > li > a, .pagination > li > a { border-radius: 0px !important; }
+.alert .close { font-size: 16px; }
+.alert-block p + p { margin-top: 10px; }
+.pager > li > span, .pagination > li > span { border-width: 1px; border-radius: 0px !important; }
+.pager > li > a, .pagination > li > a { border-width: 1px; border-color: rgb(212, 223, 227); color: rgb(34, 131, 197); background-color: rgb(250, 250, 250); margin: 0px -1px 0px 0px; position: relative; z-index: auto; }
+.pager > li > a:hover, .pagination > li > a:hover { color: rgb(28, 108, 162); background-color: rgb(234, 239, 242); border-color: rgb(193, 209, 215); z-index: 1; }
+.pager > li > a:focus, .pagination > li > a:focus { background-color: rgb(234, 238, 242); }
+.pager > li.disabled > a, .pager > li.disabled > a:hover, .pagination > li.disabled > a, .pagination > li.disabled > a:hover { background-color: rgb(249, 249, 249); border-color: rgb(217, 217, 217); z-index: auto; }
+.pagination > li.active > a, .pagination > li.active > a:focus, .pagination > li.active > a:hover { background-color: rgb(111, 174, 217); border-color: rgb(111, 174, 217); color: rgb(255, 255, 255); text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25); z-index: 2; }
+.list-group { margin-left: auto; }
+.lighter { font-weight: lighter; }
+.bolder { font-weight: bolder; }
+.inline { display: inline-block !important; }
+.block { display: block !important; }
+.align-center, .center { text-align: center !important; }
+.align-left { text-align: left !important; }
+.align-right { text-align: right !important; }
+.align-justify { text-align: justify; }
+.middle { vertical-align: middle; }
+.align-middle { vertical-align: middle !important; }
+.align-top { vertical-align: top !important; }
+.align-bottom { vertical-align: bottom !important; }
+.pos-rel, .position-relative { position: relative; }
+.pos-abs, .position-absolute { position: absolute; }
+.no-float { float: none !important; }
+.line-height-normal { line-height: normal !important; }
+.line-height-0 { line-height: 0 !important; }
+.line-height-1 { line-height: 1 !important; }
+.line-height-125 { line-height: 1.25 !important; }
+.line-height-150 { line-height: 1.5 !important; }
+.dark { color: rgb(51, 51, 51) !important; }
+.white { color: rgb(255, 255, 255) !important; }
+.red { color: rgb(221, 90, 67) !important; }
+.red2 { color: rgb(224, 131, 116) !important; }
+.light-red { color: rgb(255, 119, 119) !important; }
+.blue { color: rgb(71, 143, 202) !important; }
+.light-blue { color: rgb(147, 203, 249) !important; }
+.green { color: rgb(105, 170, 70) !important; }
+.light-green { color: rgb(176, 216, 119) !important; }
+.orange { color: rgb(255, 137, 42) !important; }
+.orange2 { color: rgb(254, 185, 2) !important; }
+.light-orange { color: rgb(252, 172, 111) !important; }
+.purple { color: rgb(160, 105, 195) !important; }
+.pink { color: rgb(198, 105, 159) !important; }
+.pink2 { color: rgb(214, 72, 126) !important; }
+.brown { color: brown !important; }
+.grey { color: rgb(119, 119, 119) !important; }
+.light-grey { color: rgb(187, 187, 187) !important; }
+.bigger-110 { font-size: 110% !important; }
+.bigger-120 { font-size: 120% !important; }
+.bigger-130 { font-size: 130% !important; }
+.bigger-140 { font-size: 140% !important; }
+.bigger-150 { font-size: 150% !important; }
+.bigger-160 { font-size: 160% !important; }
+.bigger-170 { font-size: 170% !important; }
+.bigger-180 { font-size: 180% !important; }
+.bigger-190 { font-size: 190% !important; }
+.bigger-200 { font-size: 200% !important; }
+.bigger-210 { font-size: 210% !important; }
+.bigger-220 { font-size: 220% !important; }
+.bigger-230 { font-size: 230% !important; }
+.bigger-240 { font-size: 240% !important; }
+.bigger-250 { font-size: 250% !important; }
+.bigger-260 { font-size: 260% !important; }
+.bigger-270 { font-size: 270% !important; }
+.bigger-280 { font-size: 280% !important; }
+.bigger-290 { font-size: 290% !important; }
+.bigger-300 { font-size: 300% !important; }
+.bigger-115 { font-size: 115% !important; }
+.bigger-125 { font-size: 125% !important; }
+.bigger-175 { font-size: 175% !important; }
+.bigger-225 { font-size: 225% !important; }
+.bigger-275 { font-size: 275% !important; }
+.smaller-90 { font-size: 90% !important; }
+.smaller-80 { font-size: 80% !important; }
+.smaller-70 { font-size: 70% !important; }
+.smaller-60 { font-size: 60% !important; }
+.smaller-50 { font-size: 50% !important; }
+.smaller-40 { font-size: 40% !important; }
+.smaller-30 { font-size: 30% !important; }
+.smaller-20 { font-size: 20% !important; }
+.smaller-75 { font-size: 75% !important; }
+.width-20 { width: 20% !important; }
+.width-30 { width: 30% !important; }
+.width-35 { width: 35% !important; }
+.width-40 { width: 40% !important; }
+.width-45 { width: 45% !important; }
+.width-50 { width: 50% !important; }
+.width-55 { width: 55% !important; }
+.width-60 { width: 60% !important; }
+.width-65 { width: 65% !important; }
+.width-70 { width: 70% !important; }
+.width-80 { width: 80% !important; }
+.width-85 { width: 85% !important; }
+.width-90 { width: 90% !important; }
+.width-95 { width: 95% !important; }
+.width-100 { width: 100% !important; }
+.width-75 { width: 75% !important; }
+.width-25 { width: 25% !important; }
+.width-auto { width: auto !important; }
+.height-auto { height: auto !important; }
+.no-padding { padding: 0px !important; }
+.no-padding-bottom { padding-bottom: 0px !important; }
+.no-padding-top { padding-top: 0px !important; }
+.no-padding-left { padding-left: 0px !important; }
+.no-padding-right { padding-right: 0px !important; }
+.no-margin { margin: 0px !important; }
+.no-margin-bottom { margin-bottom: 0px !important; }
+.no-margin-top { margin-top: 0px !important; }
+.no-margin-left { margin-left: 0px !important; }
+.no-margin-right { margin-right: 0px !important; }
+.no-border { border-width: 0px; }
+.no-border-bottom { border-bottom-width: 0px; }
+.no-border-top { border-top-width: 0px; }
+.no-border-left { border-left-width: 0px; }
+.no-border-right { border-right-width: 0px; }
+.overflow-hidden { overflow: hidden !important; }
+.overflow-scroll { overflow-x: hidden !important; overflow-y: scroll !important; }
+.no-text-shadow { text-shadow: none !important; }
+.hr { display: block; height: 0px; overflow: hidden; font-size: 0px; border-width: 1px 0px 0px; border-top: 1px solid rgba(0, 0, 0, 0.11); margin: 12px 0px; }
+.hr-double { height: 3px; border-top: 1px solid rgba(0, 0, 0, 0.11); border-bottom: 1px solid rgba(0, 0, 0, 0.11); }
+.hr-dotted, .hr.dotted { border-style: dotted; }
+.hr-32, .hr32 { margin: 32px 0px; }
+.hr-30, .hr30 { margin: 30px 0px; }
+.hr-28, .hr28 { margin: 28px 0px; }
+.hr-26, .hr26 { margin: 26px 0px; }
+.hr-24, .hr24 { margin: 24px 0px; }
+.hr-22, .hr22 { margin: 22px 0px; }
+.hr-20, .hr20 { margin: 20px 0px; }
+.hr-18, .hr18 { margin: 18px 0px; }
+.hr-16, .hr16 { margin: 16px 0px; }
+.hr-14, .hr14 { margin: 14px 0px; }
+.hr-12, .hr12 { margin: 12px 0px; }
+.hr-10, .hr10 { margin: 10px 0px; }
+.hr-8, .hr8 { margin: 8px 0px; }
+.hr-6, .hr6 { margin: 6px 0px; }
+.hr-4, .hr4 { margin: 4px 0px; }
+.hr-2, .hr2 { margin: 2px 0px; }
+.space { max-height: 1px; min-height: 1px; overflow: hidden; margin: 12px 0px; }
+[class*="vspace-"] { display: none; }
+.space-32, [class*="vspace-32"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 32px 0px 31px; }
+.space-30, [class*="vspace-30"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 30px 0px 29px; }
+.space-28, [class*="vspace-28"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 28px 0px 27px; }
+.space-26, [class*="vspace-26"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 26px 0px 25px; }
+.space-24, [class*="vspace-24"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 24px 0px 23px; }
+.space-22, [class*="vspace-22"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 22px 0px 21px; }
+.space-20, [class*="vspace-20"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 20px 0px 19px; }
+.space-18, [class*="vspace-18"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 18px 0px 17px; }
+.space-16, [class*="vspace-16"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 16px 0px 15px; }
+.space-14, [class*="vspace-14"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 14px 0px 13px; }
+.space-12, [class*="vspace-12"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 12px 0px 11px; }
+.space-10, [class*="vspace-10"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 10px 0px 9px; }
+.space-8, [class*="vspace-8"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 8px 0px 7px; }
+.space-6, [class*="vspace-6"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 6px 0px 5px; }
+.space-4, [class*="vspace-4"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 4px 0px 3px; }
+.space-2, [class*="vspace-2"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 2px 0px 1px; }
+.space-0, [class*="vspace-0"] { max-height: 1px; min-height: 1px; overflow: hidden; margin: 0px; }
+@media only screen and (max-width: 479px) {
+ [class*="vspace-"][class*="-xs"] { display: block; }
+}
+@media only screen and (max-width: 767px) {
+ [class*="vspace-"][class*="-sm"] { display: block; }
+}
+@media only screen and (max-width: 991px) {
+ [class*="vspace-"][class*="-md"] { display: block; }
+}
+@media only screen and (max-width: 1199px) {
+ [class*="vspace-"][class*="-lg"] { display: block; }
+}
+.header { line-height: 28px; margin-bottom: 16px; margin-top: 18px; padding-bottom: 4px; border-bottom: 1px solid rgb(204, 204, 204); }
+.header.less-margin { margin-top: 10px; margin-bottom: 10px; }
+.header.blue { border-bottom-color: rgb(213, 227, 239); }
+.header.green { border-bottom-color: rgb(204, 226, 193); }
+.header.purple { border-bottom-color: rgb(224, 209, 234); }
+.header.orange { border-bottom-color: rgb(253, 208, 172); }
+.header.orange2 { border-bottom-color: rgb(251, 211, 107); }
+.header.red { border-bottom-color: rgb(243, 205, 198); }
+.header.grey { border-bottom-color: rgb(195, 195, 195); }
+.header.pink { border-bottom-color: rgb(242, 224, 235); }
+.header.pink2 { border-bottom-color: rgb(230, 158, 185); }
+.header.light-blue { border-bottom-color: rgb(220, 238, 252); }
+.header.light-red { border-bottom-color: rgb(254, 197, 197); }
+.header.light-green { border-bottom-color: rgb(210, 231, 181); }
+.header.brown { border-bottom-color: rgb(223, 147, 147); }
+.header > .ace-icon { margin-right: 2px; }
+.action-buttons a { margin: 0px 3px; display: inline-block; opacity: 0.85; transition: all 0.1s ease 0s; }
+.action-buttons a:hover { text-decoration: none; opacity: 1; transform: scale(1.2); }
+.navbar { margin: 0px; padding-left: 0px; padding-right: 0px; border-width: 0px; border-radius: 0px; box-shadow: none; min-height: 45px; background: rgb(67, 142, 185) none repeat scroll 0% 0%; }
+.navbar .navbar-link, .navbar .navbar-text { color: rgb(255, 255, 255); }
+.navbar .navbar-brand { color: rgb(255, 255, 255); font-size: 24px; text-shadow: none; padding-top: 10px; padding-bottom: 10px; height: auto; }
+.navbar .navbar-brand:focus, .navbar .navbar-brand:hover { color: rgb(255, 255, 255); }
+@media only screen and (min-width: 992px) {
+ .navbar-container { padding-left: 10px; padding-right: 10px; }
+}
+.navbar-container.container { padding-left: 0px; padding-right: 0px; }
+.ace-nav { height: 100%; margin: 0px !important; }
+.ace-nav > li { line-height: 45px; height: 45px; border-left: 1px solid rgb(225, 225, 225); padding: 0px; position: relative; float: left; }
+.ace-nav > li:first-child { border-left-width: 0px; }
+.ace-nav > li > a { background-color: rgb(46, 101, 137); color: rgb(255, 255, 255); display: block; line-height: inherit; text-align: center; height: 100%; width: auto; min-width: 50px; padding: 0px 8px; position: relative; }
+.ace-nav > li > a > .ace-icon { display: inline-block; font-size: 16px; color: rgb(255, 255, 255); text-align: center; width: 20px; }
+.ace-nav > li > a > .badge { position: relative; top: -4px; left: 2px; padding-right: 5px; padding-left: 5px; }
+.ace-nav > li.open > a, .ace-nav > li > a:focus, .ace-nav > li > a:hover { background-color: rgb(44, 89, 118); color: rgb(255, 255, 255); }
+.ace-nav > li.blue > a { background-color: rgb(46, 101, 137); }
+.ace-nav > li.blue > a:focus, .ace-nav > li.blue > a:hover, .ace-nav > li.open.blue > a { background-color: rgb(44, 89, 118); }
+.ace-nav > li.grey > a { background-color: rgb(85, 85, 85); }
+.ace-nav > li.grey > a:focus, .ace-nav > li.grey > a:hover, .ace-nav > li.open.grey > a { background-color: rgb(75, 75, 75); }
+.ace-nav > li.purple > a { background-color: rgb(137, 46, 101); }
+.ace-nav > li.open.purple > a, .ace-nav > li.purple > a:focus, .ace-nav > li.purple > a:hover { background-color: rgb(118, 44, 89); }
+.ace-nav > li.green > a { background-color: rgb(46, 137, 101); }
+.ace-nav > li.green > a:focus, .ace-nav > li.green > a:hover, .ace-nav > li.open.green > a { background-color: rgb(44, 118, 89); }
+.ace-nav > li.light-blue > a { background-color: rgb(98, 168, 209); }
+.ace-nav > li.light-blue > a:focus, .ace-nav > li.light-blue > a:hover, .ace-nav > li.open.light-blue > a { background-color: rgb(87, 158, 200); }
+.ace-nav > li.light-blue2 > a { background-color: rgb(66, 168, 225); }
+.ace-nav > li.light-blue2 > a:focus, .ace-nav > li.light-blue2 > a:hover, .ace-nav > li.open.light-blue2 > a { background-color: rgb(53, 159, 217); }
+.ace-nav > li.red > a { background-color: rgb(183, 70, 53); }
+.ace-nav > li.open.red > a, .ace-nav > li.red > a:focus, .ace-nav > li.red > a:hover { background-color: rgb(163, 67, 53); }
+.ace-nav > li.light-green > a { background-color: rgb(154, 188, 50); }
+.ace-nav > li.light-green > a:focus, .ace-nav > li.light-green > a:hover, .ace-nav > li.open.light-green > a { background-color: rgb(139, 168, 50); }
+.ace-nav > li.light-purple > a { background-color: rgb(203, 111, 215); }
+.ace-nav > li.light-purple > a:focus, .ace-nav > li.light-purple > a:hover, .ace-nav > li.open.light-purple > a { background-color: rgb(194, 99, 206); }
+.ace-nav > li.light-orange > a { background-color: rgb(247, 146, 99); }
+.ace-nav > li.light-orange > a:focus, .ace-nav > li.light-orange > a:hover, .ace-nav > li.open.light-orange > a { background-color: rgb(242, 134, 83); }
+.ace-nav > li.light-pink > a { background-color: rgb(244, 218, 229); }
+.ace-nav > li.light-pink > a:focus, .ace-nav > li.light-pink > a:hover, .ace-nav > li.open.light-pink > a { background-color: rgb(238, 204, 218); }
+.ace-nav > li.dark > a { background-color: rgb(64, 64, 64); }
+.ace-nav > li.dark > a:focus, .ace-nav > li.dark > a:hover, .ace-nav > li.open.dark > a { background-color: rgb(54, 54, 54); }
+.ace-nav > li.white-opaque > a { background-color: rgba(255, 255, 255, 0.8); }
+.ace-nav > li.open.white-opaque > a, .ace-nav > li.white-opaque > a:focus, .ace-nav > li.white-opaque > a:hover { background-color: rgba(245, 245, 245, 0.8); }
+.ace-nav > li.dark-opaque > a, .ace-nav > li.dark-opaque > a:focus, .ace-nav > li.dark-opaque > a:hover, .ace-nav > li.open.dark-opaque > a { background-color: rgba(0, 0, 0, 0.2); }
+.ace-nav > li.transparent > a { background-color: transparent; }
+.ace-nav > li.open.transparent > a, .ace-nav > li.transparent > a:focus, .ace-nav > li.transparent > a:hover { background-color: rgba(0, 0, 0, 0.1); }
+.ace-nav > li.light-10 > a { background-color: rgba(255, 255, 255, 0.1); }
+.ace-nav > li.light-10 > a:focus, .ace-nav > li.light-10 > a:hover, .ace-nav > li.open.light-10 > a { background-color: rgba(255, 255, 255, 0.2); }
+.ace-nav > li.dark-10 > a { background-color: rgba(0, 0, 0, 0.1); }
+.ace-nav > li.dark-10 > a:focus, .ace-nav > li.dark-10 > a:hover, .ace-nav > li.open.dark-10 > a { background-color: rgba(0, 0, 0, 0.2); }
+.ace-nav > li.margin-4 { margin-left: 4px; }
+.ace-nav > li.margin-3 { margin-left: 3px; }
+.ace-nav > li.margin-2 { margin-left: 2px; }
+.ace-nav > li.margin-1 { margin-left: 1px; }
+.ace-nav > li.no-border { border-width: 0px !important; }
+.ace-nav > li .dropdown-menu { z-index: 1031; }
+.ace-nav .nav-user-photo { margin: -4px 8px 0px 0px; border-radius: 100%; border: 2px solid rgb(255, 255, 255); max-width: 40px; }
+.ace-nav li.dropdown-footer a .ace-icon { display: inline-block; width: 1.25em; text-align: center; }
+@media only screen and (max-height: 540px) {
+ .ace-nav > li.dropdown-modal > .dropdown-menu { position: fixed; margin-top: auto; z-index: 1052; }
+ .ace-nav > li.dropdown-modal > .dropdown-menu::after, .ace-nav > li.dropdown-modal > .dropdown-menu::before { display: none; }
+ .ace-nav > li.dropdown-modal > .user-menu > li > a { padding-top: 6px; padding-bottom: 6px; }
+ .ace-nav > li.dropdown-modal.open::before { background-color: rgb(0, 0, 0); opacity: 0.5; border-width: 0px; position: fixed; left: 0px; right: 0px; top: 0px; bottom: 0px; content: ""; display: block; height: 2000px; width: auto; z-index: 1051; }
+}
+@media only screen and (max-width: 767px) {
+ .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right { right: -100px; }
+ .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right::before { right: 120px; }
+ .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right { right: -80px; }
+ .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right::before { right: 100px; }
+ .user-menu.dropdown-close.dropdown-menu-right { right: 0px !important; }
+}
+@media only screen and (min-width: 480px) and (max-width: 767px) {
+ .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(1) > .dropdown-menu.dropdown-menu-right, .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(2) > .dropdown-menu.dropdown-menu-right { left: auto; right: -60px; }
+ .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(1) > .dropdown-menu.dropdown-menu-right::after, .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(1) > .dropdown-menu.dropdown-menu-right::before, .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(2) > .dropdown-menu.dropdown-menu-right::after, .navbar.navbar-collapse .ace-nav > li:nth-last-child(2):nth-child(2) > .dropdown-menu.dropdown-menu-right::before { right: 80px; left: auto; }
+}
+@media only screen and (max-width: 480px) {
+ .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right { right: -120px; }
+ .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right::before { right: 140px; }
+ .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right { right: -90px; }
+ .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right::before { right: 110px; }
+ .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right { right: -50px; }
+ .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right::before { right: 70px; }
+}
+@media only screen and (max-width: 479px) {
+ .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right { left: -10px; right: auto; }
+ .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(4) > .dropdown-menu.dropdown-menu-right::before { right: auto; left: 30px; }
+ .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right { left: -50px; right: auto; }
+ .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(3) > .dropdown-menu.dropdown-menu-right::before { left: 75px; right: auto; }
+ .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right { left: -70px; right: auto; }
+ .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right::before { left: 90px; right: auto; }
+ .navbar:not(.navbar-collapse) .navbar-header { float: none !important; display: block; }
+ .navbar:not(.navbar-collapse) .ace-nav { display: block; float: none !important; text-align: center; background-color: rgba(0, 0, 0, 0.15); border-style: solid; border-color: rgba(0, 0, 0, 0.1); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 0px 0px; letter-spacing: -3px; }
+ .navbar:not(.navbar-collapse) .ace-nav > li { display: inline-block; float: none !important; text-align: left; letter-spacing: normal; }
+ .navbar:not(.navbar-collapse) .ace-nav > li:first-child { border-left: 1px solid rgba(255, 255, 255, 0.4); }
+ .navbar:not(.navbar-collapse) .ace-nav > li:last-child { border-right: 1px solid rgba(255, 255, 255, 0.4); }
+}
+@media only screen and (max-width: 319px) {
+ .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right { left: -110px; right: auto; }
+ .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-last-child(2) > .dropdown-menu.dropdown-menu-right::before { left: 130px; right: auto; }
+ .ace-nav > li:nth-child(2):nth-last-child(2) > .dropdown-menu.dropdown-menu-right { left: -85px; right: auto; }
+ .ace-nav > li:nth-child(2):nth-last-child(2) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-child(2):nth-last-child(2) > .dropdown-menu.dropdown-menu-right::before { left: 105px; right: auto; }
+ .ace-nav > li:nth-child(1):nth-last-child(3) > .dropdown-menu.dropdown-menu-right { left: -35px; right: auto; }
+ .ace-nav > li:nth-child(1):nth-last-child(3) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-child(1):nth-last-child(3) > .dropdown-menu.dropdown-menu-right::before { left: 55px; right: auto; }
+ .ace-nav > li:nth-child(1):nth-last-child(2) > .dropdown-menu.dropdown-menu-right { left: -60px; right: auto; }
+ .ace-nav > li:nth-child(1):nth-last-child(2) > .dropdown-menu.dropdown-menu-right::after, .ace-nav > li:nth-child(1):nth-last-child(2) > .dropdown-menu.dropdown-menu-right::before { left: 75px; right: auto; }
+ .ace-nav > li > a { padding: 0px 5px !important; }
+}
+.user-menu > li > a { padding: 4px 12px; }
+.user-menu > li > a > .ace-icon { margin-right: 6px; font-size: 120%; }
+.user-info { max-width: 100px; display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; vertical-align: top; line-height: 15px; position: relative; top: 6px; }
+.user-info small { display: block; }
+@media (min-width: 480px) and (max-width: 540px), (max-width: 360px) {
+ .navbar:not(.navbar-collapse) .navbar-buttons .user-menu { padding-top: 42px !important; }
+ .navbar:not(.navbar-collapse) .navbar-buttons .nav-user-photo { margin-right: 0px; }
+ .navbar:not(.navbar-collapse) .navbar-buttons .user-info { position: absolute; margin-top: 40px; margin-left: 1px; right: 2px; z-index: 1032; color: rgb(119, 119, 119); font-size: 14px; width: 156px; max-width: 156px; padding-left: 8px; padding-right: 8px; height: 32px; line-height: 26px !important; display: none; border-bottom: 1px solid rgb(229, 229, 229); text-align: center; cursor: text; }
+ .navbar:not(.navbar-collapse) .navbar-buttons .user-info > small { display: inline; opacity: 1; }
+ li.open .user-info { display: inline-block !important; }
+}
+@media (max-width: 360px) {
+ .navbar.navbar-collapse .navbar-buttons .user-menu { padding-top: 42px !important; }
+ .navbar.navbar-collapse .navbar-buttons .nav-user-photo { margin-right: 0px; }
+ .navbar.navbar-collapse .navbar-buttons .user-info { position: absolute; margin-top: 40px; margin-left: 1px; right: 2px; z-index: 1032; color: rgb(119, 119, 119); font-size: 14px; width: 156px; max-width: 156px; padding-left: 8px; padding-right: 8px; height: 32px; line-height: 26px !important; display: none; border-bottom: 1px solid rgb(229, 229, 229); text-align: center; cursor: text; }
+ .navbar.navbar-collapse .navbar-buttons .user-info > small { display: inline; opacity: 1; }
+ li.open .user-info { display: inline-block !important; right: 2px; }
+}
+@media (min-width: 992px) {
+ .user-min .user-menu { padding-top: 42px !important; }
+ .user-min .nav-user-photo { margin-right: 0px; }
+ .user-min .user-info { position: absolute; margin-top: 40px; margin-left: 1px; z-index: 1032; color: rgb(119, 119, 119); font-size: 14px; width: 156px; max-width: 156px; padding-left: 8px; padding-right: 8px; height: 32px; line-height: 26px !important; display: none; border-bottom: 1px solid rgb(229, 229, 229); text-align: center; cursor: text; right: -3px; }
+ .user-min .user-info > small { display: inline; opacity: 1; }
+ .user-min.open .user-info { display: inline-block !important; }
+}
+.btn, .dropdown-colorpicker a { cursor: pointer; }
+@media (max-height: 540px) and (min-width: 480px) and (max-width: 540px), (max-height: 540px) and (max-width: 360px) {
+ .navbar:not(.navbar-collapse) .ace-nav > li.dropdown-modal .user-info { position: fixed; right: auto; margin-top: auto; max-width: none; }
+}
+@media (max-height: 540px) and (max-width: 360px) {
+ .navbar.navbar-collapse .ace-nav > li.dropdown-modal .user-info { position: fixed; right: auto; margin-top: auto; max-width: none; }
+}
+@media (max-height: 540px) and (min-width: 992px) {
+ .ace-nav > li.dropdown-modal.user-min .user-info { position: fixed; right: auto; margin-top: auto; max-width: none; }
+}
+@media only screen and (max-width: 991px) {
+ .navbar.navbar-collapse { max-height: none; }
+ .navbar .navbar-collapse, .navbar .navbar-header { margin-left: 0px !important; margin-right: 0px !important; }
+ .navbar.navbar-collapse .navbar-header { float: none !important; min-height: 45px; }
+ .navbar.navbar-collapse .navbar-buttons { min-height: 0px; padding-left: 0px; padding-right: 0px; border-style: solid; border-color: rgba(255, 255, 255, 0.4); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 0px 0px; width: 100%; }
+ .navbar.navbar-collapse .navbar-buttons.in { overflow: visible !important; }
+ .navbar.navbar-collapse .navbar-buttons > .ace-nav { display: block; float: none !important; text-align: center; background-color: transparent !important; border-width: 0px; letter-spacing: -3px; }
+ .navbar.navbar-collapse .navbar-buttons > .ace-nav > li { display: inline-block; float: none !important; text-align: left; letter-spacing: normal; }
+ .navbar.navbar-collapse .navbar-buttons > .ace-nav > li:first-child { border-left: 1px solid rgba(255, 255, 255, 0.4); }
+ .navbar.navbar-collapse .navbar-buttons > .ace-nav > li:last-child { border-right: 1px solid rgba(255, 255, 255, 0.4); }
+}
+.container-fluid > .navbar-buttons, .container > .navbar-buttons { padding-right: 0px !important; }
+@media only screen and (max-height: 400px) {
+ .navbar-fixed-top .navbar-collapse { max-height: 280px; }
+}
+@media only screen and (max-height: 360px) {
+ .navbar-fixed-top .navbar-collapse { max-height: 240px; }
+}
+@media only screen and (max-height: 320px) {
+ .navbar-fixed-top .navbar-collapse { max-height: 200px; }
+}
+@media only screen and (max-height: 280px) {
+ .navbar-fixed-top .navbar-collapse { max-height: 160px; }
+}
+@media only screen and (max-height: 240px) {
+ .navbar-fixed-top .navbar-collapse { max-height: 120px; }
+}
+.navbar .navbar-nav > li { border-style: solid; border-color: rgba(0, 0, 0, 0.2); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 0px 0px; }
+.navbar .navbar-nav > li:first-child { border-width: 0px 1px; }
+.navbar .navbar-nav > li > a { padding-top: 12px; padding-bottom: 11px; height: 45px; background-color: transparent; font-size: 13px; color: rgb(255, 255, 255); text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.25); }
+.navbar .navbar-nav > li.open > a, .navbar .navbar-nav > li > a:focus, .navbar .navbar-nav > li > a:hover { background-color: rgba(0, 0, 0, 0.1) !important; color: rgb(255, 255, 255) !important; }
+.navbar .navbar-nav > li > .dropdown-menu > li > a { line-height: 2; }
+.navbar-nav .dropdown-menu > li > a > .ace-icon { display: inline-block; width: 20px; }
+.navbar-nav > li > .dropdown-menu { z-index: 1033; }
+@media only screen and (max-width: 991px) {
+ .navbar .navbar-nav .dropdown-menu > li > a, .navbar .navbar-nav .dropdown-menu > li > a > .ace-icon { color: rgb(255, 255, 255) !important; }
+ .navbar.navbar-collapse .navbar-menu { float: none !important; clear: both; }
+ .navbar.navbar-collapse .navbar-menu .dropdown-menu::after, .navbar.navbar-collapse .navbar-menu .dropdown-menu::before { display: none !important; }
+ .navbar .navbar-nav { margin: 0px -6px; }
+ .navbar .navbar-nav > li, .navbar .navbar-nav > li:first-child { border-width: 1px 0px 0px; }
+ .navbar .navbar-nav .dropdown-menu { float: none; position: relative; background-color: transparent; box-shadow: none; border-width: 0px; }
+ .navbar .navbar-nav .dropdown-menu > li > a:hover { background-color: rgba(0, 0, 0, 0.07) !important; }
+ .navbar .navbar-nav .dropdown-hover > .dropdown-menu { left: 32px !important; right: auto !important; top: auto !important; width: 80% !important; }
+}
+.navbar-form.form-search { margin-top: 9px; margin-bottom: 0px; }
+.navbar-form.form-search .form-group { margin-bottom: 0px; }
+.navbar-form.form-search input[type="text"] { width: 100px; }
+.navbar-form input[type="text"] { font-size: 13px; line-height: 1.4; padding-top: 4px; padding-bottom: 4px; border-width: 0px; }
+@media only screen and (max-width: 991px) {
+ .navbar-form .form-group { display: inline-block; width: 50%; margin-bottom: 0px; vertical-align: middle; }
+ .navbar-form.form-search input[type="text"] { width: 100%; }
+ .navbar-nav + .navbar-form { margin-top: 0px; }
+ .navbar .navbar-collapse, .navbar .navbar-form { border-color: rgba(255, 255, 255, 0.4); }
+ .navbar .navbar-nav > li:first-child { border-top-width: 0px; }
+}
+@media only screen and (max-width: 480px) {
+ .navbar-form .form-group { width: 80%; }
+}
+.navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse { padding-left: 12px; padding-right: 12px; }
+@media only screen and (min-width: 768px) and (max-width: 991px) {
+ .navbar.navbar-collapse { background-color: transparent; }
+ .navbar.navbar-collapse::before { background: rgb(67, 142, 185) none repeat scroll 0% 0%; content: ""; display: block; position: absolute; min-height: inherit; left: 0px; right: 0px; top: 0px; z-index: -1; border-radius: inherit; }
+ .navbar.navbar-collapse .navbar-container { background-color: rgb(67, 142, 185); }
+}
+.navbar .navbar-toggle { border: 1px solid transparent; width: 40px; height: 35px; line-height: 0; padding: 0px 0px 1px; text-align: center; }
+.navbar .navbar-toggle.pull-right { margin: 5px 6px 4px 0px; }
+.navbar .navbar-toggle.pull-left { margin: 5px 0px 4px 6px; }
+.navbar .navbar-toggle:active { top: 1px; }
+.navbar .navbar-toggle.navbar-toggle-img { width: auto; height: auto; overflow: hidden; padding: 0px; border-width: 0px; }
+.navbar .navbar-toggle.navbar-toggle-img > img { border-radius: inherit; max-height: 35px; border-width: 0px; }
+.navbar .navbar-toggle .icon-bar { background-color: rgb(255, 255, 255); border-radius: 0px; width: 24px; margin-left: 7px; }
+.sidebar { width: 190px; float: left; position: static; padding-left: 0px; padding-right: 0px; }
+.sidebar::before { display: block; width: inherit; position: absolute; top: 0px; bottom: 0px; z-index: -1; background-color: inherit; border-style: inherit; border-color: inherit; border-width: inherit; }
+.nav-list { margin: 0px; padding: 0px; list-style: outside none none; }
+.nav-list .nav-header, .nav-list > li, .nav-list > li > a { margin: 0px; }
+.nav-list li > a:focus { outline: 0px none; }
+.nav-list > li { display: block; position: relative; float: none; padding: 0px; border-style: solid; border-width: 1px 0px 0px; }
+.nav-list > li:last-child { border-bottom-width: 1px; }
+.nav-list > li.active > a { font-weight: 700; }
+.nav-list > li > a { display: block; height: 39px; line-height: 17px; padding-left: 7px; text-shadow: none !important; font-size: 13px; }
+.nav-list > li > a > .menu-icon { display: inline-block; min-width: 30px; margin-right: 2px; vertical-align: sub; text-align: center; font-size: 18px; font-weight: 400; }
+.nav-list > li::before { display: none; position: absolute; top: -1px; left: 0px; z-index: 1; height: 41px; width: 3px; max-width: 3px; overflow: hidden; background-color: rgb(98, 156, 201); }
+@media only screen and (min-width: 992px) {
+ .main-container.container .sidebar:not(.h-sidebar) .nav-list > li::before { left: -2px; }
+}
+.main-container.container .sidebar.sidebar-fixed:not(.h-sidebar) .nav-list > li::before { left: 0px; }
+.nav-list > li:hover::before { display: block; }
+.nav-list > li a > .arrow { display: block; width: 14px !important; height: 14px; line-height: 14px; text-shadow: none; font-size: 18px; position: absolute; right: 10px; top: 12px; padding: 0px; text-align: center; }
+.nav-list > li.separator { height: 3px; background-color: transparent; position: static; margin: 1px 0px; box-shadow: none; }
+.nav-list > li .submenu { display: none; list-style: outside none none; margin: 0px; padding: 0px; line-height: 1.5; position: relative; }
+.nav-list > li .submenu > li { margin-left: 0px; position: relative; }
+.nav-list > li .submenu > li > a { display: block; position: relative; padding: 7px 0px 9px 37px; margin: 0px; border-top-width: 1px; border-top-style: dotted; }
+.nav-list > li .submenu > li a > .menu-icon { display: none; font-size: 12px; font-weight: 400; width: 18px; height: auto; line-height: 12px; text-align: center; position: absolute; left: 10px; top: 11px; z-index: 1; background-color: inherit; }
+.nav-list > li .submenu > li.active > a > .menu-icon, .nav-list > li .submenu > li:hover > a > .menu-icon { display: inline-block; }
+.nav-list > li > .submenu { border-top: 1px solid; }
+.nav-list > li > .submenu > li::before { display: block; width: 7px; position: absolute; z-index: 1; left: 20px; top: 17px; border-style: dotted; border-color: currentcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 0px 0px; }
+.nav-list > li > .submenu::before { display: block; position: absolute; z-index: 1; left: 18px; top: 0px; bottom: 0px; border-style: dotted; border-color: currentcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 0px 0px 1px; }
+.nav-list li.active > a > .arrow, .nav-list li.open > a > .arrow, .nav-list li:hover > a > .arrow { color: inherit; }
+.nav-list li.open > .submenu, .nav-list > li .submenu.collapsing, .nav-list > li > .submenu li.open > .submenu { display: block; }
+.nav-list > li > .submenu li > .submenu { display: none; }
+.nav-list > li > .submenu li.active > .submenu, .nav-list > li > .submenu li > .submenu.collapsing { display: block; }
+.nav-list > li > .submenu a > .arrow { right: 10px; top: 10px; font-size: 16px; }
+.nav-list > li > .submenu > li:first-child > a { border-top-width: 0px; }
+.nav-list > li > .submenu li > .submenu > li { line-height: 18px; }
+.nav-list > li > .submenu li > .submenu > li::before { display: none; }
+.nav-list > li > .submenu li > .submenu > li > a { margin-left: 20px; padding-left: 22px; }
+.nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: 20px; padding-left: 38px; }
+.nav-list > li > .submenu li > .submenu > li a > .menu-icon { display: inline-block; width: auto; position: static; background-color: transparent; margin-right: 4px; color: inherit; }
+.nav-list > li > .submenu li > .submenu > li a .arrow, .nav-list > li > .submenu li > .submenu > li a .menu-icon { color: inherit; }
+.nav-list > li > .submenu li.open:not(.hover) > a > .menu-icon { display: inline-block; }
+.nav-list a .badge, .nav-list a .label { position: absolute; top: 9px; right: 10px; opacity: 0.88; font-size: 12px; padding-left: 6px; padding-right: 6px; }
+.nav-list a .badge .ace-icon, .nav-list a .label .ace-icon { vertical-align: middle; margin: 0px; }
+.nav-list a.dropdown-toggle .badge, .nav-list a.dropdown-toggle .label { right: 26px; }
+.nav-list li:hover > a .badge, .nav-list li:hover > a .label { opacity: 1; }
+.nav-list .submenu .submenu a .badge, .nav-list .submenu .submenu a .label { top: 6px; }
+.sidebar.sidebar-fixed { position: fixed; top: auto; float: none !important; z-index: 1027; }
+.sidebar.sidebar-fixed::before { height: 5000px; top: auto; bottom: auto; }
+.sidebar-scroll-native { overflow-y: scroll !important; overflow-x: hidden; }
+body.mob-safari .sidebar.sidebar-fixed { top: 45px; }
+@media (max-width: 479px) {
+ body.mob-safari .navbar-fixed-top:not(.navbar-collapse) + .main-container .sidebar-fixed { top: 90px; }
+}
+@media (max-width: 991px) {
+ body.mob-safari .navbar-fixed-top + .main-container .sidebar.responsive { top: 45px; }
+}
+@media (max-width: 479px) {
+ body.mob-safari .navbar-fixed-top + .main-container .sidebar.responsive { top: 90px; }
+}
+@media only screen and (max-width: 991px) {
+ .responsive.sidebar-fixed { left: auto; margin-left: auto; }
+ .navbar-fixed-top + .main-container > .responsive { position: fixed; left: auto; margin-left: auto; }
+ .navbar-fixed-top + .main-container > .menu-toggler + .responsive { position: absolute; left: 190px; margin-left: -190px; }
+ .navbar-fixed-top + .main-container > .menu-toggler + .responsive.sidebar-fixed, .sidebar.responsive.sidebar-fixed, .sidebar.sidebar-fixed.responsive-max { position: fixed; left: auto; margin-left: auto; }
+ .main-container .menu-toggler.fixed { position: fixed; left: auto; z-index: 1026; }
+}
+.sidebar .sidebar-toggle { border-style: solid; border-width: 0px 0px 1px; text-align: center; padding: 3px 0px; position: relative; }
+.sidebar .sidebar-toggle > .ace-icon { padding: 0px 5px; line-height: 18px; cursor: pointer; font-size: 14px; border-radius: 100%; border: 1px solid; position: relative; }
+.sidebar .sidebar-toggle::before { display: block; height: 0px; border-top-width: 1px; border-top-style: solid; border-color: inherit; position: absolute; left: 15px; right: 15px; top: 13px; }
+.sidebar .sidebar-shortcuts { text-align: center; min-height: 40px; margin-bottom: 0px; overflow: hidden; position: relative; border: 0px solid; }
+.sidebar .sidebar-shortcuts:empty { display: none; }
+.sidebar .sidebar-shortcuts-large { line-height: 37px; }
+.sidebar .sidebar-shortcuts-large > .btn { text-align: center; width: 41px; line-height: 24px; padding: 0px; border-width: 4px; }
+.sidebar .sidebar-shortcuts-large > .btn > .ace-icon { margin: 0px; }
+.sidebar .sidebar-shortcuts-mini { display: none; font-size: 0px; width: 42px; padding-top: 2px; padding-bottom: 2px; }
+.sidebar .sidebar-shortcuts-mini > .btn { border-width: 0px; font-size: 0px; line-height: 0; padding: 8px; margin: 1px; border-radius: 0px; opacity: 0.85; }
+@media not all {
+}
+.nav-list li.active > a::after { display: block; position: absolute; right: 0px; top: 4px; border-style: solid; border-color: transparent; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 14px 10px; }
+.nav-list li.open > a::after { display: none; }
+.nav-list li.active.no-active-child > a::after { display: block; }
+.nav-list > li li.active > a::after { top: 2px; border-width: 14px 8px; }
+.nav-list li.active:not(.open) li.active > a::after { display: none !important; }
+@media (min-width: 992px) {
+ .sidebar.compact, .sidebar.compact.navbar-collapse { width: 105px; }
+ .sidebar.compact .sidebar-shortcuts { max-height: 40px; }
+ .sidebar.compact .nav-list > li::before { height: auto; bottom: -1px; }
+ .sidebar.compact .nav-list > li > a { height: auto; line-height: 16px; padding: 2px 0px 8px; text-align: center; }
+ .sidebar.compact .nav-list > li > a > .menu-icon { display: block; margin: 0px; vertical-align: inherit; line-height: 32px; height: 32px; font-size: 20px; }
+ .sidebar.compact .nav-list > li.active > .submenu, .sidebar.compact .nav-list > li.open > .submenu, .sidebar.compact .nav-list > li > a > .arrow { display: none; }
+ .sidebar.compact .nav-list a .badge, .sidebar.compact .nav-list a .label { right: 12px; }
+ .sidebar.compact + .main-content { margin-left: 105px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .sidebar.compact + .main-content { margin-left: 0px; }
+ .sidebar.navbar-collapse.compact .nav-list > li > a { text-align: left; height: 39px; line-height: 37px; padding: 0px 16px 0px 7px; }
+ .sidebar.navbar-collapse.compact .nav-list > li > a > .menu-icon { display: inline-block; vertical-align: sub; height: auto; line-height: inherit; margin: 0px 2px 0px 0px; font-size: 18px; }
+ .sidebar.navbar-collapse.compact .nav-list > li > a > .arrow, .sidebar.navbar-collapse.compact .nav-list > li > a > .menu-text { display: inline; }
+ .sidebar.navbar-collapse.compact + .main-content { margin-left: 0px; }
+}
+@media only screen and (min-width: 992px) {
+ .nav-list li.hover > .submenu { position: absolute; left: 100%; margin-left: -2px; top: -10px; bottom: auto; z-index: 1026; width: 190px; border: 1px solid; display: none !important; padding: 0px 2px; }
+ .nav-list li.hover.hover-show > .submenu, .nav-list li.hover:hover > .submenu { display: block !important; }
+ .nav-list li.hover > .submenu::before, .nav-list li.hover > .submenu > li::before { display: none; }
+ .nav-list li.hover.active > a::after { display: block; }
+ .nav-list li.hover.active.hover-show > a.dropdown-toggle::after, .nav-list li.hover.active:hover > a.dropdown-toggle::after { display: none; }
+ .nav-list li.hover .submenu > li.active > a::after { display: none !important; }
+ .nav-list li.hover > .submenu.bottom { top: auto; bottom: -10px; }
+ .nav-list li.hover > .submenu.bottom::after, .nav-list li.hover > .submenu.bottom::before { top: auto; bottom: 18px; }
+ .nav-list li.hover > .submenu > li > a { margin-top: 2px; margin-bottom: 2px; padding-left: 18px; border-top-width: 0px; }
+ .nav-list > li.hover > .submenu > li.active > a { font-weight: 700; }
+ .nav-list > li > .submenu li.hover > .submenu > li > a { padding-left: 12px !important; margin-left: auto !important; }
+ .nav-list > li > .submenu li.hover > .submenu > li > a > .menu-icon { margin-right: 2px; }
+ .nav-list > li .submenu > li.hover > a { padding-left: 22px; }
+ .nav-list > li .submenu > li.hover > a > .menu-icon { left: 4px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu { position: relative; left: auto; top: auto; z-index: auto; margin: auto; padding: 0px; width: auto; box-shadow: none; border-width: 0px; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu::before, .sidebar.navbar-collapse .nav-list li.hover > .submenu > li::before { display: block; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu li > a { padding-left: 37px; }
+ .sidebar.navbar-collapse .nav-list > li.hover > .submenu { border-top-width: 1px; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu > li > a > .menu-icon { background-color: inherit; margin-right: auto; width: 18px; position: absolute; }
+ .sidebar.navbar-collapse .nav-list > li .submenu > li.hover > a > .menu-icon { left: 10px; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu > li.active > a { font-weight: 400; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu > li.active > a > .menu-icon, .sidebar.navbar-collapse .nav-list li.hover > .submenu > li.hover-show > a > .menu-icon, .sidebar.navbar-collapse .nav-list li.hover > .submenu > li:hover > a > .menu-icon { display: inline-block; }
+ .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu { padding-left: 0px; padding-right: 0px; }
+ .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a { padding-left: 22px !important; margin-left: 20px !important; }
+ .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a > .menu-icon { display: inline-block; width: auto; position: static; background-color: transparent; margin-right: 4px; }
+ .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li.hover > .submenu > li > a { margin-left: 20px !important; padding-left: 38px !important; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu > li > a { border-top-width: 1px; margin-top: 0px; margin-bottom: 0px; }
+ .sidebar.navbar-collapse .nav-list > li.hover > .submenu > li:first-child > a { border-top-width: 0px; }
+ .sidebar.navbar-collapse .nav-list li.hover.hover-show > .submenu, .sidebar.navbar-collapse .nav-list li.hover:hover > .submenu, .sidebar.navbar-collapse .nav-list li.hover > .arrow, .sidebar.navbar-collapse .nav-list li.hover > .submenu { display: none !important; }
+ .sidebar.navbar-collapse .nav-list li.hover.active > .submenu { display: block !important; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu.nav-hide { display: none !important; }
+ .sidebar.navbar-collapse .nav-list li.hover > .submenu.nav-show { display: block !important; }
+ .sidebar.navbar-collapse.compact .nav-list > li.hover.active > a::after { display: none; }
+}
+.nav-list li > .arrow { display: none; position: absolute; top: 8px; right: 1px; z-index: 1027; }
+.nav-list li > .arrow::after, .nav-list li > .arrow::before { border: 10px solid transparent; display: block; height: 0px; width: 0px; position: absolute; left: -19px; top: 0px; right: auto; bottom: auto; content: ""; }
+.nav-list li > .arrow::before { z-index: 1; left: -20px; }
+.nav-list li > .arrow::after { z-index: 2; }
+.nav-list li.hover-show > a + .arrow, .nav-list li:hover > a + .arrow { display: none; }
+@media only screen and (min-width: 992px) {
+ .nav-list li.hover.hover-show > a.dropdown-toggle + .arrow, .nav-list li.hover:hover > a.dropdown-toggle + .arrow { display: block; }
+}
+.sidebar.menu-min, .sidebar.menu-min.compact, .sidebar.menu-min.navbar-collapse { width: 43px; }
+.sidebar.menu-min + .main-content { margin-left: 43px; }
+.sidebar.menu-min .nav-list a .badge, .sidebar.menu-min .nav-list a .label { position: relative; top: -1px; right: auto; left: 4px; }
+.sidebar.menu-min .nav-list .submenu .submenu a .badge, .sidebar.menu-min .nav-list .submenu .submenu a .label { top: 0px; }
+.sidebar.menu-min .nav-list > li > a { position: relative; height: 39px; line-height: 37px; padding: 0px; }
+.sidebar.menu-min .nav-list > li > a > .menu-icon { font-size: 18px; height: auto; line-height: inherit; display: inline-block; vertical-align: sub; margin-right: 0px; width: 44px; }
+.sidebar.menu-min .nav-list > li > a > .menu-text { display: none; text-align: left; position: absolute; top: -1px; left: 42px; z-index: 1025; width: 176px; height: 41px; line-height: 38px; padding-left: 12px; border: 1px solid; }
+.sidebar.menu-min .nav-list > li > a.dropdown-toggle > .menu-text { top: -1px; border-width: 1px 1px 0px; }
+.sidebar.menu-min .nav-list > li > a .arrow { display: none; }
+.sidebar.menu-min .nav-list > li.active.open > a::after, .sidebar.menu-min .nav-list > li.hover-show > a > .menu-text, .sidebar.menu-min .nav-list > li:hover > a > .menu-text { display: block; }
+.sidebar.menu-min .nav-list > li.active > a::after { border-width: 10px 6px; top: 8px; }
+.sidebar.menu-min .nav-list > li.active.open li.active > a::after { display: none; }
+.sidebar.menu-min .nav-list > li > .submenu { position: absolute; z-index: 1026; left: 42px; top: -1px; margin-top: 40px; padding-bottom: 2px; width: 176px; display: none !important; height: auto !important; visibility: visible !important; }
+.sidebar.menu-min .nav-list > li > .submenu::before { display: none; }
+.sidebar.menu-min .nav-list > li > .submenu::after { display: block; height: 1px; width: 1px; position: absolute; right: -1px; top: -1px; border-right-width: 1px; border-right-style: solid; border-right-color: inherit; }
+.sidebar.menu-min .nav-list > li.open > .submenu, .sidebar.menu-min .nav-list > li > .submenu li::before { display: none; }
+.sidebar.menu-min .nav-list > li > .submenu li > a { margin-left: 0px; padding-left: 22px; }
+.sidebar.menu-min .nav-list > li > .submenu li > a > .menu-icon { left: 4px; }
+.sidebar.menu-min .nav-list > li.hover > .submenu { padding-bottom: 0px; }
+.sidebar.menu-min .nav-list > li.hover-show > .submenu, .sidebar.menu-min .nav-list > li:hover > .submenu { display: block !important; }
+.sidebar.menu-min .nav-list > li.hover-show > .arrow, .sidebar.menu-min .nav-list > li:hover > .arrow, .sidebar.menu-min .sidebar-shortcuts-mini { display: block; }
+.sidebar.menu-min .nav-list > li > .arrow { top: 10px; }
+.sidebar.menu-min .nav-list > li > .arrow::after, .sidebar.menu-min .nav-list > li > .arrow::before { border-width: 8px; left: -16px; }
+.sidebar.menu-min .nav-list > li > .arrow::before { left: -17px; }
+.sidebar.menu-min .nav-list li > .arrow { right: -1px; }
+.sidebar.menu-min .sidebar-shortcuts { position: relative; overflow: visible; z-index: 1; }
+.sidebar.menu-min .sidebar-shortcuts-large { display: none; position: absolute; top: 0px; left: 42px; width: 182px; padding: 0px 2px 3px; border-width: 0px 1px 1px; border-style: solid; border-color: currentcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; }
+.sidebar.menu-min .sidebar-shortcuts.hover-show .sidebar-shortcuts-large, .sidebar.menu-min .sidebar-shortcuts:hover .sidebar-shortcuts-large { display: block; }
+.sidebar.menu-min .sidebar-toggle::before { left: 5px; right: 5px; }
+.sidebar.menu-min .sidebar-toggle > .ace-icon { font-size: 13px; padding: 0px 4px; line-height: 15px; border-width: 1px; }
+.sidebar.menu-min .nav-list > li > .submenu li > .submenu > li > a { margin-left: 2px; padding-left: 30px; }
+.sidebar.menu-min .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: 2px; padding-left: 45px; }
+.sidebar.menu-min .nav-list li.active.open > .submenu > li.active > a::after, .sidebar.menu-min .nav-list > li.active.hover-show > a::after, .sidebar.menu-min .nav-list > li.active.open:hover > a::after, .sidebar.menu-min .nav-list > li.active:hover::after, .sidebar.menu-min .nav-list > li.active:hover > a::after, .sidebar.menu-min .nav-list > li > .submenu li.active > a::after { display: none; }
+@media (min-width: 992px) {
+ .sidebar.menu-min .nav-list li.hover > .submenu { margin-left: 0px; }
+ .sidebar.menu-min .nav-list > li > .submenu li.hover > .submenu > li > a, .sidebar.menu-min .nav-list > li > .submenu li > .submenu > li.hover > .submenu > li > a { margin-left: 0px !important; }
+ .sidebar.menu-min.compact .nav-list > li > a { height: 39px; line-height: 37px; padding: 0px 16px 0px 7px; position: relative; }
+ .sidebar.menu-min.compact .nav-list > li > a > .menu-icon { font-size: 18px; height: auto; line-height: inherit; display: inline-block; vertical-align: sub; width: auto; }
+}
+@media only screen and (min-width: 992px) {
+ .navbar.h-navbar { box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.25); }
+ .sidebar.h-sidebar { position: relative; float: none !important; width: auto; margin-top: 17px; border-width: 0px !important; box-shadow: none; }
+ .sidebar.h-sidebar.compact, .sidebar.h-sidebar.menu-min { width: auto; }
+ .sidebar.h-sidebar.sidebar-fixed { position: fixed; }
+ .sidebar.h-sidebar.no-gap { margin-top: auto; }
+ .sidebar.h-sidebar.no-gap .nav-list { padding-top: 3px; }
+ .sidebar.h-sidebar::before { display: block; position: absolute; z-index: -1; left: 0px !important; right: 0px !important; top: -17px; bottom: auto; height: 17px; width: auto; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: inherit; }
+ .main-content .sidebar.h-sidebar .nav-list > li::before, .sidebar.h-sidebar.lower-highlight .nav-list > li::before { top: 0px; }
+ .sidebar.h-sidebar .nav-list { border-width: 0px 0px 2px; border-bottom: 2px solid rgb(121, 176, 206); }
+ .sidebar.h-sidebar .nav-list > li { float: left; border-width: 0px 0px 0px 1px; margin-left: 0px; }
+ .sidebar.h-sidebar .nav-list > li:last-child { border-right-width: 1px; }
+ .sidebar.h-sidebar .nav-list > li::before { left: -1px; right: -1px; bottom: auto; top: -2px; max-width: none; width: auto; height: 2px; border-width: 0px; }
+ .sidebar.h-sidebar .nav-list > li.active::before { display: block; }
+ .sidebar.h-sidebar .nav-list > li.active::after { display: none; }
+ .sidebar.h-sidebar .nav-list > li:first-child { border-left-width: 0px; margin-left: 0px; }
+ .sidebar.h-sidebar .sidebar-shortcuts + .nav-list > li:first-child { border-left-width: 1px; margin-left: -1px; }
+ .sidebar.h-sidebar .nav-list > li > a { line-height: 22px; height: auto; padding: 10px 14px; }
+ .sidebar.h-sidebar .nav-list > li > a > .menu-icon { display: block; margin: 1px 0px 4px; line-height: inherit; width: auto; }
+ .sidebar.h-sidebar .nav-list > li.hover.hover-show > a ~ .arrow, .sidebar.h-sidebar .nav-list > li.hover:hover > a ~ .arrow, .sidebar.h-sidebar .nav-list > li > a > .arrow { display: none; }
+ .sidebar.h-sidebar .nav-list > li.hover.pull_right { float: none !important; }
+ .sidebar.h-sidebar .nav-list > li.hover > .submenu { top: 100%; left: 1px; margin-top: auto; margin-left: -2px; width: 190px; z-index: 1026; }
+ .sidebar.h-sidebar .nav-list > li.hover.pull_right > .submenu { left: auto; right: 1px; }
+ .sidebar.h-sidebar .nav-list > li.hover > .arrow { right: auto; top: auto; left: 24px; bottom: 7px; }
+ .sidebar.h-sidebar .nav-list > li.hover.pull_right > .arrow { left: auto; right: 24px; }
+ .sidebar.h-sidebar .nav-list > li.hover > .arrow::after, .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { border-top-color: transparent; border-bottom-color: transparent; border-left-color: transparent !important; border-right-color: transparent !important; right: auto !important; left: -10px !important; border-width: 0px 8px 8px !important; }
+ .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { top: -1px !important; }
+ .sidebar.h-sidebar .nav-list > li.hover.hover-show > a.dropdown-toggle ~ .arrow, .sidebar.h-sidebar .nav-list > li.hover:hover > a.dropdown-toggle ~ .arrow { display: block; }
+ .sidebar.h-sidebar .nav-list > li.hover-flip > .submenu { left: auto; right: 1px; margin-left: auto; margin-right: -2px; }
+ .sidebar.h-sidebar .nav-list > li.hover-flip > .arrow { left: auto; right: 24px; }
+ .sidebar.h-sidebar .nav-list li li.hover-flip > .submenu { left: auto; right: 100%; margin-left: auto; margin-right: -2px; }
+ .sidebar.h-sidebar .nav-list li li.hover-flip > .arrow { transform: scale(-1, 1); left: 0px; right: auto; }
+ .sidebar.h-sidebar .sidebar-shortcuts-large::after, .sidebar.h-sidebar .sidebar-shortcuts-large::before { display: block; content: ""; position: absolute; left: 50%; margin-left: -8px; border-style: solid; border-color: transparent; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 8px 8px; }
+ .sidebar.h-sidebar .sidebar-shortcuts-large::after { border-right-color: transparent; top: -8px; }
+ .sidebar.h-sidebar .sidebar-shortcuts-large::before { border-bottom-color: rgb(204, 204, 204); top: -9px; }
+ .sidebar.h-sidebar .sidebar-toggle { position: absolute; top: 12px; right: 6px; background-color: transparent; border-width: 0px; }
+ .sidebar.h-sidebar .sidebar-shortcuts { float: left; display: block; overflow: visible; position: relative; margin: 0px; padding: 12px 8px 9px; max-height: none !important; background-color: transparent; }
+ .sidebar.h-sidebar .sidebar-shortcuts.hover-show .sidebar-shortcuts-large, .sidebar.h-sidebar .sidebar-shortcuts:hover .sidebar-shortcuts-large { display: block; }
+ .sidebar.h-sidebar .sidebar-shortcuts-large { display: none; width: 52px; height: auto; position: absolute; z-index: 1025; top: 100%; margin-top: -5px; left: 10px; padding: 3px 2px; border: 1px solid; }
+ .sidebar.h-sidebar .sidebar-shortcuts-mini { width: auto; max-width: 52px; display: block; background-color: transparent; padding-top: 3px; padding-bottom: 5px; }
+ .sidebar.h-sidebar .sidebar-shortcuts-mini > .btn { padding: 9px; }
+ .sidebar.h-sidebar .nav-list a .badge, .sidebar.h-sidebar .nav-list a .label { position: absolute; top: 11px; right: auto !important; left: 50%; margin-left: 10px; }
+ .sidebar.h-sidebar + .main-content { margin-left: 0px; }
+ .sidebar.h-sidebar + .main-content .breadcrumbs { margin: 6px 9px; border: 1px solid rgb(229, 229, 229); }
+ .h-sidebar.sidebar-fixed { top: auto; width: 100%; left: 0px; right: 0px; }
+ .h-sidebar.sidebar-fixed::before { z-index: auto; }
+ .h-sidebar.sidebar-fixed, .h-sidebar.sidebar-fixed .nav-list { border-right-width: 0px; border-left-width: 0px; }
+ .h-sidebar.sidebar-fixed .sidebar-shortcuts { border-width: 0px; }
+ .h-sidebar.sidebar-fixed + .main-content { padding-top: 88px; }
+ .h-sidebar.sidebar-fixed.no-gap + .main-content { padding-top: 74px; }
+ .h-sidebar.sidebar-fixed.menu-min + .main-content { padding-top: 63px; }
+ .h-sidebar.sidebar-fixed.menu-min.no-gap + .main-content { padding-top: 49px; }
+}
+@media only screen and (min-width: 992px) and (max-width: 991px) {
+ .sidebar.h-sidebar + .main-content .breadcrumbs { margin: 0px; border-width: 0px 0px 1px; }
+}
+.main-container.container .h-sidebar.sidebar-fixed { left: 0px; right: 0px; width: auto; }
+@media (min-width: 768px) {
+ .main-container.container .h-sidebar.sidebar-fixed { left: auto !important; right: auto !important; width: 744px; }
+}
+@media (min-width: 992px) {
+ .main-container.container .h-sidebar.sidebar-fixed { width: 964px; }
+}
+@media (min-width: 1200px) {
+ .main-container.container .h-sidebar.sidebar-fixed { width: 1164px; }
+}
+@media (min-width: 992px) {
+ .sidebar.h-sidebar.menu-min .nav.nav-list > li > a, .sidebar.h-sidebar.menu-min.compact .nav.nav-list > li > a { padding: 9px 12px; }
+ .sidebar.h-sidebar.menu-min .nav-list > li > a > .menu-text { left: -1px; top: 100%; width: 190px; }
+ .sidebar.h-sidebar.menu-min .nav-list > li > a > .menu-icon { margin: 2px 0px; }
+ .sidebar.h-sidebar.menu-min .nav-list > li.hover > .submenu { top: 100%; margin-top: 41px; }
+ .sidebar.h-sidebar.menu-min .nav-list > li.hover.hover-show > a ~ .arrow, .sidebar.h-sidebar.menu-min .nav-list > li.hover:hover > a ~ .arrow { display: block; }
+ .sidebar.h-sidebar.menu-min .sidebar-toggle { top: 6px; }
+ .sidebar.h-sidebar.menu-min .sidebar-shortcuts { padding: 0px; }
+ .sidebar.h-sidebar.menu-min .sidebar-shortcuts-mini { padding-bottom: 4px; padding-top: 4px; }
+ .sidebar.h-sidebar.menu-min .sidebar-shortcuts-mini > .btn { padding: 8px; }
+ .sidebar.h-sidebar.menu-min .sidebar-shortcuts-large { left: 1px; margin-top: 4px; }
+ .sidebar.h-sidebar.compact .nav-list > li > a > .menu-icon { font-size: 18px; height: auto; }
+ .sidebar.h-sidebar.compact.menu-min .nav-list > li > a { height: auto; line-height: 22px; }
+}
+.main-container .menu-toggler { display: none; }
+@media only screen and (max-width: 991px) {
+ .sidebar.responsive::before { display: none; }
+ .sidebar.responsive { box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.15); z-index: 1027; overflow: hidden; max-height: 0px; transform: translateX(-200px); transition: transform 0.2s linear 0s, max-height 0s linear 0.2s; position: relative; bottom: auto; left: 190px; margin-left: -190px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .sidebar.responsive.compact { transform: translateX(-115px); }
+ .navbar.navbar-fixed-top + .main-container .sidebar.responsive.compact.push_away.display ~ .footer .footer-inner, .sidebar.responsive.compact.push_away.display + .main-content { transform: translateX(105px); }
+}
+@media only screen and (max-width: 991px) {
+ .sidebar.responsive.menu-min { transform: translateX(-53px); }
+ .sidebar.responsive.display { transform: none !important; overflow: visible; max-height: 2000px; transition-delay: 0s; }
+ .sidebar.responsive.push_away { box-shadow: none !important; }
+ .sidebar.responsive.push_away::before { display: block !important; }
+ .sidebar.responsive.push_away + .main-content { transition: transform 0.2s linear 0s; }
+ .sidebar.responsive.push_away.display + .main-content { transform: translateX(190px); }
+ .sidebar.responsive.push_away.display.menu-min + .main-content { transform: translateX(43px); }
+ .navbar.navbar-fixed-top + .main-container .sidebar.responsive.push_away::before { height: 5000px; }
+ .navbar.navbar-fixed-top + .main-container .sidebar.responsive.push_away ~ .footer .footer-inner { transition: transform 0.2s linear 0s; }
+ .navbar.navbar-fixed-top + .main-container .sidebar.responsive.push_away.display ~ .footer .footer-inner { transform: translateX(190px); }
+ .navbar.navbar-fixed-top + .main-container .sidebar.responsive.push_away.display.menu-min ~ .footer .footer-inner { transform: translateX(43px); }
+ .sidebar.responsive + .main-content { margin-left: 0px !important; margin-right: 0px !important; }
+ .responsive.sidebar-fixed { position: fixed; }
+ .main-container .menu-toggler.fixed { position: fixed; left: auto; z-index: 1026; backface-visibility: hidden; }
+}
+@media only screen and (min-width: 768px) and (max-width: 991px) {
+ .main-container.container .sidebar.responsive { transition: none 0s ease 0s ; display: none; }
+ .main-container.container .sidebar.responsive::before { display: none !important; }
+ .main-container.container .sidebar.responsive.display { display: block; }
+ .main-container.container .sidebar.responsive.push_away + .main-content, .main-container.container .sidebar.responsive.push_away ~ .footer .footer-inner { transition: none 0s ease 0s !important; transform: none !important; }
+}
+@media only screen and (max-width: 991px) {
+ .menu-toggler + .sidebar.responsive { margin-top: 40px; }
+ .main-container .menu-toggler { display: block; position: absolute; z-index: 1026; width: 52px; height: 32px; margin-right: 2px; line-height: normal; padding-left: 33px; padding-top: 7px; padding-bottom: 1px; font-size: 13px; font-weight: 700; text-transform: uppercase; box-sizing: content-box; }
+ .main-container .menu-toggler::after, .main-container .menu-toggler::before { content: ""; height: 2px; width: 24px; left: 4px; position: absolute; }
+ .main-container .menu-toggler:hover { text-decoration: none; }
+ .main-container .menu-toggler:focus { outline: 0px none; }
+ .main-container .menu-toggler::before { border-top: 1px solid rgb(135, 184, 127); border-bottom: 1px solid rgb(111, 179, 224); z-index: 1; top: 13px; transition: all 0.1s ease 0s; box-sizing: content-box; }
+ .main-container .menu-toggler::after { border-top: 1px solid rgb(255, 162, 77); border-bottom: 1px solid rgb(209, 91, 71); top: 19px; transition: all 0.1s ease 0s; box-sizing: content-box; }
+ .main-container .menu-toggler.display::before { height: 4px; top: 8px; border-width: 2px; }
+ .main-container .menu-toggler.display::after { height: 4px; top: 20px; border-width: 2px; }
+ .main-container .menu-toggler > .toggler-text { display: block; position: absolute; bottom: -9px; left: 0px; border-style: solid; border-color: rgb(68, 68, 68) transparent transparent; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 9px 42px 0px; }
+ .main-container .menu-toggler > .toggler-text::after { display: block; content: "MENU"; color: rgb(255, 255, 255); position: absolute; left: -8px; top: -41px; }
+ .menu-toggler + .responsive.sidebar-scroll .nav-wrap { overflow: hidden; }
+}
+@media only screen and (max-width: 320px) {
+ .main-container .menu-toggler { width: 0px; }
+ .main-container .menu-toggler > .toggler-text { border-width: 7px 16px; bottom: -14px; }
+ .main-container .menu-toggler > .toggler-text::after { font-size: 9px; font-weight: 400; color: rgb(255, 255, 255); position: absolute; left: -13px; top: -42px; }
+ .main-container .menu-toggler::after, .main-container .menu-toggler::before { margin-top: 8px; }
+ .main-container .menu-toggler.display::after, .main-container .menu-toggler.display::before { height: 2px; border-width: 1px; }
+ .main-container .menu-toggler.display::before { top: 13px; }
+ .main-container .menu-toggler.display::after { top: 19px; }
+}
+.sidebar-toggle.sidebar-expand { display: none; }
+@media (max-width: 991px) {
+ .menu-toggler.invisible { position: fixed; z-index: -999; visibility: hidden; opacity: 0; width: 1px; height: 1px; }
+ .sidebar.responsive-min, .sidebar.responsive-min.compact, .sidebar.responsive-min.navbar-collapse { width: 43px; }
+ .sidebar.responsive-min .nav-list a .badge, .sidebar.responsive-min .nav-list a .label { position: relative; top: -1px; right: auto; left: 4px; }
+ .sidebar.responsive-min .nav-list .submenu .submenu a .badge, .sidebar.responsive-min .nav-list .submenu .submenu a .label { top: 0px; }
+ .sidebar.responsive-min .nav-list > li > a { position: relative; height: 39px; line-height: 37px; padding: 0px; }
+ .sidebar.responsive-min .nav-list > li > a > .menu-icon { font-size: 18px; height: auto; line-height: inherit; display: inline-block; vertical-align: sub; margin-right: 0px; width: 44px; }
+ .sidebar.responsive-min .nav-list > li > a > .menu-text { display: none; text-align: left; position: absolute; top: -1px; left: 42px; z-index: 1025; width: 176px; height: 41px; line-height: 38px; padding-left: 12px; border: 1px solid; }
+ .sidebar.responsive-min .nav-list > li > a.dropdown-toggle > .menu-text { top: -1px; border-width: 1px 1px 0px; }
+ .sidebar.responsive-min .nav-list > li > a .arrow { display: none; }
+ .sidebar.responsive-min .nav-list > li.active.open > a::after, .sidebar.responsive-min .nav-list > li.hover-show > a > .menu-text, .sidebar.responsive-min .nav-list > li:hover > a > .menu-text { display: block; }
+ .sidebar.responsive-min .nav-list > li.active > a::after { border-width: 10px 6px; top: 8px; }
+ .sidebar.responsive-min .nav-list > li.active.open li.active > a::after { display: none; }
+ .sidebar.responsive-min .nav-list > li > .submenu { position: absolute; z-index: 1026; left: 42px; top: -1px; margin-top: 40px; padding-bottom: 2px; width: 176px; display: none !important; height: auto !important; visibility: visible !important; }
+ .sidebar.responsive-min .nav-list > li > .submenu::before { display: none; }
+ .sidebar.responsive-min .nav-list > li > .submenu::after { content: ""; display: block; height: 1px; width: 1px; position: absolute; right: -1px; top: -1px; border-right-width: 1px; border-right-style: solid; border-right-color: inherit; }
+ .sidebar.responsive-min .nav-list > li.open > .submenu, .sidebar.responsive-min .nav-list > li > .submenu li::before { display: none; }
+ .sidebar.responsive-min .nav-list > li > .submenu li > a { margin-left: 0px; padding-left: 22px; }
+ .sidebar.responsive-min .nav-list > li > .submenu li > a > .menu-icon { left: 4px; }
+ .sidebar.responsive-min .nav-list > li.hover > .submenu { padding-bottom: 0px; }
+ .sidebar.responsive-min .nav-list > li.hover-show > .submenu, .sidebar.responsive-min .nav-list > li:hover > .submenu { display: block !important; }
+ .sidebar.responsive-min .nav-list > li.hover-show > .arrow, .sidebar.responsive-min .nav-list > li:hover > .arrow, .sidebar.responsive-min .sidebar-shortcuts-mini { display: block; }
+ .sidebar.responsive-min .nav-list > li > .arrow { top: 10px; }
+ .sidebar.responsive-min .nav-list > li > .arrow::after, .sidebar.responsive-min .nav-list > li > .arrow::before { border-width: 8px; left: -16px; }
+ .sidebar.responsive-min .nav-list > li > .arrow::before { left: -17px; }
+ .sidebar.responsive-min .nav-list li > .arrow { right: -1px; }
+ .sidebar.responsive-min .sidebar-shortcuts { position: relative; overflow: visible; z-index: 1; }
+ .sidebar.responsive-min .sidebar-shortcuts-large { display: none; position: absolute; top: 0px; left: 42px; width: 182px; padding: 0px 2px 3px; border-width: 0px 1px 1px; border-style: solid; border-color: currentcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; }
+ .sidebar.responsive-min .sidebar-shortcuts.hover-show .sidebar-shortcuts-large, .sidebar.responsive-min .sidebar-shortcuts:hover .sidebar-shortcuts-large { display: block; }
+ .sidebar.responsive-min .sidebar-toggle::before { left: 5px; right: 5px; }
+ .sidebar.responsive-min .sidebar-toggle > .ace-icon { font-size: 13px; padding: 0px 4px; line-height: 15px; border-width: 1px; }
+ .sidebar.responsive-min .nav-list > li > .submenu li > .submenu > li > a { margin-left: 2px; padding-left: 30px; }
+ .sidebar.responsive-min .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: 2px; padding-left: 45px; }
+ .sidebar.responsive-min .nav-list li.active.open > .submenu > li.active > a::after, .sidebar.responsive-min .nav-list > li.active.hover-show > a::after, .sidebar.responsive-min .nav-list > li.active.open:hover > a::after, .sidebar.responsive-min .nav-list > li.active:hover::after, .sidebar.responsive-min .nav-list > li.active:hover > a::after, .sidebar.responsive-min .nav-list > li > .submenu li.active > a::after { display: none; }
+ .sidebar.responsive-min::before { display: block; }
+ .sidebar.responsive-min .sidebar-toggle.sidebar-collapse { display: none; }
+ .sidebar.responsive-min .sidebar-toggle.sidebar-expand { display: block; }
+ .sidebar.responsive-min + .main-content { margin-left: 43px !important; }
+ .rtl .sidebar.responsive-min + .main-content { margin-left: auto !important; margin-right: 43px !important; }
+ .sidebar.responsive-min + .main-content .breadcrumb { margin-left: 12px; }
+ .sidebar.responsive-max { display: block; position: relative; left: 190px; margin-left: -190px; z-index: 1027; box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.15); }
+ .sidebar.responsive-max .sidebar-toggle.sidebar-collapse, .sidebar.responsive-max::before { display: none; }
+ .sidebar.responsive-max .sidebar-toggle.sidebar-expand { display: block; z-index: 1; }
+ .sidebar.responsive-max + .main-content { margin-left: 43px !important; }
+ .sidebar.responsive-max + .main-content .breadcrumb { margin-left: 12px; }
+}
+@media only screen and (min-width: 992px) {
+ .sidebar.navbar-collapse { max-height: none; }
+}
+@media only screen and (max-width: 991px) {
+ .sidebar.navbar-collapse { position: relative; float: none !important; margin-top: auto !important; z-index: 1; width: 100% !important; max-height: 340px; margin-left: 0px; margin-right: 0px; }
+ .sidebar.navbar-collapse::before { display: none; }
+ .sidebar.navbar-collapse .nav-list > li:last-child { border-bottom-width: 0px; }
+ .sidebar.navbar-collapse .nav-list > li > a { padding-top: 10px !important; padding-bottom: 10px !important; line-height: 20px; height: 41px; }
+ .sidebar.navbar-collapse .nav-list > li::before { height: 43px; }
+ .sidebar.navbar-collapse li > .arrow { display: none !important; }
+ .sidebar.navbar-collapse .nav-wrap + .ace-scroll, .sidebar.navbar-collapse .sidebar-toggle { display: none; }
+ .sidebar.navbar-collapse .nav-list li > .submenu { border-left-width: 0px; }
+ .sidebar.navbar-collapse .sidebar-shortcuts { padding: 3px 0px 6px; max-height: none; border-bottom-width: 0px; }
+ .sidebar.navbar-collapse + .main-content { margin-left: 0px !important; margin-right: 0px !important; }
+ .sidebar.navbar-collapse + .main-content .breadcrumb { margin-left: 12px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu { position: relative; left: auto; top: auto; width: auto; z-index: auto; margin-top: auto; padding-top: 0px; padding-bottom: 0px; border-width: 1px 0px 0px !important; box-shadow: none !important; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu::before, .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu > li::before { display: block; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > a > .menu-icon { left: 10px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu::after { display: none; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > a { padding: 7px 0px 9px 37px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > .submenu > li > a { margin-left: 20px; padding-left: 22px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu li > .submenu > li > .submenu > li > a { margin-left: 20px; padding-left: 38px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > a:hover::before { width: 3px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > a { text-align: left; padding-left: 7px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > a > .menu-icon { display: inline-block; width: auto; margin-right: 2px; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > a > .menu-text { position: relative; display: inline; line-height: normal; padding-left: 0px; height: auto; top: auto; left: auto; z-index: auto; width: auto; border-width: 0px !important; background-color: transparent !important; box-shadow: none !important; }
+ .sidebar.navbar-collapse.menu-min .nav-list a > .arrow { display: block; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li:hover > .submenu { display: none !important; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li.active > .submenu, .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu.nav-show { display: block !important; }
+ .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu.nav-hide { display: none !important; }
+ .sidebar.navbar-collapse.menu-min .sidebar-shortcuts-large { display: block; position: static; box-shadow: none !important; border-width: 0px !important; background-color: transparent !important; width: auto; padding: 0px; }
+ .sidebar.navbar-collapse.menu-min .sidebar-shortcuts-mini { display: none; }
+ .sidebar.navbar-collapse .nav-list a .badge, .sidebar.navbar-collapse .nav-list a .label { position: relative; top: -1px; right: auto; left: 4px; }
+ .sidebar.navbar-collapse .nav-list li.active > a::after, .sidebar.navbar-collapse .nav-list li.active > a::before, .sidebar.navbar-collapse .nav-list > li.active::after, .sidebar.navbar-collapse .nav-list > li.highlight.active > a::after, .sidebar.navbar-collapse .nav-list > li.highlight.active > a::before { display: none !important; }
+}
+@media (max-width: 991px) and (max-height: 400px) {
+ .sidebar.navbar-collapse { max-height: 300px; }
+}
+@media (max-width: 991px) and (max-height: 350px) {
+ .sidebar.navbar-collapse { max-height: 250px; }
+}
+@media (max-width: 991px) and (max-height: 300px) {
+ .sidebar.navbar-collapse { max-height: 200px; }
+}
+@media (max-width: 991px) and (max-height: 250px) {
+ .sidebar.navbar-collapse { max-height: 150px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .sidebar.navbar-collapse .nav-list > li > .submenu li.hover > .submenu > li > a, .sidebar.navbar-collapse .nav-list > li > .submenu li > .submenu > li.hover > .submenu > li > a { margin-left: 20px !important; }
+}
+@media (max-width: 991px) {
+ .navbar-fixed-top + .main-container .sidebar.navbar-collapse { position: fixed; z-index: 1027; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .navbar-fixed-top + .main-container.container .sidebar.navbar-collapse { width: 744px !important; }
+}
+.main-content-inner { float: left; width: 100%; }
+.main-content .sidebar::before { top: 150px; }
+@media only screen and (min-width: 992px) {
+ body.mob-safari .sidebar.h-sidebar + .main-content .sidebar.sidebar-fixed:not(.h-sidebar) { top: 131px; }
+ body.mob-safari .sidebar.h-sidebar.no-gap + .main-content .sidebar.sidebar-fixed:not(.h-sidebar) { top: 114px; }
+ body.mob-safari .sidebar.h-sidebar.menu-min + .main-content .sidebar.sidebar-fixed:not(.h-sidebar) { top: 106px; }
+ body.mob-safari .sidebar.h-sidebar.menu-min.no-gap + .main-content .sidebar.sidebar-fixed:not(.h-sidebar) { top: 89px; }
+ .h-navbar.navbar-fixed-top + .main-container .sidebar:not(.h-sidebar)::before { top: 150px; }
+ .h-navbar.navbar-fixed-top + .main-container .sidebar:not(.h-sidebar) .nav-list { padding-top: 3px; }
+ .h-navbar.navbar-fixed-top + .main-container .sidebar:not(.h-sidebar) .sidebar-shortcuts ~ .nav-list, .h-navbar.navbar-fixed-top + .main-container .sidebar:not(.h-sidebar) .sidebar-shortcuts ~ .nav-wrap-up .nav-list { padding-top: 0px; }
+ .h-navbar.navbar-fixed-top + .main-container .sidebar:not(.h-sidebar) .sidebar-shortcuts { padding-top: 3px; min-height: 43px; }
+ .h-navbar.navbar-fixed-top + .main-container .sidebar.menu-min:not(.h-sidebar) .sidebar-shortcuts-large { line-height: 40px; }
+ .h-navbar.navbar-fixed-top + .main-container .main-content .sidebar:not(.h-sidebar) .nav-list { padding-top: 0px; }
+ .h-navbar.navbar-fixed-top + .main-container .main-content .sidebar.sidebar-fixed { z-index: 1026; }
+ .main-content .h-sidebar { padding-top: 1px; margin-top: 0px; }
+ .main-content .h-sidebar::before { display: none; }
+ .main-content .h-sidebar + .page-content { margin-left: auto; }
+ .main-content .h-sidebar.sidebar-fixed { left: 190px; }
+ .main-content .h-sidebar.sidebar-fixed + .page-content { margin-top: 74px; }
+ .main-content .h-sidebar.sidebar-fixed.menu-min + .page-content { margin-top: 49px; }
+ .main-content .h-sidebar.menu-min .nav-list > li > a { padding: 8px 12px 7px; }
+ .sidebar.compact + .main-content .h-sidebar.sidebar-fixed { left: 105px; }
+ .sidebar.menu-min + .main-content .h-sidebar.sidebar-fixed { left: 43px; }
+ .navbar.navbar-fixed-top + .main-container .main-content .h-sidebar.sidebar-fixed { padding-top: 3px; }
+}
+.container.main-container .sidebar + .main-content .h-sidebar.sidebar-fixed { left: auto; right: auto; }
+@media (min-width: 992px) {
+ .container.main-container .sidebar.compact + .main-content .h-sidebar.sidebar-fixed { width: 859px; }
+ .container.main-container .main-content .h-sidebar.sidebar-fixed { width: 964px; }
+ .container.main-container .sidebar + .main-content .h-sidebar.sidebar-fixed { width: 774px; }
+ .container.main-container .sidebar.menu-min + .main-content .h-sidebar.sidebar-fixed { width: 921px; }
+}
+@media (min-width: 1200px) {
+ .container.main-container .sidebar.compact + .main-content .h-sidebar.sidebar-fixed { width: 1059px; }
+ .container.main-container .main-content .h-sidebar.sidebar-fixed { width: 1164px; }
+ .container.main-container .sidebar + .main-content .h-sidebar.sidebar-fixed { width: 974px; }
+ .container.main-container .sidebar.menu-min + .main-content .h-sidebar.sidebar-fixed { width: 1121px; }
+}
+@media only screen and (max-width: 991px) {
+ .main-container .main-content .sidebar.sidebar-fixed { z-index: 1026; }
+ .navbar-fixed-top + .main-container .main-content .sidebar { position: fixed; z-index: 1026; }
+}
+.sidebar-scroll .sidebar-shortcuts { min-height: 41px; border-bottom: 1px solid; }
+.sidebar-scroll .sidebar-toggle { border-top: 1px solid; }
+.sidebar-scroll .nav-list > li:first-child { border-top-width: 0px; }
+.sidebar-scroll .nav-list > li:last-child { border-bottom-width: 0px; }
+.sidebar-scroll .nav-wrap .sidebar-shortcuts { min-height: 40px; border-bottom-width: 0px; }
+.sidebar-scroll .nav-wrap .sidebar-shortcuts + .nav-list > li:first-child, .sidebar-scroll .nav-wrap .sidebar-shortcuts + .nav-wrap-up .nav-list > li:first-child { border-top-width: 1px; }
+.sidebar-scroll .nav-wrap-t .sidebar-toggle { border-top-width: 0px; }
+.sidebar-scroll .nav-wrap-t .nav-list > li:last-child { border-bottom-width: 1px; }
+.sidebar .nav-wrap + .ace-scroll { position: absolute; right: 0px; top: 0px; z-index: 1; }
+.sidebar .nav-wrap + .scrollout { right: -8px; }
+.sidebar .submenu.sub-scroll { overflow-y: scroll; overflow-x: hidden; }
+.ace-scroll, .scroll-content { overflow: hidden; }
+.scroll-content { position: static; }
+.scroll-disabled.ace-scroll, .scroll-disabled.ace-scroll .scroll-content { overflow: visible; }
+.scroll-track { position: absolute; top: auto; bottom: auto; right: 0px; height: auto; background-color: rgb(231, 231, 231); z-index: 99; width: 0px; opacity: 0; }
+.scroll-bar { position: absolute; top: 0px; left: 0px; width: inherit; background: rgb(187, 212, 229) none repeat scroll 0% 0%; }
+.scroll-track.scroll-hz { top: auto; left: auto; right: auto; bottom: 0px; height: 8px; width: auto; }
+.scroll-hz .scroll-bar { height: inherit; width: auto; }
+.scroll-track.scroll-active { transition: width 0.25s ease 0.75s, opacity 0.25s ease 0.75s; }
+.ace-scroll:hover .scroll-active, .scroll-active.scroll-track.active, .scroll-active.scroll-track.scroll-hover, .scroll-active.scroll-track:active, .scroll-active.scroll-track:hover { width: 8px; opacity: 1; transition-duration: 0.15s; transition-delay: 0s; }
+.scroll-track.active > .scroll-bar { transition-property: none !important; transition-duration: 0s !important; }
+.scroll-track.scroll-margin { margin-left: -1px; }
+.scroll-track.scroll-left { right: auto; left: 0px; }
+.scroll-track.scroll-left.scroll-margin { margin-left: 1px; }
+.scroll-track.scroll-top { bottom: auto; top: 0px; }
+.scroll-track.scroll-top.scroll-margin { top: 1px; }
+.scroll-dark .scroll-bar { background-color: rgba(0, 0, 0, 0.25); }
+.scroll-track.scroll-dark { background-color: rgba(0, 0, 0, 0.15); }
+.scroll-light .scroll-bar { background-color: rgba(0, 0, 0, 0.14); }
+.scroll-track.scroll-light { background-color: rgba(0, 0, 0, 0.07); }
+.scroll-white .scroll-bar { background-color: rgba(255, 255, 255, 0.33); }
+.scroll-track.scroll-white { background-color: rgba(255, 255, 255, 0.2); }
+.no-track.scroll-track { background-color: transparent; }
+.scroll-track.scroll-visible { opacity: 1; width: 8px; }
+.scroll-hz.scroll-visible { height: 8px; width: auto; }
+.ace-scroll:hover .scroll-thin.scroll-track, .scroll-thin.scroll-track.active, .scroll-thin.scroll-track.scroll-hover, .scroll-thin.scroll-track.scroll-visible, .scroll-thin.scroll-track:active, .scroll-thin.scroll-track:hover { width: 6px; }
+.ace-scroll:hover .scroll-thin.scroll-hz, .scroll-thin.scroll-hz.active, .scroll-thin.scroll-hz.scroll-hover, .scroll-thin.scroll-hz.scroll-visible, .scroll-thin.scroll-hz:active, .scroll-thin.scroll-hz:hover { width: auto; height: 6px; }
+.scroll-chrome.scroll-active .scroll-bar { background-color: transparent; width: 11px; }
+.scroll-chrome.scroll-active .scroll-bar::before { display: block; content: ""; position: absolute; top: 1px; bottom: 3px; left: 1px; right: 1px; background-color: rgb(217, 217, 217); border: 1px solid rgb(187, 187, 187); border-radius: 1px; }
+.scroll-chrome.scroll-active .scroll-track { width: 12px; background-color: rgb(242, 242, 242); border-style: solid; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 0px 1px 1px; border-color: rgb(230, 230, 230) transparent rgb(230, 230, 230) rgb(219, 219, 219); }
+.scroll-chrome.scroll-active .scroll-track:hover .scroll-bar::before { background-color: silver; border-color: rgb(166, 166, 166); }
+.scroll-chrome.scroll-active .scroll-track.active .scroll-bar::before { background-color: rgb(169, 169, 169); border-color: rgb(139, 139, 139); }
+.scroll-active.scroll-track.idle-hide { opacity: 0; width: 8px; }
+.scroll-active.scroll-track.idle-hide.not-idle { width: 8px; opacity: 1; }
+.scroll-active.scroll-thin.scroll-track.idle-hide { width: 6px; }
+.scroll-active.scroll-chrome .scroll-track.idle-hide { width: 12px; }
+.nav-wrap + .scroll-active .scroll-track { width: 8px; }
+.nav-scroll.scroll-active .scroll-track { width: 8px; right: 0px; }
+.nav-scroll.scroll-active:hover .scroll-track, .nav-wrap:hover + .scroll-active .scroll-track { width: 8px; opacity: 1; transition-duration: 0.15s; transition-delay: 0s; }
+.nav-scroll.scroll-active:hover .scroll-track { width: 8px; }
+.nav-scroll.ace-scroll, .nav-scroll.ace-scroll .scroll-content { overflow: hidden; }
+.modal.aside-vc, .nav-scroll.ace-scroll.scroll-disabled, .nav-scroll.ace-scroll.scroll-disabled .scroll-content { overflow: visible; }
+.scroll-track.scroll-detached { position: absolute; z-index: 1029; bottom: auto; right: auto; }
+.modal-content { border-radius: 0px; box-shadow: none; }
+.modal-footer { padding-top: 12px; padding-bottom: 14px; border-top-color: rgb(228, 233, 238); box-shadow: none; background-color: rgb(239, 243, 248); }
+.modal-header .close { font-size: 32px; }
+.modal-body.padding-25 { padding-left: 25px; padding-right: 25px; }
+.modal.aside-dark .modal-content { background-color: rgba(0, 0, 0, 0.85); }
+.modal.aside { z-index: 999; position: absolute; }
+.aside.aside-contained, .modal.aside-fixed.aside-vc, .modal.aside.in { position: fixed; }
+.navbar-fixed-top ~ .modal.aside-vc { z-index: 1025; }
+.modal.aside-fixed.aside-hz, .navbar-fixed-bottom ~ .modal.aside-hz, .navbar-fixed-top ~ .modal.aside-hz { position: fixed; z-index: 1049; }
+.modal.aside.in { z-index: 1050; }
+.modal.aside-vc { margin: auto; width: 0px; left: auto; right: auto; top: 0px; bottom: 0px; display: block !important; }
+.modal.in.aside-vc { width: 100%; }
+.modal.aside-vc .modal-dialog { margin: inherit; overflow: inherit; width: 250px; max-width: 66%; height: inherit; position: inherit; right: inherit; top: inherit; bottom: inherit; left: inherit; opacity: 1; transition: -webkit-transform 0.3s ease-out 0s; }
+@media only screen and (max-width: 319px) {
+ .modal.aside-vc .modal-dialog { max-width: none; width: 200px; }
+ .aside-contained.aside-vc .modal-dialog { width: 180px; }
+}
+@media only screen and (max-width: 240px) {
+ .modal.aside-vc .modal-dialog { max-width: none; width: 160px; }
+ .aside-contained.aside-vc .modal-dialog { width: 140px; }
+}
+.modal.aside-vc .modal-content { height: 100%; overflow: hidden; }
+.modal.in.aside-vc .modal-dialog { transform: none; height: auto; }
+.modal.aside-vc .aside-trigger { position: absolute; top: 155px; right: auto; left: auto; bottom: auto; margin-top: -1px; width: 37px; outline: 0px none; }
+.modal.aside-vc .aside-trigger.ace-settings-btn { width: 42px; }
+.modal.in.aside-vc .aside-trigger { z-index: -1; }
+.aside.modal.in .modal-backdrop.in + .modal-dialog .aside-trigger { z-index: auto; }
+@media only screen and (max-height: 240px) {
+ .modal.aside-vc .aside-trigger { top: 130px; }
+}
+.modal.aside-vc.navbar-offset .modal-dialog { top: 45px; }
+.modal.aside-vc.navbar-offset .modal-dialog .aside-trigger { top: 110px; }
+@media (max-width: 479px) {
+ .navbar:not(.navbar-collapse) ~ .modal.aside-vc.navbar-offset .modal-dialog { top: 90px; }
+}
+.modal.aside-right { right: 0px; }
+.modal.aside-right .modal-content { border-width: 0px 0px 0px 1px; box-shadow: -2px 1px 2px 0px rgba(0, 0, 0, 0.15); }
+.modal.aside-right .aside-trigger { right: 100%; }
+.modal.aside-right .modal-dialog { transform: translateX(100%); }
+.modal.aside-left { left: 0px; }
+.modal.aside-left .modal-content { border-width: 0px 1px 0px 0px; box-shadow: 2px -1px 2px 0px rgba(0, 0, 0, 0.15); }
+.modal.aside-left .aside-trigger { left: 100%; }
+.modal.aside-right .aside-trigger.btn.ace-settings-btn { border-radius: 6px 0px 0px 6px; }
+.modal.aside-left .aside-trigger.btn.ace-settings-btn { border-radius: 0px 6px 6px 0px; }
+.modal.aside-left .modal-dialog { transform: translateX(-100%); }
+.modal.aside-hz { margin: auto; height: 0px; left: 0px; right: 0px; top: auto; bottom: auto; display: block !important; overflow: visible; }
+.aside.aside-hidden .modal-content, .wz-finish.ng-hide, .wz-next.ng-hide { display: none; }
+.modal.in.aside-hz { height: 100%; }
+.modal.aside-hz .modal-dialog { margin: inherit; height: auto; overflow: inherit; max-height: 50%; width: inherit; position: inherit; right: inherit; top: inherit; bottom: inherit; left: inherit; opacity: 1; transition: -webkit-transform 0.3s ease-out 0s; }
+@media only screen and (max-height: 320px) {
+ .modal.aside-hz .modal-dialog { max-height: 66%; }
+}
+.modal.aside-hz .modal-content { width: 100%; overflow: hidden; }
+.modal.in.aside-hz .modal-dialog { transform: none; height: auto; }
+.modal.aside-hz .aside-trigger { position: absolute; top: auto; right: auto; bottom: auto; margin-top: -1px; z-index: auto; outline: 0px none; margin-left: -15px; left: 50%; }
+.modal.aside-hz .aside-trigger.ace-settings-btn { margin-left: -20px; }
+.modal.in.aside-hz .aside-trigger { z-index: -1; }
+.modal.aside-top { top: 0px; }
+.modal.aside-top .modal-dialog { transform: translateY(-100%); }
+.modal.aside-top .modal-content { border-width: 0px; box-shadow: 1px 2px 2px 0px rgba(0, 0, 0, 0.15); }
+.modal.aside-bottom { bottom: 0px; }
+.modal.aside-bottom .modal-dialog { transform: translateY(100%); }
+.modal.aside-bottom .modal-content { border-width: 0px; box-shadow: -1px 2px 2px 0px rgba(0, 0, 0, 0.15); }
+.modal.aside-bottom .aside-trigger { bottom: 100%; margin-top: auto; margin-bottom: -1px; }
+.modal.aside-top .aside-trigger.ace-settings-btn { border-radius: 0px 0px 6px 6px !important; }
+.modal.aside-bottom .aside-trigger.ace-settings-btn { border-radius: 6px 6px 0px 0px !important; }
+@media only screen and (min-width: 768px) {
+ .container.main-container ~ .modal.aside-vc .modal-dialog { transition: none 0s ease 0s ; }
+ .container.main-container ~ .modal.aside-vc:not(.in) .modal-content { display: none; }
+}
+.aside-vc.in.no-backdrop { width: auto; }
+.aside-hz.in.no-backdrop { height: auto; }
+.modal.aside .modal-backdrop { position: fixed; bottom: 0px; height: auto !important; }
+.modal.aside-hz .aside-trigger.align-left { left: 15px; margin-left: auto; text-align: center; }
+.modal.aside-hz .aside-trigger.align-right { text-align: center; left: auto; margin-left: auto; right: 15px; }
+.modal.transition-off .modal-dialog { transition: none 0s ease 0s ; }
+.modal.ng-aside .modal-content { box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.5); }
+.modal.ng-aside.bottom .modal-content { border-top: 1px solid rgba(0, 0, 0, 0.2); }
+.modal.ng-aside.top .modal-content { border-bottom: 1px solid rgba(0, 0, 0, 0.2); }
+.modal.ng-aside.left .modal-content { border-right: 1px solid rgba(0, 0, 0, 0.2); }
+.modal.ng-aside.right .modal-content { border-left: 1px solid rgba(0, 0, 0, 0.2); }
+.modal-backdrop.in[ng-class] { bottom: 0px; }
+.ng-aside .modal-dialog { width: 320px; }
+.breadcrumb, .breadcrumb > li > a, .btn { display: inline-block; }
+.breadcrumbs { position: relative; z-index: auto; border-bottom: 1px solid rgb(229, 229, 229); background-color: rgb(245, 245, 245); min-height: 41px; line-height: 40px; padding: 0px 12px 0px 0px; }
+.breadcrumb { background-color: transparent; line-height: 20px; margin: 6px 22px 0px 12px; padding: 0px; font-size: 13px; color: rgb(51, 51, 51); border-radius: 0px; }
+.breadcrumb > li, .breadcrumb > li.active { color: rgb(85, 85, 85); padding: 0px 3px; }
+.breadcrumb > li > a { color: rgb(76, 143, 189); }
+.breadcrumb > li + li::before { font-family: FontAwesome; font-size: 14px; content: ""; color: rgb(178, 182, 191); padding: 0px; margin: 0px 8px 0px 0px; position: relative; top: 1px; }
+.breadcrumb .home-icon { font-size: 20px; margin-left: 2px; margin-right: 2px; vertical-align: top; }
+@media only screen and (max-width: 480px) {
+ .modal.aside-vc .modal-dialog { width: 240px; }
+ .breadcrumb > li > a { padding: 0px 1px; }
+}
+@media only screen and (max-width: 991px) {
+ .menu-toggler + .sidebar.responsive + .main-content .breadcrumb { margin-left: 90px; }
+}
+@media only screen and (max-width: 320px) {
+ .modal.aside-vc .modal-dialog { width: 200px; }
+ .breadcrumb { margin-left: 8px; }
+ .menu-toggler + .sidebar.responsive + .main-content .breadcrumb { margin-left: 36px; }
+}
+@media (min-width: 992px) {
+ .breadcrumbs-fixed { position: fixed; right: 0px; left: 0px; top: auto; z-index: 1024; }
+ .breadcrumbs-fixed + .page-content { padding-top: 49px; }
+ .sidebar + .main-content .breadcrumbs-fixed { left: 190px; }
+ body.mob-safari .breadcrumbs-fixed { top: 45px; }
+ .sidebar.compact + .main-content .breadcrumbs-fixed { left: 105px; }
+ .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: 43px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .breadcrumbs-fixed, .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: 0px; }
+ .sidebar.responsive-max + .main-content .breadcrumbs-fixed, .sidebar.responsive-min + .main-content .breadcrumbs-fixed { left: 43px; }
+}
+@media (min-width: 992px) {
+ .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed { width: 859px; }
+ .container.main-container .breadcrumbs-fixed { left: auto; right: auto; width: 964px; }
+ .container.main-container .sidebar + .main-content .breadcrumbs-fixed { left: auto; right: auto; width: 774px; }
+ .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { left: auto; right: auto; width: 921px; }
+}
+@media (min-width: 1200px) {
+ .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed { width: 1059px; }
+ .container.main-container .breadcrumbs-fixed { width: 1164px; }
+ .container.main-container .sidebar + .main-content .breadcrumbs-fixed { width: 974px; }
+ .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 1121px; }
+}
+@media (min-width: 992px) and (max-width: 991px) {
+ .container.main-container .breadcrumbs-fixed, .container.main-container .sidebar.compact + .main-content .breadcrumbs-fixed, .container.main-container .sidebar.menu-min + .main-content .breadcrumbs-fixed { width: 744px; }
+ .container.main-container .sidebar.responsive-max + .main-content .breadcrumbs-fixed, .container.main-container .sidebar.responsive-min + .main-content .breadcrumbs-fixed { left: auto; right: auto; width: 701px; }
+}
+@media (min-width: 992px) {
+ .h-sidebar + .main-content .breadcrumbs.breadcrumbs-fixed { position: relative; top: auto; left: auto; z-index: auto; width: auto; }
+ .h-sidebar + .main-content .page-content { padding-top: 12px; }
+}
+.nav-search { position: absolute; right: 22px; line-height: 24px; }
+.breadcrumbs .nav-search { top: 6px; }
+.nav-search .form-search { margin-bottom: 0px; }
+.nav-search .nav-search-input { border: 1px solid rgb(111, 179, 224); width: 152px; height: 28px !important; padding-top: 2px; padding-bottom: 2px; border-radius: 4px !important; font-size: 13px; line-height: 1.3; color: rgb(102, 102, 102) !important; z-index: 11; transition: width 0.15s ease 0s; }
+.nav-search .nav-search-input + .dropdown-menu { min-width: 0px; left: 0px; right: 0px; }
+.nav-search .nav-search-input:focus, .nav-search .nav-search-input:hover { border-color: rgb(111, 179, 224); }
+.nav-search .nav-search-icon { color: rgb(111, 179, 224) !important; font-size: 14px !important; line-height: 24px !important; background-color: transparent; }
+.nav-search.minimized .nav-search-input { width: 0px; opacity: 0; max-width: 0px; }
+.nav-search.minimized .nav-search-btn:active + .nav-search-input, .nav-search.minimized .nav-search-input:active, .nav-search.minimized .nav-search-input:focus, .nav-search.minimized .nav-search-input:hover, .nav-search.minimized:hover .nav-search-input { opacity: 1; width: 152px; max-width: 152px; }
+.nav-search.minimized .nav-search-icon { border: 1px solid; border-radius: 100%; background-color: rgb(255, 255, 255); padding: 0px 5px !important; }
+.nav-search-icon, .nav-search.minimized .nav-search-input:active ~ .nav-search-icon, .nav-search.minimized .nav-search-input:focus ~ .nav-search-icon, .nav-search.minimized .nav-search-input:hover ~ .nav-search-icon, .nav-search.minimized:hover .nav-search-icon { border: medium none; border-radius: 0px; padding: 0px 3px !important; }
+.sidebar > .nav-search { position: static; background-color: rgb(250, 250, 250); border-bottom: 1px solid rgb(221, 221, 221); text-align: center; height: 35px; padding-top: 6px; }
+.sidebar > .nav-search .nav-search-input { width: 162px !important; border-radius: 0px !important; max-width: 162px !important; opacity: 1 !important; }
+.sidebar > .nav-search .nav-search-input + .dropdown-menu { text-align: left; }
+.sidebar.menu-min .nav-search .form-search { position: absolute; left: 5px; z-index: 14; }
+.sidebar.menu-min .nav-search .nav-search-input { width: 0px !important; max-width: 0px !important; opacity: 0 !important; }
+.sidebar.menu-min .nav-search .nav-search-input:active, .sidebar.menu-min .nav-search .nav-search-input:focus, .sidebar.menu-min .nav-search .nav-search-input:hover, .sidebar.menu-min .nav-search:hover .nav-search-input { width: 162px !important; max-width: 162px !important; opacity: 1 !important; }
+.sidebar.menu-min .nav-search .nav-search-input:active ~ #nav-search-icon, .sidebar.menu-min .nav-search .nav-search-input:focus ~ #nav-search-icon, .sidebar.menu-min .nav-search .nav-search-input:hover ~ #nav-search-icon { border: medium none; border-radius: 0px; padding: 0px 3px !important; }
+.sidebar.menu-min .nav-search:hover .nav-search-input ~ .nav-search-icon { border: medium none; border-radius: 0px; padding: 0px 3px !important; }
+.sidebar.menu-min .nav-search .nav-search-icon { border: 1px solid; border-radius: 32px; background-color: rgb(255, 255, 255); padding: 0px 5px !important; }
+@media (max-width: 991px) {
+ .sidebar.responsive-min .nav-search .form-search { position: absolute; left: 5px; z-index: 14; }
+ .sidebar.responsive-min .nav-search .nav-search-input { width: 0px !important; max-width: 0px !important; opacity: 0 !important; }
+ .sidebar.responsive-min .nav-search .nav-search-input:active, .sidebar.responsive-min .nav-search .nav-search-input:focus, .sidebar.responsive-min .nav-search .nav-search-input:hover, .sidebar.responsive-min .nav-search:hover .nav-search-input { width: 162px !important; max-width: 162px !important; opacity: 1 !important; }
+ .sidebar.responsive-min .nav-search .nav-search-input:active ~ #nav-search-icon, .sidebar.responsive-min .nav-search .nav-search-input:focus ~ #nav-search-icon, .sidebar.responsive-min .nav-search .nav-search-input:hover ~ #nav-search-icon { border: medium none; border-radius: 0px; padding: 0px 3px !important; }
+ .sidebar.responsive-min .nav-search:hover .nav-search-input ~ .nav-search-icon { border: medium none; border-radius: 0px; padding: 0px 3px !important; }
+ .sidebar.responsive-min .nav-search .nav-search-icon { border: 1px solid; border-radius: 32px; background-color: rgb(255, 255, 255); padding: 0px 5px !important; }
+}
+@media only screen and (max-width: 991px) {
+ .nav-search { right: 10px; }
+ .nav-search .nav-search-input { width: 105px; }
+ .nav-search .nav-search-btn:active + .nav-search-input, .nav-search .nav-search-input:active, .nav-search .nav-search-input:focus, .nav-search .nav-search-input:hover, .nav-search:hover .nav-search-input { width: 145px; }
+}
+@media only screen and (max-width: 767px) {
+ .nav-search .nav-search-input { width: 0px; opacity: 0; max-width: 0px; }
+ .nav-search .nav-search-btn:active + .nav-search-input, .nav-search .nav-search-input:active, .nav-search .nav-search-input:focus, .nav-search .nav-search-input:hover, .nav-search:hover .nav-search-input { opacity: 1; width: 152px; max-width: 152px; }
+ .nav-search .nav-search-icon { border: 1px solid; border-radius: 100%; background-color: rgb(255, 255, 255); padding: 0px 5px !important; }
+ .nav-search .nav-search-input:active ~ .nav-search-icon, .nav-search .nav-search-input:focus ~ .nav-search-icon, .nav-search .nav-search-input:hover ~ .nav-search-icon, .nav-search:hover .nav-search-icon { border: medium none; border-radius: 0px; padding: 0px 3px !important; }
+}
+.footer { padding-top: 75px; height: 0px; width: 0px; }
+.footer .footer-inner { text-align: center; position: absolute; z-index: auto; left: 0px; right: 0px; bottom: 0px; }
+.sidebar ~ .footer .footer-inner { left: 190px; }
+@media (min-width: 992px) {
+ .sidebar.compact ~ .footer .footer-inner { left: 105px; }
+}
+.sidebar.menu-min ~ .footer .footer-inner { left: 43px; }
+@media (min-width: 992px) {
+ .sidebar.h-sidebar ~ .footer .footer-inner { left: 0px; }
+}
+@media (max-width: 991px) {
+ .footer .footer-inner, .sidebar.compact ~ .footer .footer-inner, .sidebar.menu-min ~ .footer .footer-inner, .sidebar ~ .footer .footer-inner { left: 0px; }
+ .sidebar.responsive-min ~ .footer .footer-inner { left: 43px; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .container.main-container .footer .footer-inner { left: auto !important; right: auto !important; margin-left: auto; width: 744px; }
+}
+@media (min-width: 992px) {
+ .container.main-container .footer .footer-inner { left: auto !important; right: auto !important; width: 964px; }
+}
+@media (min-width: 1200px) {
+ .container.main-container .footer .footer-inner { width: 1164px; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .container.main-container .sidebar ~ .footer .footer-inner { left: auto !important; right: auto !important; margin-left: auto; width: 744px; }
+}
+@media (min-width: 992px) {
+ .container.main-container .sidebar ~ .footer .footer-inner { left: auto !important; right: auto !important; margin-left: 190px; width: 774px; }
+}
+@media (min-width: 1200px) {
+ .container.main-container .sidebar ~ .footer .footer-inner { margin-left: 190px; width: 974px; }
+}
+@media (min-width: 992px) {
+ .container.main-container .sidebar.compact ~ .footer .footer-inner { margin-left: 105px; width: 859px; }
+}
+@media (min-width: 1200px) {
+ .container.main-container .sidebar.compact ~ .footer .footer-inner { margin-left: 105px; width: 1059px; }
+}
+@media (min-width: 992px) {
+ .container.main-container .sidebar.menu-min ~ .footer .footer-inner { margin-left: 43px; width: 921px; }
+}
+@media (min-width: 1200px) {
+ .container.main-container .sidebar.menu-min ~ .footer .footer-inner { margin-left: 43px; width: 1121px; }
+}
+@media (min-width: 992px) {
+ .container.main-container .sidebar.h-sidebar ~ .footer .footer-inner { margin-left: 0px; width: 964px; }
+}
+@media (min-width: 1200px) {
+ .container.main-container .sidebar.h-sidebar ~ .footer .footer-inner { margin-left: 0px; width: 1164px; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .container.main-container .sidebar.responsive-min ~ .footer .footer-inner { margin-left: 43px; width: 701px; }
+}
+.footer .footer-inner .footer-content { position: absolute; left: 12px; right: 12px; bottom: 4px; padding: 8px; line-height: 36px; border-top: 3px double rgb(229, 229, 229); }
+.footer.footer-fixed .footer-inner { position: fixed; z-index: 999; bottom: 0px; }
+.footer.footer-fixed .footer-inner .footer-content { left: 2px; right: 2px; bottom: 2px; border: 1px solid rgb(221, 221, 221); background-color: rgb(242, 242, 242); }
+.footer.footer-fixed + .btn-scroll-up { z-index: 999; }
+.btn { color: rgb(255, 255, 255) !important; text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25); background-image: none !important; border: 5px solid rgb(255, 255, 255); border-radius: 0px; box-shadow: none !important; transition: background-color 0.15s ease 0s, border-color 0.15s ease 0s, opacity 0.15s ease 0s; vertical-align: middle; margin: 0px; position: relative; }
+.btn-group .dropdown-toggle, .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { border-radius: 0px; }
+.btn.active, .open > .btn.active.dropdown-toggle { box-shadow: none; }
+.btn-group-lg > .btn, .btn-lg { border-width: 5px; line-height: 1.4; padding: 5px 16px 6px; }
+.btn-group-xlg > .btn, .btn-xlg { border-width: 5px; line-height: 1.35; padding: 7px 16px; font-size: 18px; }
+.btn-group-sm > .btn, .btn-sm { border-width: 4px; font-size: 13px; padding: 4px 9px; line-height: 1.38; }
+.btn-group-xs > .btn, .btn-xs { padding-top: 3px; padding-bottom: 3px; border-width: 3px; }
+.btn-group-mini > .btn, .btn-mini { padding: 1px 5px; border-width: 3px; font-size: 12px; line-height: 1.5; }
+.btn-group-minier > .btn, .btn-minier { padding: 0px 4px; line-height: 18px; border-width: 2px; font-size: 12px; }
+button.btn:active { top: 1px; }
+.btn, .btn-default, .btn-default.focus, .btn-default:focus, .btn.focus, .btn:focus { background-color: rgb(171, 186, 195) !important; border-color: rgb(171, 186, 195); }
+.btn-default.focus:hover, .btn-default:active:hover, .btn-default:focus:active, .btn-default:focus:hover, .btn-default:hover, .btn.focus:hover, .btn:active:hover, .btn:focus:active, .btn:focus:hover, .btn:hover, .open > .btn-default.dropdown-toggle, .open > .btn-default.dropdown-toggle.focus, .open > .btn-default.dropdown-toggle:active, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn.dropdown-toggle, .open > .btn.dropdown-toggle.focus, .open > .btn.dropdown-toggle:active, .open > .btn.dropdown-toggle:focus, .open > .btn.dropdown-toggle:hover { background-color: rgb(139, 154, 163) !important; border-color: rgb(171, 186, 195); }
+.btn-default.no-border:active, .btn-default.no-border:hover, .btn.no-border:active, .btn.no-border:hover { border-color: rgb(139, 154, 163); }
+.btn-default.no-hover:active, .btn-default.no-hover:hover, .btn.no-hover:active, .btn.no-hover:hover { background-color: rgb(171, 186, 195) !important; }
+.btn-default.active, .btn-default.active:focus, .btn-default.active:hover, .btn-default.focus.active, .btn.active, .btn.active:focus, .btn.active:hover, .btn.focus.active, .open > .btn-default.dropdown-toggle.active, .open > .btn.dropdown-toggle.active { background-color: rgb(155, 170, 179) !important; border-color: rgb(135, 153, 164); }
+.btn-default.no-border.active, .btn.no-border.active { background-color: rgb(146, 163, 172) !important; border-color: rgb(146, 163, 172); }
+.btn-default.disabled, .btn-default.disabled.active, .btn-default.disabled:active, .btn-default.disabled:focus, .btn-default.disabled:hover, .btn-default[disabled], .btn-default.active[disabled], .btn-default[disabled]:active, .btn-default[disabled]:focus, .btn-default[disabled]:hover, .btn.disabled, .btn.disabled.active, .btn.disabled:active, .btn.disabled:focus, .btn.disabled:hover, .btn[disabled], .btn.active[disabled], .btn[disabled]:active, .btn[disabled]:focus, .btn[disabled]:hover, fieldset[disabled] .btn, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default.active, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn.active, fieldset[disabled] .btn:active, fieldset[disabled] .btn:focus, fieldset[disabled] .btn:hover { background-color: rgb(171, 186, 195) !important; border-color: rgb(171, 186, 195); }
+.btn-primary, .btn-primary.focus, .btn-primary:focus { background-color: rgb(66, 139, 202) !important; border-color: rgb(66, 139, 202); }
+.btn-primary.focus:hover, .btn-primary:active:hover, .btn-primary:focus:active, .btn-primary:focus:hover, .btn-primary:hover, .open > .btn-primary.dropdown-toggle, .open > .btn-primary.dropdown-toggle.focus, .open > .btn-primary.dropdown-toggle:active, .open > .btn-primary.dropdown-toggle:focus, .open > .btn-primary.dropdown-toggle:hover { background-color: rgb(27, 106, 170) !important; border-color: rgb(66, 139, 202); }
+.btn-primary.no-border:active, .btn-primary.no-border:hover { border-color: rgb(27, 106, 170); }
+.btn-primary.no-hover:active, .btn-primary.no-hover:hover { background-color: rgb(66, 139, 202) !important; }
+.btn-primary.active, .btn-primary.active:focus, .btn-primary.active:hover, .btn-primary.focus.active, .open > .btn-primary.dropdown-toggle.active { background-color: rgb(47, 123, 186) !important; border-color: rgb(39, 104, 157); }
+.btn-primary.no-border.active { background-color: rgb(43, 114, 174) !important; border-color: rgb(43, 114, 174); }
+.btn-primary.disabled, .btn-primary.disabled.active, .btn-primary.disabled:active, .btn-primary.disabled:focus, .btn-primary.disabled:hover, .btn-primary[disabled], .btn-primary.active[disabled], .btn-primary[disabled]:active, .btn-primary[disabled]:focus, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary.active, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:hover { background-color: rgb(66, 139, 202) !important; border-color: rgb(66, 139, 202); }
+.btn-info, .btn-info.focus, .btn-info:focus { background-color: rgb(111, 179, 224) !important; border-color: rgb(111, 179, 224); }
+.btn-info.focus:hover, .btn-info:active:hover, .btn-info:focus:active, .btn-info:focus:hover, .btn-info:hover, .open > .btn-info.dropdown-toggle, .open > .btn-info.dropdown-toggle.focus, .open > .btn-info.dropdown-toggle:active, .open > .btn-info.dropdown-toggle:focus, .open > .btn-info.dropdown-toggle:hover { background-color: rgb(79, 153, 198) !important; border-color: rgb(111, 179, 224); }
+.btn-info.no-border:active, .btn-info.no-border:hover { border-color: rgb(79, 153, 198); }
+.btn-info.no-hover:active, .btn-info.no-hover:hover { background-color: rgb(111, 179, 224) !important; }
+.btn-info.active, .btn-info.active:focus, .btn-info.active:hover, .btn-info.focus.active, .open > .btn-info.dropdown-toggle.active { background-color: rgb(95, 166, 211) !important; border-color: rgb(67, 150, 203); }
+.btn-info.no-border.active { background-color: rgb(83, 159, 208) !important; border-color: rgb(83, 159, 208); }
+.btn-info.disabled, .btn-info.disabled.active, .btn-info.disabled:active, .btn-info.disabled:focus, .btn-info.disabled:hover, .btn-info[disabled], .btn-info.active[disabled], .btn-info[disabled]:active, .btn-info[disabled]:focus, .btn-info[disabled]:hover, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info.active, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:hover { background-color: rgb(111, 179, 224) !important; border-color: rgb(111, 179, 224); }
+.btn-info2, .btn-info2.focus, .btn-info2:focus { background-color: rgb(149, 198, 229) !important; border-color: rgb(149, 198, 229); }
+.btn-info2.focus:hover, .btn-info2:active:hover, .btn-info2:focus:active, .btn-info2:focus:hover, .btn-info2:hover, .open > .btn-info2.dropdown-toggle, .open > .btn-info2.dropdown-toggle.focus, .open > .btn-info2.dropdown-toggle:active, .open > .btn-info2.dropdown-toggle:focus, .open > .btn-info2.dropdown-toggle:hover { background-color: rgb(103, 166, 206) !important; border-color: rgb(149, 198, 229); }
+.btn-info2.no-border:active, .btn-info2.no-border:hover { border-color: rgb(103, 166, 206); }
+.btn-info2.no-hover:active, .btn-info2.no-hover:hover { background-color: rgb(149, 198, 229) !important; }
+.btn-info2.active, .btn-info2.active:focus, .btn-info2.active:hover, .btn-info2.focus.active, .open > .btn-info2.dropdown-toggle.active { background-color: rgb(126, 182, 218) !important; border-color: rgb(98, 166, 209); }
+.btn-info2.no-border.active { background-color: rgb(114, 175, 214) !important; border-color: rgb(114, 175, 214); }
+.btn-info2.disabled, .btn-info2.disabled.active, .btn-info2.disabled:active, .btn-info2.disabled:focus, .btn-info2.disabled:hover, .btn-info2[disabled], .btn-info2.active[disabled], .btn-info2[disabled]:active, .btn-info2[disabled]:focus, .btn-info2[disabled]:hover, fieldset[disabled] .btn-info2, fieldset[disabled] .btn-info2.active, fieldset[disabled] .btn-info2:active, fieldset[disabled] .btn-info2:focus, fieldset[disabled] .btn-info2:hover { background-color: rgb(149, 198, 229) !important; border-color: rgb(149, 198, 229); }
+.btn-success, .btn-success.focus, .btn-success:focus { background-color: rgb(135, 184, 127) !important; border-color: rgb(135, 184, 127); }
+.btn-success.focus:hover, .btn-success:active:hover, .btn-success:focus:active, .btn-success:focus:hover, .btn-success:hover, .open > .btn-success.dropdown-toggle, .open > .btn-success.dropdown-toggle.focus, .open > .btn-success.dropdown-toggle:active, .open > .btn-success.dropdown-toggle:focus, .open > .btn-success.dropdown-toggle:hover { background-color: rgb(98, 155, 88) !important; border-color: rgb(135, 184, 127); }
+.btn-success.no-border:active, .btn-success.no-border:hover { border-color: rgb(98, 155, 88); }
+.btn-success.no-hover:active, .btn-success.no-hover:hover { background-color: rgb(135, 184, 127) !important; }
+.btn-success.active, .btn-success.active:focus, .btn-success.active:hover, .btn-success.focus.active, .open > .btn-success.dropdown-toggle.active { background-color: rgb(117, 170, 108) !important; border-color: rgb(98, 153, 89); }
+.btn-success.no-border.active { background-color: rgb(107, 164, 98) !important; border-color: rgb(107, 164, 98); }
+.btn-success.disabled, .btn-success.disabled.active, .btn-success.disabled:active, .btn-success.disabled:focus, .btn-success.disabled:hover, .btn-success[disabled], .btn-success.active[disabled], .btn-success[disabled]:active, .btn-success[disabled]:focus, .btn-success[disabled]:hover, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success.active, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:hover { background-color: rgb(135, 184, 127) !important; border-color: rgb(135, 184, 127); }
+.btn-warning, .btn-warning.focus, .btn-warning:focus { background-color: rgb(255, 183, 82) !important; border-color: rgb(255, 183, 82); }
+.btn-warning.focus:hover, .btn-warning:active:hover, .btn-warning:focus:active, .btn-warning:focus:hover, .btn-warning:hover, .open > .btn-warning.dropdown-toggle, .open > .btn-warning.dropdown-toggle.focus, .open > .btn-warning.dropdown-toggle:active, .open > .btn-warning.dropdown-toggle:focus, .open > .btn-warning.dropdown-toggle:hover { background-color: rgb(229, 151, 41) !important; border-color: rgb(255, 183, 82); }
+.btn-warning.no-border:active, .btn-warning.no-border:hover { border-color: rgb(229, 151, 41); }
+.btn-warning.no-hover:active, .btn-warning.no-hover:hover { background-color: rgb(255, 183, 82) !important; }
+.btn-warning.active, .btn-warning.active:focus, .btn-warning.active:hover, .btn-warning.focus.active, .open > .btn-warning.dropdown-toggle.active { background-color: rgb(242, 167, 62) !important; border-color: rgb(240, 152, 28); }
+.btn-warning.no-border.active { background-color: rgb(241, 160, 47) !important; border-color: rgb(241, 160, 47); }
+.btn-warning.disabled, .btn-warning.disabled.active, .btn-warning.disabled:active, .btn-warning.disabled:focus, .btn-warning.disabled:hover, .btn-warning[disabled], .btn-warning.active[disabled], .btn-warning[disabled]:active, .btn-warning[disabled]:focus, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning.active, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:hover { background-color: rgb(255, 183, 82) !important; border-color: rgb(255, 183, 82); }
+.btn-danger, .btn-danger.focus, .btn-danger:focus { background-color: rgb(209, 91, 71) !important; border-color: rgb(209, 91, 71); }
+.btn-danger.focus:hover, .btn-danger:active:hover, .btn-danger:focus:active, .btn-danger:focus:hover, .btn-danger:hover, .open > .btn-danger.dropdown-toggle, .open > .btn-danger.dropdown-toggle.focus, .open > .btn-danger.dropdown-toggle:active, .open > .btn-danger.dropdown-toggle:focus, .open > .btn-danger.dropdown-toggle:hover { background-color: rgb(183, 70, 53) !important; border-color: rgb(209, 91, 71); }
+.btn-danger.no-border:active, .btn-danger.no-border:hover { border-color: rgb(183, 70, 53); }
+.btn-danger.no-hover:active, .btn-danger.no-hover:hover { background-color: rgb(209, 91, 71) !important; }
+.btn-danger.active, .btn-danger.active:focus, .btn-danger.active:hover, .btn-danger.focus.active, .open > .btn-danger.dropdown-toggle.active { background-color: rgb(196, 81, 62) !important; border-color: rgb(170, 68, 52); }
+.btn-danger.no-border.active { background-color: rgb(186, 75, 57) !important; border-color: rgb(186, 75, 57); }
+.btn-danger.disabled, .btn-danger.disabled.active, .btn-danger.disabled:active, .btn-danger.disabled:focus, .btn-danger.disabled:hover, .btn-danger[disabled], .btn-danger.active[disabled], .btn-danger[disabled]:active, .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger.active, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:hover { background-color: rgb(209, 91, 71) !important; border-color: rgb(209, 91, 71); }
+.btn-inverse, .btn-inverse.focus, .btn-inverse:focus { background-color: rgb(85, 85, 85) !important; border-color: rgb(85, 85, 85); }
+.btn-inverse.focus:hover, .btn-inverse:active:hover, .btn-inverse:focus:active, .btn-inverse:focus:hover, .btn-inverse:hover, .open > .btn-inverse.dropdown-toggle, .open > .btn-inverse.dropdown-toggle.focus, .open > .btn-inverse.dropdown-toggle:active, .open > .btn-inverse.dropdown-toggle:focus, .open > .btn-inverse.dropdown-toggle:hover { background-color: rgb(48, 48, 48) !important; border-color: rgb(85, 85, 85); }
+.btn-inverse.no-border:active, .btn-inverse.no-border:hover { border-color: rgb(48, 48, 48); }
+.btn-inverse.no-hover:active, .btn-inverse.no-hover:hover { background-color: rgb(85, 85, 85) !important; }
+.btn-inverse.active, .btn-inverse.active:focus, .btn-inverse.active:hover, .btn-inverse.focus.active, .open > .btn-inverse.dropdown-toggle.active { background-color: rgb(67, 67, 67) !important; border-color: rgb(49, 49, 49); }
+.btn-inverse.no-border.active { background-color: rgb(59, 59, 59) !important; border-color: rgb(59, 59, 59); }
+.btn-inverse.disabled, .btn-inverse.disabled.active, .btn-inverse.disabled:active, .btn-inverse.disabled:focus, .btn-inverse.disabled:hover, .btn-inverse[disabled], .btn-inverse.active[disabled], .btn-inverse[disabled]:active, .btn-inverse[disabled]:focus, .btn-inverse[disabled]:hover, fieldset[disabled] .btn-inverse, fieldset[disabled] .btn-inverse.active, fieldset[disabled] .btn-inverse:active, fieldset[disabled] .btn-inverse:focus, fieldset[disabled] .btn-inverse:hover { background-color: rgb(85, 85, 85) !important; border-color: rgb(85, 85, 85); }
+.btn-pink, .btn-pink.focus, .btn-pink:focus { background-color: rgb(214, 72, 126) !important; border-color: rgb(214, 72, 126); }
+.btn-pink.focus:hover, .btn-pink:active:hover, .btn-pink:focus:active, .btn-pink:focus:hover, .btn-pink:hover, .open > .btn-pink.dropdown-toggle, .open > .btn-pink.dropdown-toggle.focus, .open > .btn-pink.dropdown-toggle:active, .open > .btn-pink.dropdown-toggle:focus, .open > .btn-pink.dropdown-toggle:hover { background-color: rgb(183, 55, 102) !important; border-color: rgb(214, 72, 126); }
+.btn-pink.no-border:active, .btn-pink.no-border:hover { border-color: rgb(183, 55, 102); }
+.btn-pink.no-hover:active, .btn-pink.no-hover:hover { background-color: rgb(214, 72, 126) !important; }
+.btn-pink.active, .btn-pink.active:focus, .btn-pink.active:hover, .btn-pink.focus.active, .open > .btn-pink.dropdown-toggle.active { background-color: rgb(199, 64, 114) !important; border-color: rgb(175, 52, 98); }
+.btn-pink.no-border.active { background-color: rgb(190, 56, 106) !important; border-color: rgb(190, 56, 106); }
+.btn-pink.disabled, .btn-pink.disabled.active, .btn-pink.disabled:active, .btn-pink.disabled:focus, .btn-pink.disabled:hover, .btn-pink[disabled], .btn-pink.active[disabled], .btn-pink[disabled]:active, .btn-pink[disabled]:focus, .btn-pink[disabled]:hover, fieldset[disabled] .btn-pink, fieldset[disabled] .btn-pink.active, fieldset[disabled] .btn-pink:active, fieldset[disabled] .btn-pink:focus, fieldset[disabled] .btn-pink:hover { background-color: rgb(214, 72, 126) !important; border-color: rgb(214, 72, 126); }
+.btn-purple, .btn-purple.focus, .btn-purple:focus { background-color: rgb(149, 133, 191) !important; border-color: rgb(149, 133, 191); }
+.btn-purple.focus:hover, .btn-purple:active:hover, .btn-purple:focus:active, .btn-purple:focus:hover, .btn-purple:hover, .open > .btn-purple.dropdown-toggle, .open > .btn-purple.dropdown-toggle.focus, .open > .btn-purple.dropdown-toggle:active, .open > .btn-purple.dropdown-toggle:focus, .open > .btn-purple.dropdown-toggle:hover { background-color: rgb(116, 97, 170) !important; border-color: rgb(149, 133, 191); }
+.btn-purple.no-border:active, .btn-purple.no-border:hover { border-color: rgb(116, 97, 170); }
+.btn-purple.no-hover:active, .btn-purple.no-hover:hover { background-color: rgb(149, 133, 191) !important; }
+.btn-purple.active, .btn-purple.active:focus, .btn-purple.active:hover, .btn-purple.focus.active, .open > .btn-purple.dropdown-toggle.active { background-color: rgb(133, 115, 181) !important; border-color: rgb(112, 92, 168); }
+.btn-purple.no-border.active { background-color: rgb(124, 105, 175) !important; border-color: rgb(124, 105, 175); }
+.btn-purple.disabled, .btn-purple.disabled.active, .btn-purple.disabled:active, .btn-purple.disabled:focus, .btn-purple.disabled:hover, .btn-purple[disabled], .btn-purple.active[disabled], .btn-purple[disabled]:active, .btn-purple[disabled]:focus, .btn-purple[disabled]:hover, fieldset[disabled] .btn-purple, fieldset[disabled] .btn-purple.active, fieldset[disabled] .btn-purple:active, fieldset[disabled] .btn-purple:focus, fieldset[disabled] .btn-purple:hover { background-color: rgb(149, 133, 191) !important; border-color: rgb(149, 133, 191); }
+.btn-grey, .btn-grey.focus, .btn-grey:focus { background-color: rgb(160, 160, 160) !important; border-color: rgb(160, 160, 160); }
+.btn-grey.focus:hover, .btn-grey:active:hover, .btn-grey:focus:active, .btn-grey:focus:hover, .btn-grey:hover, .open > .btn-grey.dropdown-toggle, .open > .btn-grey.dropdown-toggle.focus, .open > .btn-grey.dropdown-toggle:active, .open > .btn-grey.dropdown-toggle:focus, .open > .btn-grey.dropdown-toggle:hover { background-color: rgb(136, 136, 136) !important; border-color: rgb(160, 160, 160); }
+.btn-grey.no-border:active, .btn-grey.no-border:hover { border-color: rgb(136, 136, 136); }
+.btn-grey.no-hover:active, .btn-grey.no-hover:hover { background-color: rgb(160, 160, 160) !important; }
+.btn-grey.active, .btn-grey.active:focus, .btn-grey.active:hover, .btn-grey.focus.active, .open > .btn-grey.dropdown-toggle.active { background-color: rgb(148, 148, 148) !important; border-color: rgb(130, 130, 130); }
+.btn-grey.no-border.active { background-color: rgb(140, 140, 140) !important; border-color: rgb(140, 140, 140); }
+.btn-grey.disabled, .btn-grey.disabled.active, .btn-grey.disabled:active, .btn-grey.disabled:focus, .btn-grey.disabled:hover, .btn-grey[disabled], .btn-grey.active[disabled], .btn-grey[disabled]:active, .btn-grey[disabled]:focus, .btn-grey[disabled]:hover, fieldset[disabled] .btn-grey, fieldset[disabled] .btn-grey.active, fieldset[disabled] .btn-grey:active, fieldset[disabled] .btn-grey:focus, fieldset[disabled] .btn-grey:hover { background-color: rgb(160, 160, 160) !important; border-color: rgb(160, 160, 160); }
+.btn-yellow { color: rgb(153, 102, 51) !important; text-shadow: 0px -1px 0px rgba(255, 255, 255, 0.4) !important; }
+.btn-yellow, .btn-yellow.focus, .btn-yellow:focus { background-color: rgb(254, 225, 136) !important; border-color: rgb(254, 225, 136); }
+.btn-yellow.focus:hover, .btn-yellow:active:hover, .btn-yellow:focus:active, .btn-yellow:focus:hover, .btn-yellow:hover, .open > .btn-yellow.dropdown-toggle, .open > .btn-yellow.dropdown-toggle.focus, .open > .btn-yellow.dropdown-toggle:active, .open > .btn-yellow.dropdown-toggle:focus, .open > .btn-yellow.dropdown-toggle:hover { background-color: rgb(247, 208, 91) !important; border-color: rgb(254, 225, 136); }
+.btn-yellow.no-border:active, .btn-yellow.no-border:hover { border-color: rgb(247, 208, 91); }
+.btn-yellow.no-hover:active, .btn-yellow.no-hover:hover { background-color: rgb(254, 225, 136) !important; }
+.btn-yellow.active, .btn-yellow.active:focus, .btn-yellow.active:hover, .btn-yellow.focus.active, .open > .btn-yellow.dropdown-toggle.active { background-color: rgb(251, 217, 114) !important; border-color: rgb(249, 207, 79); }
+.btn-yellow.no-border.active { background-color: rgb(250, 212, 99) !important; border-color: rgb(250, 212, 99); }
+.btn-yellow.disabled, .btn-yellow.disabled.active, .btn-yellow.disabled:active, .btn-yellow.disabled:focus, .btn-yellow.disabled:hover, .btn-yellow[disabled], .btn-yellow.active[disabled], .btn-yellow[disabled]:active, .btn-yellow[disabled]:focus, .btn-yellow[disabled]:hover, fieldset[disabled] .btn-yellow, fieldset[disabled] .btn-yellow.active, fieldset[disabled] .btn-yellow:active, fieldset[disabled] .btn-yellow:focus, fieldset[disabled] .btn-yellow:hover { background-color: rgb(254, 225, 136) !important; border-color: rgb(254, 225, 136); }
+.btn-yellow.active, .btn-yellow.focus, .btn-yellow:focus, .btn-yellow:hover, .open > .btn-yellow.active.dropdown-toggle, .open > .btn-yellow.dropdown-toggle { color: rgb(153, 102, 51); }
+.btn-light { color: rgb(136, 136, 136) !important; text-shadow: 0px -1px 0px rgba(250, 250, 250, 0.25) !important; }
+.btn.btn-link, .btn.btn-link:hover, .btn.btn-white { text-shadow: none !important; }
+.btn-light, .btn-light.focus, .btn-light:focus { background-color: rgb(231, 231, 231) !important; border-color: rgb(231, 231, 231); }
+.btn-light.focus:hover, .btn-light:active:hover, .btn-light:focus:active, .btn-light:focus:hover, .btn-light:hover, .open > .btn-light.dropdown-toggle, .open > .btn-light.dropdown-toggle.focus, .open > .btn-light.dropdown-toggle:active, .open > .btn-light.dropdown-toggle:focus, .open > .btn-light.dropdown-toggle:hover { background-color: rgb(217, 217, 217) !important; border-color: rgb(231, 231, 231); }
+.btn-light.no-border:active, .btn-light.no-border:hover { border-color: rgb(217, 217, 217); }
+.btn-light.no-hover:active, .btn-light.no-hover:hover { background-color: rgb(231, 231, 231) !important; }
+.btn-light.active, .btn-light.active:focus, .btn-light.active:hover, .btn-light.focus.active, .open > .btn-light.dropdown-toggle.active { background-color: rgb(224, 224, 224) !important; border-color: rgb(206, 206, 206); }
+.btn-light.no-border.active { background-color: rgb(216, 216, 216) !important; border-color: rgb(216, 216, 216); }
+.btn-light.disabled, .btn-light.disabled.active, .btn-light.disabled:active, .btn-light.disabled:focus, .btn-light.disabled:hover, .btn-light[disabled], .btn-light.active[disabled], .btn-light[disabled]:active, .btn-light[disabled]:focus, .btn-light[disabled]:hover, fieldset[disabled] .btn-light, fieldset[disabled] .btn-light.active, fieldset[disabled] .btn-light:active, fieldset[disabled] .btn-light:focus, fieldset[disabled] .btn-light:hover { background-color: rgb(231, 231, 231) !important; border-color: rgb(231, 231, 231); }
+.btn.btn-white, .btn.btn-white.no-hover:active, .btn.btn-white.no-hover:hover { background-color: rgb(255, 255, 255) !important; }
+.btn.btn-white, .btn.btn-white.active.no-border, .btn.btn-white.disabled, .btn.btn-white.disabled.active, .btn.btn-white.disabled:active, .btn.btn-white.disabled:focus, .btn.btn-white.disabled:hover, .btn.btn-white.no-border:active, .btn.btn-white.no-border:focus, .btn.btn-white.no-border:hover, .btn.btn-white[disabled], .btn.btn-white.active[disabled], .btn.btn-white[disabled]:active, .btn.btn-white[disabled]:focus, .btn.btn-white[disabled]:hover, .open > .btn.btn-white.active.dropdown-toggle.no-border, .open > .btn.btn-white.dropdown-toggle.no-border, fieldset[disabled] .btn.btn-white, fieldset[disabled] .btn.btn-white.active, fieldset[disabled] .btn.btn-white:active, fieldset[disabled] .btn.btn-white:focus, fieldset[disabled] .btn.btn-white:hover { border-color: rgb(204, 204, 204); }
+.btn-light.active, .btn-light.focus, .btn-light:focus, .btn-light:hover, .open > .btn-light.active.dropdown-toggle, .open > .btn-light.dropdown-toggle { color: rgb(136, 136, 136); }
+.btn-light.btn-mini::after, .btn-light.btn-xs::after { left: -2px; right: -2px; top: -2px; bottom: -2px; }
+.btn-light.btn-sm::after { left: -4px; right: -4px; top: -4px; bottom: -4px; }
+.btn-light .btn-lg::after { left: -6px; right: -6px; top: -6px; bottom: -6px; }
+.btn.btn-white { color: rgb(68, 68, 68) !important; }
+.btn.btn-white.active, .btn.btn-white:focus { box-shadow: 1px 1px 2px 0px rgba(0, 0, 0, 0.1) inset !important; }
+.btn.btn-white.active.btn-bold, .btn.btn-white.btn-bold:focus { box-shadow: 1px 1px 3px 0px rgba(0, 0, 0, 0.15) inset !important; }
+.btn.btn-white.active::after { display: none; }
+.btn.btn-white.active, .btn.btn-white:active, .btn.btn-white:focus, .btn.btn-white:hover, .open > .btn.btn-white.active.dropdown-toggle, .open > .btn.btn-white.dropdown-toggle { background-color: rgb(235, 235, 235) !important; border-color: rgb(204, 204, 204); color: rgb(58, 52, 52) !important; }
+.btn-white.btn-default { border-color: rgb(171, 186, 195); color: rgb(128, 144, 154) !important; }
+.btn-white.btn-default.active, .btn-white.btn-default:active, .btn-white.btn-default:focus, .btn-white.btn-default:hover, .open > .btn-white.btn-default.active.dropdown-toggle, .open > .btn-white.btn-default.dropdown-toggle { background-color: rgb(239, 242, 244) !important; border-color: rgb(171, 186, 195); color: rgb(107, 133, 149) !important; }
+.btn-white.btn-default.active.no-border, .btn-white.btn-default.disabled, .btn-white.btn-default.disabled.active, .btn-white.btn-default.disabled:active, .btn-white.btn-default.disabled:focus, .btn-white.btn-default.disabled:hover, .btn-white.btn-default.no-border:active, .btn-white.btn-default.no-border:focus, .btn-white.btn-default.no-border:hover, .btn-white.btn-default[disabled], .btn-white.btn-default.active[disabled], .btn-white.btn-default[disabled]:active, .btn-white.btn-default[disabled]:focus, .btn-white.btn-default[disabled]:hover, .open > .btn-white.btn-default.active.dropdown-toggle.no-border, .open > .btn-white.btn-default.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-default, fieldset[disabled] .btn-white.btn-default.active, fieldset[disabled] .btn-white.btn-default:active, fieldset[disabled] .btn-white.btn-default:focus, fieldset[disabled] .btn-white.btn-default:hover { border-color: rgb(171, 186, 195); }
+.btn-white.btn-primary { border-color: rgb(138, 175, 206); color: rgb(102, 136, 166) !important; }
+.btn-white.btn-primary.active, .btn-white.btn-primary:active, .btn-white.btn-primary:focus, .btn-white.btn-primary:hover, .open > .btn-white.btn-primary.active.dropdown-toggle, .open > .btn-white.btn-primary.dropdown-toggle { background-color: rgb(234, 242, 248) !important; border-color: rgb(138, 175, 206); color: rgb(83, 124, 159) !important; }
+.btn-white.btn-primary.active.no-border, .btn-white.btn-primary.disabled, .btn-white.btn-primary.disabled.active, .btn-white.btn-primary.disabled:active, .btn-white.btn-primary.disabled:focus, .btn-white.btn-primary.disabled:hover, .btn-white.btn-primary.no-border:active, .btn-white.btn-primary.no-border:focus, .btn-white.btn-primary.no-border:hover, .btn-white.btn-primary[disabled], .btn-white.btn-primary.active[disabled], .btn-white.btn-primary[disabled]:active, .btn-white.btn-primary[disabled]:focus, .btn-white.btn-primary[disabled]:hover, .open > .btn-white.btn-primary.active.dropdown-toggle.no-border, .open > .btn-white.btn-primary.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-primary, fieldset[disabled] .btn-white.btn-primary.active, fieldset[disabled] .btn-white.btn-primary:active, fieldset[disabled] .btn-white.btn-primary:focus, fieldset[disabled] .btn-white.btn-primary:hover { border-color: rgb(138, 175, 206); }
+.btn-white.btn-success { border-color: rgb(167, 201, 161); color: rgb(129, 168, 123) !important; }
+.btn-white.btn-success.active, .btn-white.btn-success:active, .btn-white.btn-success:focus, .btn-white.btn-success:hover, .open > .btn-white.btn-success.active.dropdown-toggle, .open > .btn-white.btn-success.dropdown-toggle { background-color: rgb(237, 244, 235) !important; border-color: rgb(167, 201, 161); color: rgb(110, 164, 101) !important; }
+.btn-white.btn-success.active.no-border, .btn-white.btn-success.disabled, .btn-white.btn-success.disabled.active, .btn-white.btn-success.disabled:active, .btn-white.btn-success.disabled:focus, .btn-white.btn-success.disabled:hover, .btn-white.btn-success.no-border:active, .btn-white.btn-success.no-border:focus, .btn-white.btn-success.no-border:hover, .btn-white.btn-success[disabled], .btn-white.btn-success.active[disabled], .btn-white.btn-success[disabled]:active, .btn-white.btn-success[disabled]:focus, .btn-white.btn-success[disabled]:hover, .open > .btn-white.btn-success.active.dropdown-toggle.no-border, .open > .btn-white.btn-success.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-success, fieldset[disabled] .btn-white.btn-success.active, fieldset[disabled] .btn-white.btn-success:active, fieldset[disabled] .btn-white.btn-success:focus, fieldset[disabled] .btn-white.btn-success:hover { border-color: rgb(167, 201, 161); }
+.btn-white.btn-danger { border-color: rgb(215, 165, 157); color: rgb(183, 131, 122) !important; }
+.btn-white.btn-danger.active, .btn-white.btn-danger:active, .btn-white.btn-danger:focus, .btn-white.btn-danger:hover, .open > .btn-white.btn-danger.active.dropdown-toggle, .open > .btn-white.btn-danger.dropdown-toggle { background-color: rgb(251, 244, 243) !important; border-color: rgb(215, 165, 157); color: rgb(180, 111, 100) !important; }
+.btn-white.btn-danger.active.no-border, .btn-white.btn-danger.disabled, .btn-white.btn-danger.disabled.active, .btn-white.btn-danger.disabled:active, .btn-white.btn-danger.disabled:focus, .btn-white.btn-danger.disabled:hover, .btn-white.btn-danger.no-border:active, .btn-white.btn-danger.no-border:focus, .btn-white.btn-danger.no-border:hover, .btn-white.btn-danger[disabled], .btn-white.btn-danger.active[disabled], .btn-white.btn-danger[disabled]:active, .btn-white.btn-danger[disabled]:focus, .btn-white.btn-danger[disabled]:hover, .open > .btn-white.btn-danger.active.dropdown-toggle.no-border, .open > .btn-white.btn-danger.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-danger, fieldset[disabled] .btn-white.btn-danger.active, fieldset[disabled] .btn-white.btn-danger:active, fieldset[disabled] .btn-white.btn-danger:focus, fieldset[disabled] .btn-white.btn-danger:hover { border-color: rgb(215, 165, 157); }
+.btn-white.btn-warning { border-color: rgb(231, 185, 121); color: rgb(218, 164, 88) !important; }
+.btn-white.btn-warning.active, .btn-white.btn-warning:active, .btn-white.btn-warning:focus, .btn-white.btn-warning:hover, .open > .btn-white.btn-warning.active.dropdown-toggle, .open > .btn-white.btn-warning.dropdown-toggle { background-color: rgb(254, 247, 236) !important; border-color: rgb(231, 185, 121); color: rgb(219, 154, 61) !important; }
+.btn-white.btn-warning.active.no-border, .btn-white.btn-warning.disabled, .btn-white.btn-warning.disabled.active, .btn-white.btn-warning.disabled:active, .btn-white.btn-warning.disabled:focus, .btn-white.btn-warning.disabled:hover, .btn-white.btn-warning.no-border:active, .btn-white.btn-warning.no-border:focus, .btn-white.btn-warning.no-border:hover, .btn-white.btn-warning[disabled], .btn-white.btn-warning.active[disabled], .btn-white.btn-warning[disabled]:active, .btn-white.btn-warning[disabled]:focus, .btn-white.btn-warning[disabled]:hover, .open > .btn-white.btn-warning.active.dropdown-toggle.no-border, .open > .btn-white.btn-warning.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-warning, fieldset[disabled] .btn-white.btn-warning.active, fieldset[disabled] .btn-white.btn-warning:active, fieldset[disabled] .btn-white.btn-warning:focus, fieldset[disabled] .btn-white.btn-warning:hover { border-color: rgb(231, 185, 121); }
+.btn-white.btn-info, .btn-white.btn-info.active.no-border, .btn-white.btn-info.disabled, .btn-white.btn-info.disabled.active, .btn-white.btn-info.disabled:active, .btn-white.btn-info.disabled:focus, .btn-white.btn-info.disabled:hover, .btn-white.btn-info.no-border:active, .btn-white.btn-info.no-border:focus, .btn-white.btn-info.no-border:hover, .btn-white.btn-info[disabled], .btn-white.btn-info.active[disabled], .btn-white.btn-info[disabled]:active, .btn-white.btn-info[disabled]:focus, .btn-white.btn-info[disabled]:hover, .open > .btn-white.btn-info.active.dropdown-toggle.no-border, .open > .btn-white.btn-info.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-info, fieldset[disabled] .btn-white.btn-info.active, fieldset[disabled] .btn-white.btn-info:active, fieldset[disabled] .btn-white.btn-info:focus, fieldset[disabled] .btn-white.btn-info:hover { border-color: rgb(143, 188, 217); }
+.btn-white.btn-info { color: rgb(112, 160, 193) !important; }
+.btn-white.btn-info.active, .btn-white.btn-info:active, .btn-white.btn-info:focus, .btn-white.btn-info:hover, .open > .btn-white.btn-info.active.dropdown-toggle, .open > .btn-white.btn-info.dropdown-toggle { background-color: rgb(238, 245, 250) !important; border-color: rgb(143, 188, 217); color: rgb(88, 150, 191) !important; }
+.btn-white.btn-inverse { border-color: rgb(149, 149, 149); color: rgb(85, 85, 85) !important; }
+.btn-white.btn-inverse.active, .btn-white.btn-inverse:active, .btn-white.btn-inverse:focus, .btn-white.btn-inverse:hover, .open > .btn-white.btn-inverse.active.dropdown-toggle, .open > .btn-white.btn-inverse.dropdown-toggle { background-color: rgb(228, 228, 228) !important; border-color: rgb(149, 149, 149); color: rgb(76, 69, 69) !important; }
+.btn-white.btn-inverse.active.no-border, .btn-white.btn-inverse.disabled, .btn-white.btn-inverse.disabled.active, .btn-white.btn-inverse.disabled:active, .btn-white.btn-inverse.disabled:focus, .btn-white.btn-inverse.disabled:hover, .btn-white.btn-inverse.no-border:active, .btn-white.btn-inverse.no-border:focus, .btn-white.btn-inverse.no-border:hover, .btn-white.btn-inverse[disabled], .btn-white.btn-inverse.active[disabled], .btn-white.btn-inverse[disabled]:active, .btn-white.btn-inverse[disabled]:focus, .btn-white.btn-inverse[disabled]:hover, .open > .btn-white.btn-inverse.active.dropdown-toggle.no-border, .open > .btn-white.btn-inverse.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-inverse, fieldset[disabled] .btn-white.btn-inverse.active, fieldset[disabled] .btn-white.btn-inverse:active, fieldset[disabled] .btn-white.btn-inverse:focus, fieldset[disabled] .btn-white.btn-inverse:hover { border-color: rgb(149, 149, 149); }
+.btn-white.btn-pink, .btn-white.btn-pink.active.no-border, .btn-white.btn-pink.disabled, .btn-white.btn-pink.disabled.active, .btn-white.btn-pink.disabled:active, .btn-white.btn-pink.disabled:focus, .btn-white.btn-pink.disabled:hover, .btn-white.btn-pink.no-border:active, .btn-white.btn-pink.no-border:focus, .btn-white.btn-pink.no-border:hover, .btn-white.btn-pink[disabled], .btn-white.btn-pink.active[disabled], .btn-white.btn-pink[disabled]:active, .btn-white.btn-pink[disabled]:focus, .btn-white.btn-pink[disabled]:hover, .open > .btn-white.btn-pink.active.dropdown-toggle.no-border, .open > .btn-white.btn-pink.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-pink, fieldset[disabled] .btn-white.btn-pink.active, fieldset[disabled] .btn-white.btn-pink:active, fieldset[disabled] .btn-white.btn-pink:focus, fieldset[disabled] .btn-white.btn-pink:hover { border-color: rgb(210, 153, 174); }
+.btn-white.btn-pink { color: rgb(175, 111, 135) !important; }
+.btn-white.btn-pink.active, .btn-white.btn-pink:active, .btn-white.btn-pink:focus, .btn-white.btn-pink:hover, .open > .btn-white.btn-pink.active.dropdown-toggle, .open > .btn-white.btn-pink.dropdown-toggle { background-color: rgb(251, 239, 244) !important; border-color: rgb(210, 153, 174); color: rgb(172, 89, 120) !important; }
+.btn-white.btn-purple { border-color: rgb(183, 177, 198); color: rgb(125, 111, 162) !important; }
+.btn-white.btn-purple.active, .btn-white.btn-purple:active, .btn-white.btn-purple:focus, .btn-white.btn-purple:hover, .open > .btn-white.btn-purple.active.dropdown-toggle, .open > .btn-white.btn-purple.dropdown-toggle { background-color: rgb(239, 237, 245) !important; border-color: rgb(183, 177, 198); color: rgb(109, 91, 156) !important; }
+.btn-white.btn-purple.active.no-border, .btn-white.btn-purple.disabled, .btn-white.btn-purple.disabled.active, .btn-white.btn-purple.disabled:active, .btn-white.btn-purple.disabled:focus, .btn-white.btn-purple.disabled:hover, .btn-white.btn-purple.no-border:active, .btn-white.btn-purple.no-border:focus, .btn-white.btn-purple.no-border:hover, .btn-white.btn-purple[disabled], .btn-white.btn-purple.active[disabled], .btn-white.btn-purple[disabled]:active, .btn-white.btn-purple[disabled]:focus, .btn-white.btn-purple[disabled]:hover, .open > .btn-white.btn-purple.active.dropdown-toggle.no-border, .open > .btn-white.btn-purple.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-purple, fieldset[disabled] .btn-white.btn-purple.active, fieldset[disabled] .btn-white.btn-purple:active, fieldset[disabled] .btn-white.btn-purple:focus, fieldset[disabled] .btn-white.btn-purple:hover { border-color: rgb(183, 177, 198); }
+.btn-white.btn-yellow { border-color: rgb(236, 209, 129); color: rgb(211, 166, 26) !important; }
+.btn-white.btn-yellow.active, .btn-white.btn-yellow:active, .btn-white.btn-yellow:focus, .btn-white.btn-yellow:hover, .open > .btn-white.btn-yellow.active.dropdown-toggle, .open > .btn-white.btn-yellow.dropdown-toggle { background-color: rgb(253, 247, 228) !important; border-color: rgb(236, 209, 129); color: rgb(194, 151, 18) !important; }
+.btn-white.btn-yellow.active.no-border, .btn-white.btn-yellow.disabled, .btn-white.btn-yellow.disabled.active, .btn-white.btn-yellow.disabled:active, .btn-white.btn-yellow.disabled:focus, .btn-white.btn-yellow.disabled:hover, .btn-white.btn-yellow.no-border:active, .btn-white.btn-yellow.no-border:focus, .btn-white.btn-yellow.no-border:hover, .btn-white.btn-yellow[disabled], .btn-white.btn-yellow.active[disabled], .btn-white.btn-yellow[disabled]:active, .btn-white.btn-yellow[disabled]:focus, .btn-white.btn-yellow[disabled]:hover, .open > .btn-white.btn-yellow.active.dropdown-toggle.no-border, .open > .btn-white.btn-yellow.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-yellow, fieldset[disabled] .btn-white.btn-yellow.active, fieldset[disabled] .btn-white.btn-yellow:active, fieldset[disabled] .btn-white.btn-yellow:focus, fieldset[disabled] .btn-white.btn-yellow:hover { border-color: rgb(236, 209, 129); }
+.btn-white.btn-grey, .btn-white.btn-grey.active.no-border, .btn-white.btn-grey.disabled, .btn-white.btn-grey.disabled.active, .btn-white.btn-grey.disabled:active, .btn-white.btn-grey.disabled:focus, .btn-white.btn-grey.disabled:hover, .btn-white.btn-grey.no-border:active, .btn-white.btn-grey.no-border:focus, .btn-white.btn-grey.no-border:hover, .btn-white.btn-grey[disabled], .btn-white.btn-grey.active[disabled], .btn-white.btn-grey[disabled]:active, .btn-white.btn-grey[disabled]:focus, .btn-white.btn-grey[disabled]:hover, .open > .btn-white.btn-grey.active.dropdown-toggle.no-border, .open > .btn-white.btn-grey.dropdown-toggle.no-border, fieldset[disabled] .btn-white.btn-grey, fieldset[disabled] .btn-white.btn-grey.active, fieldset[disabled] .btn-white.btn-grey:active, fieldset[disabled] .btn-white.btn-grey:focus, fieldset[disabled] .btn-white.btn-grey:hover { border-color: rgb(198, 198, 198); }
+.btn-white.btn-grey { color: rgb(140, 140, 140) !important; }
+.btn-white.btn-grey.active, .btn-white.btn-grey:active, .btn-white.btn-grey:focus, .btn-white.btn-grey:hover, .open > .btn-white.btn-grey.active.dropdown-toggle, .open > .btn-white.btn-grey.dropdown-toggle { background-color: rgb(237, 237, 237) !important; border-color: rgb(198, 198, 198); color: rgb(133, 121, 121) !important; }
+.btn-white.btn-transparent { background-color: rgba(0, 0, 0, 0.4) !important; }
+.btn-white.btn-transparent:hover { background-color: rgba(0, 0, 0, 0.5) !important; }
+.btn-white.btn-transparent:active, .btn-white.btn-transparent:focus { background-color: rgba(0, 0, 0, 0.6) !important; }
+.btn-white.no-border { border-color: transparent !important; }
+.btn.disabled.active, .btn.disabled:active, .btn.disabled:focus, .btn.active[disabled], .btn[disabled]:active, .btn[disabled]:focus { outline: 0px none; }
+.btn.disabled:active, .btn[disabled]:active { top: 0px; left: 0px; }
+.btn.active::after { display: inline-block; content: ""; position: absolute; border-bottom: 1px solid rgb(239, 229, 181); left: -4px; right: -4px; bottom: -4px; }
+.btn.btn-link, .btn.btn-no-border { border-width: 0px !important; }
+.btn.active.btn-sm::after { left: -3px; right: -3px; bottom: -3px; }
+.btn.active.btn-lg::after { left: -5px; right: -5px; bottom: -5px; }
+.btn.active.btn-mini::after, .btn.active.btn-minier::after, .btn.active.btn-xs::after { left: -1px; right: -1px; bottom: -2px; }
+.btn.active.btn-minier::after { bottom: -1px; }
+.btn.active.btn-yellow::after { border-bottom-color: rgb(201, 99, 56); }
+.btn.active.btn-light { color: rgb(81, 81, 81); }
+.btn.active.btn-light::after { border-bottom-color: rgb(181, 181, 181); }
+.btn > .ace-icon { margin-right: 4px; }
+.btn > .ace-icon.icon-on-right { margin-right: 0px; margin-left: 4px; }
+.btn > .icon-only.ace-icon { margin: 0px !important; text-align: center; padding: 0px; }
+.btn-lg > .ace-icon { margin-right: 6px; }
+.btn-lg > .ace-icon.icon-on-right { margin-right: 0px; margin-left: 6px; }
+.btn-sm > .ace-icon { margin-right: 3px; }
+.btn-sm > .ace-icon.icon-on-right { margin-right: 0px; margin-left: 3px; }
+.btn-mini > .ace-icon, .btn-minier > .ace-icon, .btn-xs > .ace-icon { margin-right: 2px; }
+.btn-mini > .ace-icon.icon-on-right, .btn-minier > .ace-icon.icon-on-right, .btn-xs > .ace-icon.icon-on-right { margin-right: 0px; margin-left: 2px; }
+.btn.btn-link { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; color: rgb(0, 136, 204) !important; padding: 4px 12px !important; line-height: 20px !important; }
+.btn.btn-link:hover { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; }
+.btn.btn-link.active, .btn.btn-link:active, .btn.btn-link:focus, .open > .btn.btn-link.active, .open > .btn.btn-link:active, .open > .btn.btn-link:focus { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; text-decoration: underline; color: rgb(0, 156, 235) !important; }
+.btn.btn-link.active::after, .btn.btn-link:active::after, .btn.btn-link:focus::after { display: none; }
+.btn.btn-link.disabled, .btn.btn-link[disabled] { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; opacity: 0.65; text-decoration: none !important; }
+.btn-group:first-child { margin-left: 0px; }
+.btn-group > .btn, .btn-group > .btn + .btn, .btn-group > .btn:first-child { margin: 0px 1px 0px 0px; }
+.btn-group > .btn > .caret { margin-top: 15px; margin-left: 1px; border-width: 5px; border-top-color: rgb(255, 255, 255); }
+.btn-group > .btn.btn-sm > .caret { margin-top: 10px; border-width: 4px; }
+.btn-group > .btn.btn-lg > .caret { margin-top: 18px; border-width: 6px; }
+.btn-group > .btn.btn-mini > .caret, .btn-group > .btn.btn-xs > .caret { margin-top: 9px; border-width: 4px; }
+.btn-group > .btn.btn-minier > .caret { margin-top: 7px; border-width: 3px; }
+.btn-group > .btn + .btn.dropdown-toggle { padding-right: 3px; padding-left: 3px; }
+.btn-group > .btn + .btn-lg.dropdown-toggle { padding-right: 4px; padding-left: 4px; }
+.btn-group + .btn, .btn-group > .btn { margin: 0px 1px 0px 0px; border-width: 3px; }
+.btn-group + .btn.active::after, .btn-group > .btn.active::after { left: -2px; right: -2px; bottom: -2px; border-bottom-width: 1px; }
+.btn-group + .btn-lg, .btn-group > .btn-lg { border-width: 4px; }
+.btn-group + .btn-lg.active::after, .btn-group > .btn-lg.active::after { left: -3px; right: -3px; bottom: -3px; border-bottom-width: 1px; }
+.btn-group + .btn-sm, .btn-group > .btn-sm { border-width: 2px; }
+.btn-group + .btn-mini, .btn-group + .btn-minier, .btn-group + .btn-xs, .btn-group > .btn-mini, .btn-group > .btn-minier, .btn-group > .btn-xs, .btn.btn-white { border-width: 1px; }
+.btn-group + .btn-sm.active::after, .btn-group > .btn-sm.active::after { left: -1px; right: -1px; bottom: -1px; border-bottom-width: 1px; }
+.btn-group + .btn-mini.active::after, .btn-group + .btn-minier.active::after, .btn-group + .btn-xs.active::after, .btn-group > .btn-mini.active::after, .btn-group > .btn-minier.active::after, .btn-group > .btn-xs.active::after { left: 0px; right: 0px; bottom: 0px; border-bottom-width: 1px; }
+.btn.btn-bold, .btn.btn-round { border-bottom-width: 2px; }
+.btn-group-vertical > .btn:first-child:not(:last-child), .btn-group-vertical > .btn:last-child:not(:first-child) { border-radius: 0px; }
+.btn-group-vertical > .btn, .btn-group-vertical > .btn + .btn { margin: 1px 0px 0px; }
+.btn-group-vertical > .btn:first-child { margin-top: 0px; }
+.btn-group.btn-overlap > .btn { margin-right: -1px; }
+.btn-group.btn-corner > .btn:first-child { border-bottom-left-radius: 8px; border-top-left-radius: 8px; }
+.btn-group.btn-corner > .btn:last-child { border-bottom-right-radius: 8px; border-top-right-radius: 8px; }
+.btn-group.btn-corner > .btn.btn-sm:first-child { border-bottom-left-radius: 6px; border-top-left-radius: 6px; }
+.btn-group.btn-corner > .btn.btn-sm:last-child { border-bottom-right-radius: 6px; border-top-right-radius: 6px; }
+.btn-group.btn-corner > .btn.btn-mini:first-child, .btn-group.btn-corner > .btn.btn-xs:first-child { border-bottom-left-radius: 4px; border-top-left-radius: 4px; }
+.btn-group.btn-corner > .btn.btn-mini:last-child, .btn-group.btn-corner > .btn.btn-xs:last-child { border-bottom-right-radius: 4px; border-top-right-radius: 4px; }
+.btn.btn-round { border-radius: 4px !important; }
+.btn.btn-app { display: inline-block; width: 100px; font-size: 18px; font-weight: 400; color: rgb(255, 255, 255); text-align: center; border: medium none; border-radius: 12px; padding: 12px 0px 8px; margin: 2px; line-height: 1.7; position: relative; }
+.btn-app, .btn-app.btn-default, .btn-app.btn-default.disabled:hover, .btn-app.btn-default.no-hover:hover, .btn-app.disabled:hover, .btn-app.no-hover:hover { background: rgb(180, 194, 204) linear-gradient(to bottom, rgb(188, 201, 213) 0px, rgb(171, 186, 195) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-default:hover, .btn-app:hover { background: rgb(155, 174, 188) linear-gradient(to bottom, rgb(163, 181, 197) 0px, rgb(147, 166, 178) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-primary, .btn-app.btn-primary.disabled:hover, .btn-app.btn-primary.no-hover:hover { background: rgb(42, 139, 203) linear-gradient(to bottom, rgb(59, 152, 214) 0px, rgb(25, 126, 193) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-primary:hover { background: rgb(29, 111, 166) linear-gradient(to bottom, rgb(38, 126, 184) 0px, rgb(19, 97, 148) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-info, .btn-app.btn-info.disabled:hover, .btn-app.btn-info.no-hover:hover { background: rgb(104, 173, 222) linear-gradient(to bottom, rgb(117, 181, 230) 0px, rgb(91, 164, 213) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-info:hover { background: rgb(63, 150, 212) linear-gradient(to bottom, rgb(74, 158, 222) 0px, rgb(52, 141, 201) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-success, .btn-app.btn-success.disabled:hover, .btn-app.btn-success.no-hover:hover { background: rgb(133, 181, 88) linear-gradient(to bottom, rgb(142, 191, 96) 0px, rgb(125, 170, 80) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-success:hover { background: rgb(108, 152, 66) linear-gradient(to bottom, rgb(116, 168, 68) 0px, rgb(100, 135, 64) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-danger, .btn-app.btn-danger.disabled:hover, .btn-app.btn-danger.no-hover:hover { background: rgb(211, 65, 59) linear-gradient(to bottom, rgb(213, 91, 82) 0px, rgb(209, 39, 35) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-danger:hover { background: rgb(181, 44, 38) linear-gradient(to bottom, rgb(196, 58, 48) 0px, rgb(165, 31, 28) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-warning, .btn-app.btn-warning.disabled:hover, .btn-app.btn-warning.no-hover:hover { background: rgb(255, 180, 75) linear-gradient(to bottom, rgb(255, 191, 102) 0px, rgb(255, 168, 48) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-warning:hover { background: rgb(254, 158, 25) linear-gradient(to bottom, rgb(255, 170, 51) 0px, rgb(252, 146, 0) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-purple, .btn-app.btn-purple.disabled:hover, .btn-app.btn-purple.no-hover:hover { background: rgb(152, 137, 193) linear-gradient(to bottom, rgb(166, 150, 206) 0px, rgb(138, 124, 180) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-purple:hover { background: rgb(123, 104, 175) linear-gradient(to bottom, rgb(137, 115, 190) 0px, rgb(109, 92, 161) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-pink, .btn-app.btn-pink.disabled:hover, .btn-app.btn-pink.no-hover:hover { background: rgb(213, 76, 126) linear-gradient(to bottom, rgb(219, 94, 140) 0px, rgb(206, 57, 112) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-pink:hover { background: rgb(190, 47, 100) linear-gradient(to bottom, rgb(210, 52, 110) 0px, rgb(170, 42, 89) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-inverse, .btn-app.btn-inverse.disabled:hover, .btn-app.btn-inverse.no-hover:hover { background: rgb(68, 68, 68) linear-gradient(to bottom, rgb(85, 85, 85) 0px, rgb(51, 51, 51) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-inverse:hover { background: rgb(43, 43, 43) linear-gradient(to bottom, rgb(59, 59, 59) 0px, rgb(26, 26, 26) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-grey, .btn-app.btn-grey.disabled:hover, .btn-app.btn-grey.no-hover:hover { background: rgb(121, 121, 121) linear-gradient(to bottom, rgb(137, 137, 137) 0px, rgb(105, 105, 105) 100%) repeat-x scroll 0% 0% !important; }
+.btn-app.btn-grey:hover { background: rgb(108, 108, 108) linear-gradient(to bottom, rgb(124, 124, 124) 0px, rgb(92, 92, 92) 100%) repeat-x scroll 0% 0% !important; }
+.btn.btn-app.btn-light { color: rgb(90, 90, 90) !important; text-shadow: 0px 1px 1px rgb(238, 238, 238) !important; }
+.btn.btn-app.btn-light, .btn.btn-app.btn-light.disabled:hover, .btn.btn-app.btn-light.no-hover:hover { background: rgb(237, 237, 237) linear-gradient(to bottom, rgb(244, 244, 244) 0px, rgb(230, 230, 230) 100%) repeat-x scroll 0% 0% !important; }
+.btn.btn-app.btn-light:hover { background: rgb(224, 224, 224) linear-gradient(to bottom, rgb(231, 231, 231) 0px, rgb(217, 217, 217) 100%) repeat-x scroll 0% 0% !important; }
+.btn.btn-app.btn-yellow { color: rgb(153, 102, 51) !important; text-shadow: 0px -1px 0px rgba(255, 255, 255, 0.4) !important; }
+.btn.btn-app.btn-yellow, .btn.btn-app.btn-yellow.disabled:hover, .btn.btn-app.btn-yellow.no-hover:hover { background: rgb(254, 224, 136) linear-gradient(to bottom, rgb(255, 232, 165) 0px, rgb(252, 215, 106) 100%) repeat-x scroll 0% 0% !important; }
+.btn.btn-app.btn-yellow:hover { background: rgb(253, 217, 110) linear-gradient(to bottom, rgb(255, 225, 139) 0px, rgb(251, 208, 81) 100%) repeat-x scroll 0% 0% !important; }
+.badge, .label { font-weight: 400; background-color: rgb(171, 186, 195); text-shadow: none; }
+.btn.btn-app > .ace-icon { opacity: 0.88; }
+.btn.btn-app:hover > .ace-icon { opacity: 1; }
+.btn.btn-app.btn-sm { width: 80px; font-size: 16px; border-radius: 10px; line-height: 1.5; }
+.btn.btn-app.btn-xs { width: 64px; font-size: 15px; border-radius: 8px; padding-bottom: 7px; padding-top: 8px; line-height: 1.45; }
+.btn.btn-app > .ace-icon { display: block; font-size: 42px; margin: 0px 0px 4px; line-height: 36px; min-width: 0px; padding: 0px; }
+.dropdown-50, .dropdown-menu.dropdown-only-icon { min-width: 50px; }
+.btn.btn-app.btn-sm > .ace-icon { display: block; font-size: 32px; line-height: 30px; margin: 0px 0px 3px; }
+.btn.btn-app.btn-xs > .ace-icon { display: block; font-size: 24px; line-height: 24px; margin: 0px; }
+.btn.btn-app.no-radius { border-radius: 0px; }
+.btn.btn-app.radius-4 { border-radius: 4px; }
+.btn.btn-app > .badge, .btn.btn-app > .label { position: absolute !important; top: -2px; right: -2px; padding: 1px 3px; text-align: center; font-size: 12px; color: rgb(255, 255, 255); }
+.btn.btn-app > .badge.badge-left, .btn.btn-app > .badge.label-left, .btn.btn-app > .label.badge-left, .btn.btn-app > .label.label-left { right: auto; left: -2px; }
+.btn.btn-app > .badge-yellow, .btn.btn-app > .label-yellow { color: rgb(153, 102, 51); }
+.btn.btn-app > .badge-light, .btn.btn-app > .label-light { color: rgb(136, 136, 136); }
+.btn.btn-app > .label { padding: 1px 6px 3px; font-size: 13px; }
+.badge, .label { font-size: 12px; }
+.btn.btn-app.no-radius > .badge, .btn.btn-app.radius-4 > .badge { border-radius: 3px; }
+.badge.no-radius, .btn.btn-app.no-radius > .badge.no-radius, .btn.btn-app.radius-4 > .badge.no-radius, .label { border-radius: 0px; }
+.btn.btn-app.active { color: rgb(255, 255, 255); }
+.btn.btn-app.active::after { display: none; }
+.btn.btn-app.active.btn-yellow { color: rgb(153, 102, 51); border-color: rgb(254, 225, 136); }
+.btn.btn-app.active.btn-light { color: rgb(81, 81, 81); }
+.btn-group > .btn-app:first-child:not(:last-child):not(.dropdown-toggle) { margin-right: 24px; }
+.label.arrowed-in-right, .label.arrowed-right { margin-right: 5px; }
+.btn-group > .btn-app + .btn-app.dropdown-toggle { position: absolute; width: auto; height: 100%; padding-left: 6px; padding-right: 6px; margin-left: -23px; border-bottom-left-radius: 0px; border-top-left-radius: 0px; right: 0px; }
+.label.arrowed, .label.arrowed-in { margin-left: 5px; }
+.btn.btn-app.btn-light, .btn.btn-app.btn-yellow { box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.08) inset !important; }
+.dropdown-menu, .ui-datepicker { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.label { color: rgb(255, 255, 255); display: inline-block; }
+.label[class*="col-"][class*="arrow"] { min-height: 0px; }
+@media not all {
+}
+.badge { padding-top: 1px; padding-bottom: 3px; line-height: 15px; }
+.badge.radius-1 { border-radius: 1px; }
+.badge.radius-2 { border-radius: 2px; }
+.badge.radius-3 { border-radius: 3px; }
+.badge.radius-4 { border-radius: 4px; }
+.badge.radius-5 { border-radius: 5px; }
+.badge.radius-6 { border-radius: 6px; }
+.badge-transparent, .badge.badge-transparent, .label-transparent, .label.label-transparent { background-color: transparent; }
+.badge-grey, .badge.badge-grey, .label-grey, .label.label-grey { background-color: rgb(160, 160, 160); }
+.badge-info, .badge.badge-info, .label-info, .label.label-info { background-color: rgb(58, 135, 173); }
+.badge-primary, .badge.badge-primary, .label-primary, .label.label-primary { background-color: rgb(66, 139, 202); }
+.badge-success, .badge.badge-success, .label-success, .label.label-success { background-color: rgb(130, 175, 111); }
+.badge-danger, .badge-important, .badge.badge-danger, .badge.badge-important, .label-danger, .label-important, .label.label-danger, .label.label-important { background-color: rgb(209, 91, 71); }
+.badge-inverse, .badge.badge-inverse, .label-inverse, .label.label-inverse { background-color: rgb(51, 51, 51); }
+.badge-warning, .badge.badge-warning, .label-warning, .label.label-warning { background-color: rgb(248, 148, 6); }
+.badge-pink, .badge.badge-pink, .label-pink, .label.label-pink { background-color: rgb(214, 72, 126); }
+.badge-purple, .badge.badge-purple, .label-purple, .label.label-purple { background-color: rgb(149, 133, 191); }
+.badge-yellow, .badge.badge-yellow, .label-yellow, .label.label-yellow { background-color: rgb(254, 225, 136); }
+.badge-light, .badge.badge-light, .label-light, .label.label-light { background-color: rgb(231, 231, 231); }
+.badge-yellow, .label-yellow { color: rgb(153, 102, 51); border-color: rgb(254, 225, 136); }
+.badge-light, .label-light { color: rgb(136, 136, 136); }
+.label.arrowed, .label.arrowed-in { position: relative; z-index: 1; }
+.label.arrowed-in::before, .label.arrowed::before { display: inline-block; content: ""; position: absolute; top: 0px; z-index: -1; border-width: 1px; border-style: solid; border-color: transparent rgb(171, 186, 195) transparent transparent; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; }
+.label.arrowed-in::before { border-color: rgb(171, 186, 195) rgb(171, 186, 195) rgb(171, 186, 195) transparent; }
+.label.arrowed-in-right, .label.arrowed-right { position: relative; z-index: 1; }
+.label.arrowed-in-right::after, .label.arrowed-right::after { display: inline-block; content: ""; position: absolute; top: 0px; z-index: -1; border-width: 1px; border-style: solid; border-color: transparent transparent transparent rgb(171, 186, 195); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; }
+.label.arrowed-in-right::after { border-color: rgb(171, 186, 195) transparent rgb(171, 186, 195) rgb(171, 186, 195); }
+.label-info.arrowed::before { border-right-color: rgb(58, 135, 173); }
+.label-info.arrowed-in::before { border-color: rgb(58, 135, 173) rgb(58, 135, 173) rgb(58, 135, 173) transparent; }
+.label-info.arrowed-right::after { border-left-color: rgb(58, 135, 173); }
+.label-info.arrowed-in-right::after { border-color: rgb(58, 135, 173) transparent rgb(58, 135, 173) rgb(58, 135, 173); }
+.label-primary.arrowed::before { border-right-color: rgb(66, 139, 202); }
+.label-primary.arrowed-in::before { border-color: rgb(66, 139, 202) rgb(66, 139, 202) rgb(66, 139, 202) transparent; }
+.label-primary.arrowed-right::after { border-left-color: rgb(66, 139, 202); }
+.label-primary.arrowed-in-right::after { border-color: rgb(66, 139, 202) transparent rgb(66, 139, 202) rgb(66, 139, 202); }
+.label-success.arrowed::before { border-right-color: rgb(130, 175, 111); }
+.label-success.arrowed-in::before { border-color: rgb(130, 175, 111) rgb(130, 175, 111) rgb(130, 175, 111) transparent; }
+.label-success.arrowed-right::after { border-left-color: rgb(130, 175, 111); }
+.label-success.arrowed-in-right::after { border-color: rgb(130, 175, 111) transparent rgb(130, 175, 111) rgb(130, 175, 111); }
+.label-warning.arrowed::before { border-right-color: rgb(248, 148, 6); }
+.label-danger.arrowed::before, .label-important.arrowed::before { border-right-color: rgb(209, 91, 71); }
+.label-warning.arrowed-in::before { border-color: rgb(248, 148, 6) rgb(248, 148, 6) rgb(248, 148, 6) transparent; }
+.label-warning.arrowed-right::after { border-left-color: rgb(248, 148, 6); }
+.label-danger.arrowed-right::after, .label-important.arrowed-right::after { border-left-color: rgb(209, 91, 71); }
+.label-warning.arrowed-in-right::after { border-color: rgb(248, 148, 6) transparent rgb(248, 148, 6) rgb(248, 148, 6); }
+.label-important.arrowed-in::before { border-color: rgb(209, 91, 71) rgb(209, 91, 71) rgb(209, 91, 71) transparent; }
+.label-important.arrowed-in-right::after { border-color: rgb(209, 91, 71) transparent rgb(209, 91, 71) rgb(209, 91, 71); }
+.label-danger.arrowed-in::before { border-color: rgb(209, 91, 71) rgb(209, 91, 71) rgb(209, 91, 71) transparent; }
+.label-danger.arrowed-in-right::after { border-color: rgb(209, 91, 71) transparent rgb(209, 91, 71) rgb(209, 91, 71); }
+.label-inverse.arrowed::before { border-right-color: rgb(51, 51, 51); }
+.label-inverse.arrowed-in::before { border-color: rgb(51, 51, 51) rgb(51, 51, 51) rgb(51, 51, 51) transparent; }
+.label-inverse.arrowed-right::after { border-left-color: rgb(51, 51, 51); }
+.label-inverse.arrowed-in-right::after { border-color: rgb(51, 51, 51) transparent rgb(51, 51, 51) rgb(51, 51, 51); }
+.label-pink.arrowed::before { border-right-color: rgb(214, 72, 126); }
+.label-pink.arrowed-in::before { border-color: rgb(214, 72, 126) rgb(214, 72, 126) rgb(214, 72, 126) transparent; }
+.label-pink.arrowed-right::after { border-left-color: rgb(214, 72, 126); }
+.label-pink.arrowed-in-right::after { border-color: rgb(214, 72, 126) transparent rgb(214, 72, 126) rgb(214, 72, 126); }
+.label-purple.arrowed::before { border-right-color: rgb(149, 133, 191); }
+.label-purple.arrowed-in::before { border-color: rgb(149, 133, 191) rgb(149, 133, 191) rgb(149, 133, 191) transparent; }
+.label-purple.arrowed-right::after { border-left-color: rgb(149, 133, 191); }
+.label-purple.arrowed-in-right::after { border-color: rgb(149, 133, 191) transparent rgb(149, 133, 191) rgb(149, 133, 191); }
+.label-yellow.arrowed::before { border-right-color: rgb(254, 225, 136); }
+.label-yellow.arrowed-in::before { border-color: rgb(254, 225, 136) rgb(254, 225, 136) rgb(254, 225, 136) transparent; }
+.label-yellow.arrowed-right::after { border-left-color: rgb(254, 225, 136); }
+.label-yellow.arrowed-in-right::after { border-color: rgb(254, 225, 136) transparent rgb(254, 225, 136) rgb(254, 225, 136); }
+.label-light.arrowed::before { border-right-color: rgb(231, 231, 231); }
+.label-light.arrowed-in::before { border-color: rgb(231, 231, 231) rgb(231, 231, 231) rgb(231, 231, 231) transparent; }
+.label-light.arrowed-right::after { border-left-color: rgb(231, 231, 231); }
+.label-light.arrowed-in-right::after { border-color: rgb(231, 231, 231) transparent rgb(231, 231, 231) rgb(231, 231, 231); }
+.label-grey.arrowed::before { border-right-color: rgb(160, 160, 160); }
+.label-grey.arrowed-in::before { border-color: rgb(160, 160, 160) rgb(160, 160, 160) rgb(160, 160, 160) transparent; }
+.label-grey.arrowed-right::after { border-left-color: rgb(160, 160, 160); }
+.label-grey.arrowed-in-right::after { border-color: rgb(160, 160, 160) transparent rgb(160, 160, 160) rgb(160, 160, 160); }
+.label { line-height: 1.15; height: 20px; }
+.label.arrowed::before { left: -10px; border-width: 10px 5px; }
+.label-lg.arrowed, .label-lg.arrowed-in { margin-left: 6px; }
+.label.arrowed-in::before { left: -5px; border-width: 10px 5px; }
+.label.arrowed-right::after { right: -10px; border-width: 10px 5px; }
+.label-lg.arrowed-in-right, .label-lg.arrowed-right { margin-right: 6px; }
+.label.arrowed-in-right::after { right: -5px; border-width: 10px 5px; }
+.label-lg { padding: 0.3em 0.6em 0.4em; font-size: 13px; line-height: 1.1; height: 24px; }
+.label-lg.arrowed::before { left: -12px; border-width: 12px 6px; }
+.label-xlg.arrowed, .label-xlg.arrowed-in { margin-left: 7px; }
+.label-lg.arrowed-in::before { left: -6px; border-width: 12px 6px; }
+.label-lg.arrowed-right::after { right: -12px; border-width: 12px 6px; }
+.label-xlg.arrowed-in-right, .label-xlg.arrowed-right { margin-right: 7px; }
+.label-lg.arrowed-in-right::after { right: -6px; border-width: 12px 6px; }
+.label-xlg { padding: 0.3em 0.7em 0.4em; font-size: 14px; line-height: 1.3; height: 28px; }
+.label-xlg.arrowed::before { left: -14px; border-width: 14px 7px; }
+.label-sm.arrowed, .label-sm.arrowed-in { margin-left: 4px; }
+.label-xlg.arrowed-in::before { left: -7px; border-width: 14px 7px; }
+.label-xlg.arrowed-right::after { right: -14px; border-width: 14px 7px; }
+.label-sm.arrowed-in-right, .label-sm.arrowed-right { margin-right: 4px; }
+.label-xlg.arrowed-in-right::after { right: -7px; border-width: 14px 7px; }
+.label-sm { padding: 0.2em 0.4em 0.3em; font-size: 11px; line-height: 1; height: 18px; }
+.label-sm.arrowed::before { left: -8px; border-width: 9px 4px; }
+.label-sm.arrowed-in::before { left: -4px; border-width: 9px 4px; }
+.label-sm.arrowed-right::after { right: -8px; border-width: 9px 4px; }
+.label-sm.arrowed-in-right::after { right: -4px; border-width: 9px 4px; }
+.label > .ace-icon, .label > span { line-height: 1; vertical-align: bottom; }
+.label.label-white { color: rgb(135, 157, 169); border-width: 1px 1px 1px 2px; border-style: solid; border-color: rgb(171, 186, 195); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; background-color: rgb(242, 245, 246); }
+.label-white.label-success { color: rgb(123, 158, 108); border-color: rgb(159, 191, 146); background-color: rgb(237, 243, 234); }
+.label-white.label-warning { color: rgb(217, 153, 62); border-color: rgb(228, 174, 98); background-color: rgb(254, 246, 235); }
+.label-white.label-primary { color: rgb(102, 136, 166); border-color: rgb(138, 175, 206); background-color: rgb(234, 242, 248); }
+.label-white.label-danger { color: rgb(189, 127, 117); border-color: rgb(210, 134, 121); background-color: rgb(252, 244, 242); }
+.label-white.label-info { color: rgb(78, 122, 143); border-color: rgb(122, 161, 180); background-color: rgb(234, 243, 247); }
+.label-white.label-inverse { color: rgb(64, 64, 64); border-color: rgb(115, 115, 115); background-color: rgb(237, 237, 237); }
+.label-white.label-pink { color: rgb(175, 111, 135); border-color: rgb(210, 153, 174); background-color: rgb(251, 239, 244); }
+.label-white.label-purple { color: rgb(125, 111, 162); border-color: rgb(183, 177, 198); background-color: rgb(239, 237, 245); }
+.label-white.label-yellow { color: rgb(207, 161, 20); border-color: rgb(236, 209, 129); background-color: rgb(253, 247, 228); }
+.label-white.label-grey { color: rgb(135, 135, 135); border-color: rgb(206, 206, 206); background-color: rgb(237, 237, 237); }
+@media not all, screen and (min--moz-device-pixel-ratio: 1.08) and (max--moz-device-pixel-ratio: 1.15) {
+ .label.arrowed:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 10.5px 6px 11px; left: -11px; }
+ .label.arrowed-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 10.5px 6px 11px; right: -11px; }
+ .label.arrowed-in:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 10.5px 5px 11px; left: -6px; }
+ .label.arrowed-in-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 10.5px 5px 11px; right: -6px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.2) and (max--moz-device-pixel-ratio: 1.45), not all, screen and (min--moz-device-pixel-ratio: 1.6) and (max--moz-device-pixel-ratio: 1.9) {
+ .label.arrowed:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 10.5px 6px; left: -11px; }
+ .label.arrowed-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 10.5px 6px; right: -11px; }
+ .label.arrowed-in:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 10.5px 5px 10px; left: -6px; }
+ .label.arrowed-in-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 10.5px 5px 10px; right: -6px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.5) and (max--moz-device-pixel-ratio: 1.6) {
+ .label.arrowed:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 10px 6px; left: -12px; }
+ .label.arrowed-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 10px 6px; right: -12px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.7) and (max--moz-device-pixel-ratio: 1.8) {
+ .label.arrowed:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 10px 6px; left: -11.5px; }
+ .label.arrowed-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 10px 6px; right: -11.5px; }
+ .label.arrowed-in:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 10px 5px; left: -6px; }
+ .label.arrowed-in-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 10px 5px; right: -6px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 0.8) and (max--moz-device-pixel-ratio: 0.9) {
+ .label.arrowed:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 11px 6px; left: -11.5px; }
+ .label.arrowed-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 11px 6px; right: -11.5px; }
+ .label.arrowed-in:not(.label-lg):not(.label-xlg):not(.label-sm)::before { border-width: 11px 5px; left: -6px; }
+ .label.arrowed-in-right:not(.label-lg):not(.label-xlg):not(.label-sm)::after { border-width: 11px 5px; right: -6px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.08) and (max--moz-device-pixel-ratio: 1.15) {
+ .label-lg.arrowed::before { left: -11px; }
+ .label-lg.arrowed-right::after { right: -11px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.7) and (max--moz-device-pixel-ratio: 1.8) {
+ .label-lg.arrowed::before { left: -11.5px; }
+ .label-lg.arrowed-right::after { right: -11.5px; }
+ .label-lg.arrowed-in::before { border-width: 12.5px 6px 12px; left: -6px; }
+ .label-lg.arrowed-in-right::after { border-width: 12.5px 6px 12px; right: -6px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.08) and (max--moz-device-pixel-ratio: 1.15) {
+ .label-xlg.arrowed::before { left: -13px; }
+ .label-xlg.arrowed-right::after { right: -13px; }
+ .label-xlg.arrowed-in-right::after, .label-xlg.arrowed-in::before { border-width: 14px 7px 14.5px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.2) and (max--moz-device-pixel-ratio: 1.3) {
+ .label-xlg.arrowed::before { border-width: 14.5px 7px; left: -13.5px; }
+ .label-xlg.arrowed-right::after { border-width: 14.5px 7px; right: -13.5px; }
+ .label-xlg.arrowed-in-right::after, .label-xlg.arrowed-in::before { border-width: 14.5px 7px; }
+}
+@media not all, not all, screen and (min--moz-device-pixel-ratio: 1.3) and (max--moz-device-pixel-ratio: 1.4), screen and (min--moz-device-pixel-ratio: 1.5) and (max--moz-device-pixel-ratio: 1.6) {
+ .label-xlg.arrowed::before { border-width: 14.5px 7.5px; left: -14.5px; }
+ .label-xlg.arrowed-right::after { border-width: 14.5px 7.5px; right: -14.5px; }
+ .label-xlg.arrowed-in-right::after, .label-xlg.arrowed-in::before { border-width: 14.5px 7px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.08) and (max--moz-device-pixel-ratio: 1.15) {
+ .label-sm.arrowed::before { border-width: 9px 5px; left: -9px; }
+ .label-sm.arrowed-right::after { border-width: 9px 5px; right: -9px; }
+ .label-sm.arrowed-in-right::after, .label-sm.arrowed-in::before { border-width: 10px 4px; }
+}
+@media not all, screen and (min--moz-device-pixel-ratio: 1.2) and (max--moz-device-pixel-ratio: 1.3) {
+ .label-sm.arrowed::before { border-width: 9.5px 5px; left: -10px; }
+ .label-sm.arrowed-right::after { border-width: 9.5px 5px; right: -10px; }
+ .label-sm.arrowed-in-right::after, .label-sm.arrowed-in::before { border-width: 9.5px 4px; }
+}
+.dropdown-menu > .active > a > .ace-icon, .dropdown-menu > li > a:focus > .ace-icon, .dropdown-menu > li > a:hover > .ace-icon, .dropdown-submenu:focus > a > .ace-icon, .dropdown-submenu:hover > a > .ace-icon, .icon-white, .nav-list > .active > a > .ace-icon, .nav-pills > .active > a > .ace-icon, .navbar-inverse .nav > .active > a > .ace-icon { background-image: none; }
+.dropdown-menu { border-radius: 0px !important; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.dropdown-menu > li > a { font-size: 13px; padding-left: 11px; padding-right: 11px; padding-bottom: 4px; margin-bottom: 1px; margin-top: 1px; }
+.dropdown-menu.dropdown-only-icon > li { margin: 0px 4px; }
+.dropdown-menu.dropdown-only-icon > li > a .ace-icon { width: 18px; display: inline-block; text-align: center; }
+.dropdown-menu.dropdown-only-icon > li > a .icon-2x { width: 36px; }
+.dropdown-menu > li.active:hover > a, .dropdown-menu > li.active > a, .dropdown-menu > li:hover > a, .dropdown-menu > li > a:active, .dropdown-menu > li > a:focus { background: rgb(79, 153, 198) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-default > li.active:hover > a, .dropdown-default > li.active > a, .dropdown-default > li:hover > a, .dropdown-default > li > a:active, .dropdown-default > li > a:focus { background: rgb(171, 186, 195) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-info > li.active:hover > a, .dropdown-info > li.active > a, .dropdown-info > li:hover > a, .dropdown-info > li > a:active, .dropdown-info > li > a:focus { background: rgb(111, 179, 224) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-primary > li.active:hover > a, .dropdown-primary > li.active > a, .dropdown-primary > li:hover > a, .dropdown-primary > li > a:active, .dropdown-primary > li > a:focus { background: rgb(66, 139, 202) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-success > li.active:hover > a, .dropdown-success > li.active > a, .dropdown-success > li:hover > a, .dropdown-success > li > a:active, .dropdown-success > li > a:focus { background: rgb(135, 184, 127) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-warning > li.active:hover > a, .dropdown-warning > li.active > a, .dropdown-warning > li:hover > a, .dropdown-warning > li > a:active, .dropdown-warning > li > a:focus { background: rgb(255, 162, 77) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-danger > li.active:hover > a, .dropdown-danger > li.active > a, .dropdown-danger > li:hover > a, .dropdown-danger > li > a:active, .dropdown-danger > li > a:focus { background: rgb(209, 91, 71) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-inverse > li.active:hover > a, .dropdown-inverse > li.active > a, .dropdown-inverse > li:hover > a, .dropdown-inverse > li > a:active, .dropdown-inverse > li > a:focus { background: rgb(85, 85, 85) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-purple > li.active:hover > a, .dropdown-purple > li.active > a, .dropdown-purple > li:hover > a, .dropdown-purple > li > a:active, .dropdown-purple > li > a:focus { background: rgb(149, 133, 191) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-pink > li.active:hover > a, .dropdown-pink > li.active > a, .dropdown-pink > li:hover > a, .dropdown-pink > li > a:active, .dropdown-pink > li > a:focus { background: rgb(214, 72, 126) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-grey > li.active:hover > a, .dropdown-grey > li.active > a, .dropdown-grey > li:hover > a, .dropdown-grey > li > a:active, .dropdown-grey > li > a:focus { background: rgb(160, 160, 160) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.dropdown-light > li.active:hover > a, .dropdown-light > li.active > a, .dropdown-light > li:hover > a, .dropdown-light > li > a:active, .dropdown-light > li > a:focus { background: rgb(231, 231, 231) none repeat scroll 0% 0%; color: rgb(51, 51, 51); }
+.dropdown-lighter > li.active:hover > a, .dropdown-lighter > li.active > a, .dropdown-lighter > li:hover > a, .dropdown-lighter > li > a:active, .dropdown-lighter > li > a:focus { background: rgb(239, 239, 239) none repeat scroll 0% 0%; color: rgb(68, 68, 68); }
+.dropdown-lightest > li.active:hover > a, .dropdown-lightest > li.active > a, .dropdown-lightest > li:hover > a, .dropdown-lightest > li > a:active, .dropdown-lightest > li > a:focus { background: rgb(243, 243, 243) none repeat scroll 0% 0%; color: rgb(68, 68, 68); }
+.dropdown-yellow > li.active:hover > a, .dropdown-yellow > li.active > a, .dropdown-yellow > li:hover > a, .dropdown-yellow > li > a:active, .dropdown-yellow > li > a:focus { background: rgb(254, 225, 136) none repeat scroll 0% 0%; color: rgb(68, 68, 68); }
+.dropdown-yellow2 > li.active:hover > a, .dropdown-yellow2 > li.active > a, .dropdown-yellow2 > li:hover > a, .dropdown-yellow2 > li > a:active, .dropdown-yellow2 > li > a:focus { background: rgb(249, 232, 179) none repeat scroll 0% 0%; color: rgb(68, 68, 68); }
+.dropdown-light-blue > li.active:hover > a, .dropdown-light-blue > li.active > a, .dropdown-light-blue > li:hover > a, .dropdown-light-blue > li > a:active, .dropdown-light-blue > li > a:focus { background: rgb(236, 243, 249) none repeat scroll 0% 0%; color: rgb(68, 85, 102); }
+.dropdown-menu.dropdown-close { top: 92%; left: -5px; }
+.dropdown-menu.dropdown-close.dropdown-menu-right { left: auto; right: -5px; }
+.dropdown-menu.dropdown-closer { top: 80%; left: -10px; }
+.dropdown-menu.dropdown-closer.dropdown-menu-right { right: -10px; left: auto; }
+.dropup > .dropdown-menu, .navbar-fixed-bottom .dropdown > .dropdown-menu { top: auto !important; bottom: 100%; }
+.dropup > .dropdown-menu.dropdown-close, .navbar-fixed-bottom .dropdown > .dropdown-menu.dropdown-close { bottom: 92%; }
+.dropup > .dropdown-menu.dropdown-closer, .navbar-fixed-bottom .dropdown > .dropdown-menu.dropdown-closer { bottom: 80%; }
+.dropdown-submenu > .dropdown-menu { border-radius: 0px; }
+.dropdown-submenu > a::after { margin-right: -5px; }
+.dropdown-75 { min-width: 75px; }
+.dropdown-100 { min-width: 100px; }
+.dropdown-125 { min-width: 125px; }
+.dropdown-150 { min-width: 150px; }
+.dropdown-hover { position: relative; }
+.dropdown-hover::before { display: block; content: ""; position: absolute; top: -2px; bottom: -2px; left: -2px; right: -2px; background-color: transparent; }
+.dropdown-hover:hover > .dropdown-menu { display: block; }
+.dropdown-menu.dropdown-caret::after, .dropdown-menu.dropdown-caret::before { content: ""; display: inline-block; position: absolute; }
+.dropdown-menu > .dropdown-hover > .dropdown-menu { top: -5px; left: 99%; right: auto; }
+.dropdown-menu > .dropdown-hover > .dropdown-menu.dropdown-menu-right { left: auto; right: 99%; }
+.dropdown-menu > .dropdown-hover.dropup > .dropdown-menu, .dropup .dropdown-menu > .dropdown-hover > .dropdown-menu { top: auto; bottom: -5px; }
+.dropdown-menu.dropdown-caret::before { border-bottom: 7px solid rgba(0, 0, 0, 0.2); border-left: 7px solid transparent; border-right: 7px solid transparent; left: 9px; top: -6px; }
+.dropdown-menu.dropdown-caret::after { border-bottom: 6px solid rgb(255, 255, 255); border-left: 6px solid transparent; border-right: 6px solid transparent; left: 10px; top: -5px; }
+.dropdown-menu.dropdown-caret-right.dropdown-caret::before, .dropdown-menu.dropdown-menu-right.dropdown-caret::before { left: auto; right: 9px; }
+.dropdown-menu.dropdown-caret-right.dropdown-caret::after, .dropdown-menu.dropdown-menu-right.dropdown-caret::after { left: auto; right: 10px; }
+.dropup > .dropdown-menu.dropdown-caret::before, .navbar-fixed-bottom .dropdown > .dropdown-menu.dropdown-caret::before { border-bottom-width: 0px; border-top: 7px solid rgba(0, 0, 0, 0.2); bottom: -7px; top: auto; }
+.dropup > .dropdown-menu.dropdown-caret::after, .navbar-fixed-bottom .dropdown > .dropdown-menu.dropdown-caret::after { border-bottom-width: 0px; border-top: 6px solid rgb(255, 255, 255); bottom: -6px; top: auto; }
+.dropdown-colorpicker > .dropdown-menu { padding: 4px; min-width: 130px; max-width: 130px; top: 80%; left: -7px; }
+.dropdown-colorpicker > .dropdown-menu.dropdown-menu-right { right: -7px; left: auto; }
+.dropdown-colorpicker > .dropdown-menu > li { display: block; float: left; width: 20px; height: 20px; margin: 2px; }
+.dropdown-colorpicker > .dropdown-menu > li > .colorpick-btn { display: block; width: 20px; height: 20px; margin: 0px; padding: 0px; border-radius: 0px; position: relative; transition: all 0.1s ease 0s; }
+.dropdown-colorpicker > .dropdown-menu > li > .colorpick-btn:hover { text-decoration: none; opacity: 0.8; transform: scale(1.08, 1.08); }
+.dropdown-colorpicker > .dropdown-menu > li > .colorpick-btn.selected::after { content: ""; display: inline-block; font-family: FontAwesome; font-size: 11px; color: rgb(255, 255, 255); position: absolute; left: 0px; right: 0px; text-align: center; line-height: 20px; }
+.btn-colorpicker { display: inline-block; width: 20px; height: 20px; background-color: rgb(221, 221, 221); vertical-align: middle; border-radius: 0px; }
+.dropdown-navbar { padding: 0px; width: 240px; box-shadow: 0px 2px 4px rgba(30, 30, 100, 0.25); border-color: rgb(188, 212, 229); }
+.dropdown-navbar > li { padding: 0px 8px; background-color: rgb(255, 255, 255); }
+.dropdown-navbar > li.dropdown-header { text-shadow: none; padding-top: 0px; padding-bottom: 0px; line-height: 34px; font-size: 13px; font-weight: 700; text-transform: none; border-bottom: 1px solid; }
+.dropdown-navbar > li > .ace-icon, .dropdown-navbar > li > a > .ace-icon { margin-right: 5px !important; color: rgb(85, 85, 85); font-size: 14px; }
+.dropdown-navbar > li > a { padding: 10px 2px; margin: 0px; border-top: 1px solid rgb(228, 236, 243); font-size: 12px; line-height: 16px; color: rgb(85, 85, 85) !important; background-color: transparent !important; white-space: normal; }
+.dropdown-navbar > li > a .progress { margin-bottom: 0px; margin-top: 4px; }
+.dropdown-navbar > li > a .badge { line-height: 16px; padding-right: 4px; padding-left: 4px; font-size: 12px; }
+.dropdown-navbar > li.dropdown-header + li > a, .dropdown-navbar > li:first-child > a { border-top-width: 0px; }
+.dropdown-navbar > li.dropdown-footer > a { color: rgb(79, 153, 198) !important; text-align: center; font-size: 13px; }
+.dropdown-navbar > li.dropdown-footer > a:hover { background-color: rgb(255, 255, 255); text-decoration: underline; }
+.dropdown-navbar > li.dropdown-footer > a:hover > .ace-icon { text-decoration: none; }
+.dropdown-navbar > li:hover { background-color: rgb(244, 249, 252); }
+.dropdown-navbar > li.dropdown-header { background-color: rgb(236, 242, 247); color: rgb(128, 144, 160); border-bottom-color: rgb(188, 212, 229); }
+.dropdown-navbar > li.dropdown-header > .ace-icon { color: rgb(128, 144, 160); }
+.dropdown-navbar.navbar-pink { border-color: rgb(229, 188, 212); }
+.dropdown-navbar.navbar-pink > li:hover { background-color: rgb(252, 244, 249); }
+.dropdown-navbar.navbar-pink > li.dropdown-header { background-color: rgb(247, 236, 242); color: rgb(180, 113, 160); border-bottom-color: rgb(229, 188, 212); }
+.dropdown-navbar.navbar-pink > li.dropdown-header > .ace-icon { color: rgb(192, 96, 144); }
+.dropdown-navbar.navbar-pink > li > a { border-top-color: rgb(243, 228, 236); }
+.dropdown-navbar.navbar-grey { border-color: rgb(229, 229, 229); }
+.dropdown-navbar.navbar-grey > li:hover { background-color: rgb(248, 248, 248); }
+.dropdown-navbar.navbar-grey > li.dropdown-header { background-color: rgb(242, 242, 242); color: rgb(58, 135, 173); border-bottom-color: rgb(229, 229, 229); }
+.dropdown-navbar.navbar-grey > li.dropdown-header > .ace-icon { color: rgb(58, 135, 173); }
+.dropdown-navbar.navbar-grey > li > a { border-top-color: rgb(238, 238, 238); }
+.dropdown-navbar.navbar-green { border-color: rgb(180, 213, 172); }
+.dropdown-navbar.navbar-green > li:hover { background-color: rgb(244, 249, 239); }
+.dropdown-navbar.navbar-green > li.dropdown-header { background-color: rgb(235, 247, 228); color: rgb(136, 170, 102); border-bottom-color: rgb(180, 213, 172); }
+.dropdown-navbar.navbar-green > li.dropdown-header > .ace-icon { color: rgb(144, 192, 96); }
+.dropdown-navbar.navbar-green > li > a { border-top-color: rgb(236, 243, 228); }
+.dropdown-navbar .ace-icon[class*="btn"] { display: inline-block; margin: 0px 5px 0px 0px; width: 24px; text-align: center; padding-left: 0px; padding-right: 0px; }
+.dropdown-navbar .msg-photo { max-width: 42px; float: left; margin-top: 2px; }
+.dropdown-navbar .msg-body { display: block; line-height: 20px; white-space: normal; vertical-align: middle; margin-left: 50px; }
+.dropdown-navbar .msg-title { display: inline-block; line-height: 14px; }
+.dropdown-navbar .msg-time { display: block; font-size: 11px; color: rgb(119, 119, 119); }
+.dropdown-navbar .msg-time > .ace-icon { font-size: 14px; color: rgb(85, 85, 85); }
+.dropdown-navbar > .dropdown-content { padding: 0px; }
+.dropdown-navbar > .dropdown-content .dropdown-navbar { list-style: outside none none; margin: 0px; padding: 0px !important; box-shadow: none; width: auto; display: block; float: none; border-width: 0px; position: static; z-index: auto; }
+.dropdown-navbar .nav-tabs { border-width: 0px; box-shadow: none; background-color: rgb(249, 249, 249) !important; top: auto; width: 100%; }
+.dropdown-navbar .nav-tabs > li { display: table-cell; width: 1%; float: none !important; }
+.dropdown-navbar .nav-tabs > li > a { margin: 0px 0px 0px 1px !important; text-align: center; box-shadow: none !important; background-color: rgb(249, 249, 249) !important; border-width: 0px 0px 2px !important; border-bottom: 2px solid rgb(190, 202, 209) !important; }
+.dropdown-navbar .nav-tabs > li > a::before { display: block; content: ""; position: absolute; left: -1px; top: 3px; bottom: 3px; width: 1px; background-color: rgb(190, 202, 209); }
+.dropdown-navbar .nav-tabs > li:first-child > a { margin-left: 0px !important; }
+.dropdown-navbar .nav-tabs > li:first-child > a::before { display: none; }
+.dropdown-navbar .nav-tabs > li.active > a { border-bottom: 2px solid rgb(121, 176, 206) !important; color: rgb(80, 133, 175) !important; background-color: rgb(236, 242, 247) !important; }
+.dropdown-navbar .tab-content { padding: 0px !important; border-color: rgb(255, 255, 255) !important; }
+.dropdown-navbar .tab-content .dropdown-menu { display: block; position: static; margin: 0px !important; padding-top: 2px; border-color: rgb(255, 255, 255) !important; box-shadow: none !important; width: 100%; }
+.dropdown-navbar.navbar-pink .nav-tabs > li.active > a { border-bottom: 2px solid rgb(229, 188, 212) !important; color: rgb(192, 96, 144) !important; background-color: rgb(247, 236, 242) !important; }
+.dropdown-navbar.navbar-pink .nav-tabs > li:not(.active) > a:hover { color: rgb(186, 115, 150); }
+.dropdown-navbar.navbar-pink .nav-tabs > li > a::before { background-color: rgb(206, 187, 203); }
+.dropdown-navbar.navbar-pink .nav-tabs > li > a { border-bottom-color: rgb(206, 187, 205) !important; }
+.form-line { margin-bottom: 24px; padding-bottom: 12px; border-bottom: 1px solid rgb(238, 238, 238); }
+.form-actions { display: block; background-color: rgb(245, 245, 245); border-top: 1px solid rgb(229, 229, 229); margin-bottom: 20px; margin-top: 20px; padding: 19px 20px 20px; }
+.help-button { display: inline-block; height: 22px; width: 22px; line-height: 22px; text-align: center; padding: 0px; background-color: rgb(101, 188, 218); color: rgb(255, 255, 255); font-size: 12px; font-weight: 700; cursor: default; margin-left: 4px; border-radius: 100%; border: 2px solid rgb(255, 255, 255); box-shadow: 0px 1px 0px 1px rgba(0, 0, 0, 0.2); }
+.help-button:hover { background-color: rgb(101, 188, 218); text-shadow: none; }
+label { font-weight: 400; font-size: 14px; }
+.form-group > label[class*="col-"] { margin-bottom: 4px; }
+td > label, th > label { margin-bottom: 0px; line-height: inherit; vertical-align: middle; }
+label.inline { margin-bottom: 3px; }
+input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], textarea { border-radius: 0px !important; color: rgb(133, 133, 133); background-color: rgb(255, 255, 255); border: 1px solid rgb(213, 213, 213); padding: 5px 4px 6px; font-size: 14px; font-family: inherit; box-shadow: none !important; transition-duration: 0.1s; }
+input[type="email"]:hover, input[type="url"]:hover, input[type="search"]:hover, input[type="tel"]:hover, input[type="color"]:hover, input[type="text"]:hover, input[type="password"]:hover, input[type="datetime"]:hover, input[type="datetime-local"]:hover, input[type="date"]:hover, input[type="month"]:hover, input[type="time"]:hover, input[type="week"]:hover, input[type="number"]:hover, textarea:hover { border-color: rgb(181, 181, 181); }
+input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, textarea:focus { box-shadow: none; color: rgb(105, 105, 105); border-color: rgb(245, 153, 66); background-color: rgb(255, 255, 255); outline: 0px none; }
+.form-control:-moz-placeholder, input:-moz-placeholder { color: silver; opacity: 1; }
+.form-control::-moz-placeholder, input::-moz-placeholder { color: silver; opacity: 1; }
+.form-control, select { border-radius: 0px; box-shadow: none !important; color: rgb(133, 133, 133); background-color: rgb(255, 255, 255); border: 1px solid rgb(213, 213, 213); }
+.form-control:focus, select:focus { color: rgb(105, 105, 105); border-color: rgb(245, 153, 66); background-color: rgb(255, 255, 255); outline: 0px none; }
+textarea.form-control { padding: 5px 9px; }
+select { padding: 3px 4px; height: 30px; }
+select.form-control { padding: 4px 6px; }
+select.form-control[multiple], select[multiple] { height: auto; }
+select.input-sm { border-radius: 0px; padding: 2px 3px; }
+select.input-lg { border-radius: 0px; padding: 6px 8px; }
+input.block { display: block; margin-bottom: 9px; }
+textarea.autosize-transition { }
+.limiterBox { border-width: medium 1px 1px; border-style: none solid solid; border-color: currentcolor rgb(34, 34, 34) rgb(34, 34, 34); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; background-color: rgb(51, 51, 51); padding: 3px 6px; font-size: 13px; color: rgb(255, 255, 255); margin-top: 6px; }
+.limiterBox::after { display: none; }
+.limiterBox::before { display: block; content: ""; position: absolute; width: 0px; height: 0px; top: -8px; left: 50%; margin-left: -5px; border-color: transparent transparent rgb(51, 51, 51); border-style: solid; border-width: 0px 8px 8px; }
+select option, select.form-control option { padding: 3px 4px 5px; }
+select option:active, select option:focus, select option:hover, select.form-control option:active, select.form-control option:focus, select.form-control option:hover { background-color: rgb(238, 238, 238); color: rgb(68, 68, 68); }
+select option.no-option, select.form-control option.no-option { padding: 1px 0px; }
+input[disabled] { color: rgb(132, 132, 132) !important; background-color: rgb(238, 238, 238) !important; }
+input[disabled]:hover { border-color: rgb(213, 213, 213) !important; }
+input[readonly] { color: rgb(147, 145, 146); background: rgb(245, 245, 245) none repeat scroll 0% 0% !important; cursor: default; }
+input[readonly]:hover { border-color: rgb(195, 195, 195); }
+input[readonly]:focus { box-shadow: none; border-color: rgb(170, 170, 170); background-color: rgb(249, 249, 249); }
+.help-inline { font-size: 13px !important; }
+.input-icon { position: relative; }
+span.input-icon { display: inline-block; }
+.input-icon > input { padding-left: 24px; padding-right: 6px; }
+.input-icon.input-icon-right > input { padding-left: 6px; padding-right: 24px; }
+.input-icon > .ace-icon { padding: 0px 3px; z-index: 2; position: absolute; top: 1px; bottom: 1px; left: 3px; line-height: 30px; display: inline-block; color: rgb(144, 144, 144); font-size: 16px; }
+.input-icon.input-icon-right > .ace-icon { left: auto; right: 3px; }
+.input-icon > input:focus + .ace-icon { color: rgb(85, 119, 153); }
+.input-icon ~ .help-inline { padding-left: 8px; }
+.form-inline .checkbox [type="checkbox"] + label, .form-inline .radio [type="radio"] + label, .form-search .checkbox [type="checkbox"] + label, .form-search .radio [type="radio"] + label { float: left; margin-left: -20px; }
+.form-inline .form-inline .checkbox [type="checkbox"] + label, .form-inline .form-inline .radio [type="radio"] + label, .form-inline .form-search .checkbox [type="checkbox"] + label, .form-inline .form-search .radio [type="radio"] + label, .form-search .form-inline .checkbox [type="checkbox"] + label, .form-search .form-inline .radio [type="radio"] + label, .form-search .form-search .checkbox [type="checkbox"] + label, .form-search .form-search .radio [type="radio"] + label { margin-left: 0px; margin-right: 3px; }
+.form-search .input-append .search-query:focus, .form-search .input-prepend .search-query:focus { box-shadow: none; }
+.input-append .uneditable-input, .input-append input, .input-append select, .input-prepend .uneditable-input, .input-prepend input, .input-prepend select { border-radius: 0px; }
+.input-mini { width: 60px; max-width: 100%; }
+.input-small { width: 90px; max-width: 100%; }
+.input-md, .input-medium { width: 150px; max-width: 100%; }
+.input-large { width: 210px; max-width: 100%; }
+.input-xlarge { width: 270px; max-width: 100%; }
+.input-xxlarge { width: 530px; max-width: 100%; }
+input.input-lg { font-size: 18px; }
+input.ace[type="checkbox"], input.ace[type="radio"] { opacity: 0; position: absolute; z-index: 1; width: 18px; height: 18px; cursor: pointer; }
+label input.ace[type="checkbox"], label input.ace[type="radio"] { z-index: -100 !important; width: 1px !important; height: 1px !important; clip: rect(1px, 1px, 1px, 1px); position: absolute; }
+input.ace[type="checkbox"]:checked, input.ace[type="checkbox"]:focus, input.ace[type="radio"]:checked, input.ace[type="radio"]:focus { outline: 0px none !important; }
+input.ace[type="checkbox"] + .lbl, input.ace[type="radio"] + .lbl { position: relative; display: inline-block; margin: 0px; line-height: 20px; min-height: 18px; min-width: 18px; font-weight: 400; cursor: pointer; }
+input.ace[type="checkbox"] + .lbl::before, input.ace[type="radio"] + .lbl::before { cursor: pointer; font-family: fontAwesome; font-weight: 400; font-size: 12px; color: rgb(255, 255, 255); content: " "; background-color: rgb(250, 250, 250); border: 1px solid rgb(200, 200, 200); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05); border-radius: 0px; display: inline-block; text-align: center; height: 16px; line-height: 14px; min-width: 16px; margin-right: 1px; position: relative; top: -1px; }
+input.ace[type="checkbox"]:checked + .lbl::before, input.ace[type="radio"]:checked + .lbl::before { display: inline-block; content: ""; color: rgb(50, 163, 206); background-color: rgb(245, 248, 252); border-color: rgb(173, 184, 192); }
+input.ace[type="checkbox"] + .lbl:hover::before, input.ace[type="checkbox"]:hover + .lbl::before, input.ace[type="radio"] + .lbl:hover::before, input.ace[type="radio"]:hover + .lbl::before { border-color: rgb(255, 137, 60); }
+input.ace[type="checkbox"]:focus + .lbl::before, input.ace[type="radio"]:focus + .lbl::before { border-color: rgb(245, 153, 66); }
+input.ace[type="checkbox"]:active + .lbl::before, input.ace[type="checkbox"]:checked:active + .lbl::before, input.ace[type="radio"]:active + .lbl::before, input.ace[type="radio"]:checked:active + .lbl::before { box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 1px 3px rgba(0, 0, 0, 0.1) inset; }
+input.ace.ace-checkbox-2[type="checkbox"] + .lbl::before, input.ace.ace-checkbox-2[type="radio"] + .lbl::before { box-shadow: none; }
+input.ace.ace-checkbox-2[type="checkbox"]:checked + .lbl::before, input.ace.ace-checkbox-2[type="radio"]:checked + .lbl::before { background-color: rgb(249, 160, 33); border-color: rgb(249, 160, 33); color: rgb(255, 255, 255); }
+input.ace.disabled[type="checkbox"] + .lbl::before, input.ace[type="checkbox"]:disabled + .lbl::before, input.ace[type="checkbox"][disabled] + .lbl::before, input.ace.disabled[type="radio"] + .lbl::before, input.ace[type="radio"]:disabled + .lbl::before, input.ace[type="radio"][disabled] + .lbl::before { background-color: rgb(221, 221, 221) !important; border-color: rgb(204, 204, 204) !important; box-shadow: none !important; color: rgb(187, 187, 187); }
+.checkbox label input.ace[type="checkbox"] + .lbl, .radio label input.ace[type="radio"] + .lbl { margin-left: -10px; }
+input.ace[type="radio"] + .lbl::before { border-radius: 100%; font-size: 10px; font-family: FontAwesome; text-shadow: 0px 0px 1px rgb(50, 163, 206); line-height: 15px; height: 17px; min-width: 17px; }
+input.ace[type="radio"]:checked + .lbl::before { content: ""; }
+input.ace.input-lg[type="checkbox"] + .lbl::before { border-radius: 4px; font-size: 16px; height: 24px; line-height: 21px; min-width: 24px; top: auto; }
+input.ace.input-lg[type="radio"] + .lbl::before { font-size: 14px; height: 24px; line-height: 22px; min-width: 24px; top: auto; }
+input.ace.ace-switch[type="checkbox"] { width: 55px; height: 25px; }
+input.ace.ace-switch[type="checkbox"] + .lbl { margin: 0px 4px; min-height: 24px; }
+input.ace.ace-switch[type="checkbox"] + .lbl::before { font-family: "Open Sans"; content: "ON OFF"; color: rgb(153, 153, 153); text-shadow: 0px 0px 0px rgb(153, 153, 153); font-weight: 400; font-size: 11px; line-height: 17px; height: 20px; overflow: hidden; border-radius: 12px; background-color: rgb(245, 245, 245); box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.15) inset; border: 1px solid rgb(204, 204, 204); text-align: left; float: left; padding: 0px; width: 52px; text-indent: -21px; margin-right: 0px; transition: text-indent 0.25s ease 0s; top: auto; }
+input.ace.ace-switch[type="checkbox"] + .lbl::after { font-family: "Open Sans"; content: "III"; font-size: 12px; font-weight: 400; letter-spacing: 0px; color: rgb(170, 170, 170); text-shadow: none; background-color: rgb(255, 255, 255); border-radius: 100%; width: 22px; height: 22px; line-height: 22px; text-align: center; position: absolute; top: -2px; left: -3px; box-shadow: 0px 1px 1px 1px rgba(0, 0, 0, 0.3); transition: left 0.25s ease 0s; }
+input.ace.ace-switch[type="checkbox"]:checked + .lbl::before { text-indent: 8px; color: rgb(255, 255, 255); text-shadow: 0px 0px 0px rgb(255, 255, 255); background-color: rgb(138, 178, 201); border-color: rgb(106, 140, 168); }
+input.ace.ace-switch[type="checkbox"]:checked + .lbl::after { left: 34px; background-color: rgb(255, 255, 255); color: rgb(152, 160, 165); }
+input.ace.ace-switch.ace-switch-2[type="checkbox"] + .lbl::before { content: "YES NO"; }
+input.ace.ace-switch.ace-switch-3[type="checkbox"] + .lbl::after { font-family: FontAwesome; font-size: 13px; line-height: 22px; content: ""; top: -1px; text-shadow: none; padding: 0px; text-align: center; color: rgb(187, 187, 187); letter-spacing: 0px; }
+input.ace.ace-switch.ace-switch-3[type="checkbox"]:checked + .lbl::after { content: ""; color: rgb(138, 178, 201); text-shadow: none; }
+input.ace.ace-switch.ace-switch-4[type="checkbox"], input.ace.ace-switch.ace-switch-5[type="checkbox"] { width: 60px; }
+input.ace.ace-switch.ace-switch-4[type="checkbox"] + .lbl::before, input.ace.ace-switch.ace-switch-5[type="checkbox"] + .lbl::before { content: "ON OFF"; font-size: 12px; line-height: 21px; height: 24px; overflow: hidden; border-radius: 12px; background-color: rgb(139, 154, 163); border: 1px solid rgb(139, 154, 163); color: rgb(255, 255, 255); width: 56px; text-shadow: 0px 0px 0px rgb(255, 255, 255); display: inline-block; position: relative; box-shadow: none; transition: all 0.25s ease 0s; }
+input.ace.ace-switch.ace-switch-4[type="checkbox"] + .lbl::after, input.ace.ace-switch.ace-switch-5[type="checkbox"] + .lbl::after { content: "III"; font-size: 11px; position: absolute; top: 2px; left: 2px; letter-spacing: 0px; width: 20px; height: 20px; line-height: 19px; text-shadow: none !important; color: rgb(147, 147, 147); background-color: rgb(255, 255, 255); transition: all 0.25s ease 0s; }
+input.ace.ace-switch.ace-switch-4[type="checkbox"]:checked + .lbl::before, input.ace.ace-switch.ace-switch-5[type="checkbox"]:checked + .lbl::before { background-color: rgb(70, 143, 204); border-color: rgb(70, 143, 204); }
+input.ace.ace-switch.ace-switch-4[type="checkbox"]:checked + .lbl::after, input.ace.ace-switch.ace-switch-5[type="checkbox"]:checked + .lbl::after { left: 34px; background-color: rgb(255, 255, 255); color: rgb(132, 132, 132); }
+input.ace.ace-switch.ace-switch-5[type="checkbox"] + .lbl::before { content: "YES NO"; }
+input.ace.ace-switch.ace-switch-5[type="checkbox"]:checked + .lbl::before { text-indent: 8px; }
+input.ace.ace-switch.ace-switch-6[type="checkbox"] + .lbl { position: relative; }
+input.ace.ace-switch.ace-switch-6[type="checkbox"] + .lbl::before { font-family: FontAwesome; content: ""; text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25); box-shadow: none; border-width: 0px; font-weight: lighter; font-size: 16px; border-radius: 12px; display: inline-block; background-color: rgb(136, 136, 136); color: rgb(242, 242, 242); width: 52px; height: 22px; line-height: 21px; text-indent: 32px; transition: background 0.25s ease 0s; }
+input.ace.ace-switch.ace-switch-6[type="checkbox"] + .lbl::after { content: ""; text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25); position: absolute; top: 2px; left: 3px; border-radius: 12px; box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25); width: 18px; height: 18px; text-align: center; background-color: rgb(242, 242, 242); border: 4px solid rgb(242, 242, 242); transition: left 0.25s ease 0s; }
+input.ace.ace-switch.ace-switch-6[type="checkbox"]:checked + .lbl::before { content: ""; text-indent: 6px; color: rgb(255, 255, 255); border-color: rgb(183, 211, 229); background-color: rgb(255, 137, 60); }
+input.ace.ace-switch.ace-switch-6[type="checkbox"]:checked + .lbl::after { left: 32px; background-color: rgb(255, 255, 255); border: 4px solid rgb(255, 255, 255); text-shadow: 0px -1px 0px rgba(0, 200, 0, 0.25); }
+input.ace.ace-switch.ace-switch-7[type="checkbox"] { width: 75px; }
+input.ace.ace-switch.ace-switch-7[type="checkbox"] + .lbl { position: relative; }
+input.ace.ace-switch.ace-switch-7[type="checkbox"] + .lbl::before { content: "OFF ON"; font-weight: bolder; font-size: 13px; background-color: rgb(255, 255, 255); border: 2px solid rgb(170, 170, 170); border-radius: 0px; box-shadow: none; color: rgb(170, 170, 170); width: 74px; height: 26px; line-height: 22px; overflow: hidden; text-indent: 5px; display: inline-block; position: relative; transition: all 0.25s ease 0s; }
+input.ace.ace-switch.ace-switch-7[type="checkbox"] + .lbl::after { content: ""; font-family: FontAwesome; font-size: 16px; position: absolute; top: 3px; left: 39px; width: 32px; height: 20px; line-height: 18px; text-align: center; padding: 0px; text-indent: 0px; background-color: rgb(170, 170, 170); color: rgb(255, 255, 255); border-radius: 0px; box-shadow: none; transition: all 0.25s ease 0s; }
+input.ace.ace-switch.ace-switch-7[type="checkbox"]:checked + .lbl::before { color: rgb(70, 143, 204); background-color: rgb(255, 255, 255); text-indent: -28px; border-color: rgb(111, 179, 224); }
+input.ace.ace-switch.ace-switch-7[type="checkbox"]:checked + .lbl::after { left: 3px; content: ""; background-color: rgb(70, 143, 204); color: rgb(255, 255, 255); }
+input.ace.ace-switch[type="checkbox"] + .lbl[data-lbl]::before { content: attr(data-lbl); }
+input.ace.ace-switch.btn-empty[type="checkbox"] + .lbl::after { content: ""; }
+input.ace.ace-switch.btn-rotate[type="checkbox"] + .lbl::after { content: "≡"; line-height: 20px; font-size: 17px; }
+input.ace.ace-switch-4.btn-rotate[type="checkbox"] + .lbl::after, input.ace.ace-switch-5.btn-rotate[type="checkbox"] + .lbl::after { line-height: 17px; }
+input.ace.ace-switch.btn-flat[type="checkbox"] + .lbl::after, input.ace.ace-switch.btn-flat[type="checkbox"] + .lbl::before { border-radius: 0px !important; }
+input.ace.ace-switch.ace-switch-4[type="checkbox"] + .lbl::before, input.ace.ace-switch.ace-switch-5[type="checkbox"] + .lbl::before { text-indent: -24px; }
+input.ace.ace-switch.ace-switch-4[type="checkbox"]:checked + .lbl::before, input.ace.ace-switch.ace-switch-5[type="checkbox"]:checked + .lbl::before { text-indent: 7px; }
+input.ace + .lbl.padding-16::before { margin-right: 16px; }
+input.ace + .lbl.padding-14::before { margin-right: 14px; }
+input.ace + .lbl.padding-12::before { margin-right: 12px; }
+input.ace + .lbl.padding-10::before { margin-right: 10px; }
+input.ace + .lbl.padding-8::before { margin-right: 8px; }
+input.ace + .lbl.padding-6::before { margin-right: 6px; }
+input.ace + .lbl.padding-4::before { margin-right: 4px; }
+input.ace + .lbl.padding-2::before { margin-right: 2px; }
+input.ace + .lbl.padding-0::before { margin-right: 0px; }
+.ace-file-input { display: block; font-size: inherit; position: relative; height: 30px; }
+.ace-file-input input[type="file"] { position: absolute; z-index: -999; width: 1px; height: 1px; overflow: hidden; opacity: 0; }
+.ace-file-input input[type="file"]:focus { outline: 0px none; }
+.ace-file-input .ace-file-container { display: block; position: absolute; top: 0px; left: 0px; right: 0px; height: 30px; background-color: rgb(255, 255, 255); border: 1px solid rgb(213, 213, 213); cursor: pointer; box-shadow: none; transition: all 0.15s ease 0s; }
+.ace-file-input .ace-file-container:hover { box-shadow: none; border-color: rgb(245, 153, 66); }
+.ace-file-input .ace-file-container::before { display: inline-block; content: attr(data-title); position: absolute; right: 0px; top: 0px; bottom: 0px; line-height: 24px; text-align: center; padding: 0px 8px; background-color: rgb(111, 179, 224); color: rgb(255, 255, 255); font-size: 11px; font-weight: 700; border-width: 2px 2px 2px 4px; border-style: solid; border-color: rgb(255, 255, 255); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; transition: all 0.3s ease 0s; }
+.ace-file-input .ace-file-container .ace-file-name { display: inline-block; height: 28px; max-width: 80%; white-space: nowrap; overflow: hidden; line-height: 28px; color: rgb(136, 136, 136); font-size: 13px; vertical-align: top; position: static; padding-left: 30px; }
+.ace-file-input .ace-file-container .ace-file-name::after { display: inline-block; content: attr(data-title); }
+.ace-file-input .ace-file-container.selected { right: 16px; }
+.ace-file-input .ace-file-container.selected .ace-file-name { color: rgb(102, 102, 102); }
+.ace-file-input .ace-file-container .ace-icon { display: inline-block; position: absolute; left: 0px; top: 0px; bottom: 0px; line-height: 24px; width: 26px; text-align: center; font-family: FontAwesome; font-size: 13px; border: 2px solid rgb(255, 255, 255); color: rgb(255, 255, 255); transition: all 0.1s ease 0s; background-color: rgb(209, 209, 209); }
+.ace-file-input .ace-file-container.selected .ace-file-name .ace-icon { background-color: rgb(239, 173, 98); }
+.ace-file-input .ace-file-container.selected .ace-file-name .file-image { background-color: rgb(189, 122, 157); }
+.ace-file-input .ace-file-container.selected .ace-file-name .file-video { background-color: rgb(135, 184, 127); }
+.ace-file-input .ace-file-container.selected .ace-file-name .file-audio { background-color: rgb(139, 122, 201); }
+.ace-file-input .ace-file-container.selected .ace-file-name .file-archive { background-color: rgb(239, 173, 98); }
+.ace-file-input .ace-file-container.hide-placeholder::before { display: none; }
+.ace-file-input a:hover { text-decoration: none; }
+.ace-file-input .remove { position: absolute; right: -8px; top: 6px; display: none; width: 17px; text-align: center; height: 17px; line-height: 15px; font-size: 11px; font-weight: 400; background-color: rgb(251, 113, 66); border-radius: 100%; color: rgb(255, 255, 255); text-decoration: none; }
+.ace-file-input .ace-file-container.selected + .remove { display: inline-block; }
+@media not all {
+ .ace-file-input input[type="file"] { position: absolute; width: 0px; height: 0px; }
+}
+.ace-file-input input.disabled[type="file"] + .ace-file-container, .ace-file-input input[type="file"][disabled] + .ace-file-container, .ace-file-input input[type="file"][readonly] + .ace-file-container { cursor: not-allowed; background-color: rgb(238, 238, 238); }
+.ace-file-input input.disabled[type="file"] + .ace-file-container:hover, .ace-file-input input[type="file"][disabled] + .ace-file-container:hover, .ace-file-input input[type="file"][readonly] + .ace-file-container:hover { box-shadow: none; border-color: rgb(227, 227, 227); }
+.ace-file-input input.disabled[type="file"] + .ace-file-container::before, .ace-file-input input[type="file"][disabled] + .ace-file-container::before, .ace-file-input input[type="file"][readonly] + .ace-file-container::before { border-color: rgb(238, 238, 238); background-color: rgb(161, 170, 175); }
+.ace-file-input input[type="file"][readonly] + .ace-file-container { cursor: default; }
+.fc-event.ui-draggable-dragging, .item-list > li.ui-sortable-helper { cursor: move; }
+.ace-file-input .ace-file-overlay { position: absolute; top: -2px; bottom: -2px; left: -2px; right: -10px; z-index: 99; background-color: rgba(0, 0, 0, 0.5); }
+.ace-file-input .ace-file-overlay > .overlay-content { display: inline-block; position: relative; top: 10%; left: 0px; right: 0px; text-align: center; }
+.ace-file-multiple { height: auto; }
+.ace-file-multiple .ace-file-container { position: relative; height: auto; border: 1px dashed rgb(170, 170, 170); border-radius: 4px; text-align: center; }
+.ace-file-multiple .ace-file-container::before { display: inline-block; content: attr(data-title); position: relative; right: 0px; left: 0px; margin: 12px; line-height: 22px; background-color: rgb(255, 255, 255); color: rgb(204, 204, 204); font-size: 18px; font-weight: 700; border-width: 0px; }
+.ace-file-multiple .ace-file-container.selected .ace-file-name .ace-icon { display: inline-block; left: 0px; top: 0px; bottom: 0px; width: 26px; text-align: center; font-family: FontAwesome; font-size: 13px; border: 2px solid rgb(255, 255, 255); color: rgb(255, 255, 255); transition: all 0.1s ease 0s; }
+.ace-file-multiple .ace-file-container .ace-file-name { position: relative; display: block; padding: 0px; height: auto; width: auto; max-width: 100%; margin: 0px 4px; border-bottom: 1px solid rgb(221, 221, 221); text-align: left; }
+.ace-file-multiple .ace-file-container .ace-file-name:first-child { margin-top: 1px; }
+.ace-file-multiple .ace-file-container .ace-file-name:last-child { border-bottom-width: 0px; margin-bottom: 1px; }
+.ace-file-multiple .ace-file-container .ace-file-name img { padding: 2px; border: 1px solid rgb(215, 215, 215); background-color: rgb(255, 255, 255); background-repeat: no-repeat; background-position: center center; margin: 4px 8px 4px 1px; }
+.ace-file-multiple .ace-file-container .ace-file-name::after { display: none; }
+.ace-file-multiple .ace-file-container.selected .ace-file-name::after { display: inline-block; white-space: pre; }
+.ace-file-multiple .ace-file-container .ace-file-name img + .ace-icon, .ace-file-multiple .ace-file-container.selected .ace-file-name img + .ace-icon { display: none; }
+.ace-file-multiple .remove { right: -11px; top: -11px; border: 3px solid rgb(187, 187, 187); border-radius: 32px; background-color: rgb(255, 255, 255); color: red; width: 23px; height: 23px; line-height: 16px; }
+.input-group .input-group-addon, .input-group > .btn { border-radius: 0px !important; }
+.ace-file-multiple .ace-file-container.selected + .remove:hover { border-color: rgb(244, 192, 177); }
+.ace-file-multiple .ace-file-overlay { position: absolute; top: -12px; bottom: -6px; left: -12px; right: -12px; }
+.ace-file-multiple .ace-file-overlay > .overlay-content { top: 20%; }
+.ace-file-multiple .ace-file-container .ace-file-name .ace-icon { position: relative; display: block; text-align: center; height: auto; line-height: 64px; width: auto; font-size: 64px; color: rgb(213, 213, 213); margin: 4px 0px; background-color: transparent; }
+.ace-file-multiple .ace-file-container.selected::after { display: none; }
+.ace-file-multiple .ace-file-container.selected .ace-file-name .ace-icon { position: relative; margin-right: 4px; margin-left: 2px; line-height: 24px; }
+.ace-file-multiple .ace-file-container .ace-file-name.large { text-align: center; border-bottom: 1px solid rgb(34, 34, 34); margin: 0px 1px 3px; }
+.ace-file-multiple .ace-file-container .ace-file-name.large:last-child { margin: 0px 1px; }
+.ace-file-multiple .ace-file-container .ace-file-name.large::after { position: absolute; top: auto; bottom: 0px; left: 0px; right: 0px; padding: 0px 4px; background-color: rgb(85, 85, 85); color: rgb(255, 255, 255); opacity: 0.8; }
+.ace-file-multiple .ace-file-container .ace-file-name.large img { border-width: 0px; margin: 0px !important; padding: 0px; }
+.ace-file-multiple input.disabled[type="file"] + .ace-file-container:hover, .ace-file-multiple input[type="file"][disabled] + .ace-file-container:hover, .ace-file-multiple input[type="file"][readonly] + .ace-file-container:hover { border-color: rgb(170, 170, 170); }
+.ace-file-multiple input.disabled[type="file"] + .ace-file-container::before, .ace-file-multiple input[type="file"][disabled] + .ace-file-container::before, .ace-file-multiple input[type="file"][readonly] + .ace-file-container::before { background-color: transparent; }
+.ace-file-multiple input.disabled[type="file"] + .ace-file-container .ace-icon, .ace-file-multiple input[type="file"][disabled] + .ace-file-container .ace-icon, .ace-file-multiple input[type="file"][readonly] + .ace-file-container .ace-icon { border-color: rgb(238, 238, 238); }
+.form-group.has-success .input-group .input-group-addon { border-color: rgb(156, 197, 115); }
+.form-group.has-error .input-group .input-group-addon { border-color: rgb(242, 166, 150); }
+.form-group.has-warning .input-group .input-group-addon { border-color: rgb(227, 201, 76); }
+.form-group.has-info .input-group .input-group-addon { border-color: rgb(114, 174, 194); }
+.input-group > .btn { line-height: 20px; padding: 0px 6px; }
+.input-group > .btn.btn-sm { line-height: 22px; }
+.input-group > .btn + .btn { margin-left: 1px; }
+.nav-tabs, .nav-tabs > li:first-child > a { margin-left: 0px; }
+.input-group > .btn-group > .btn { line-height: 23px; }
+.input-group > .btn-group > .btn.btn-sm { line-height: 26px; }
+.input-group > .btn-group > .btn.btn-sm > .caret, .input-group > .btn-group > .btn > .caret, .input-group > .btn.btn-sm > .caret, .input-group > .btn > .caret { margin-top: 10px; }
+.input-group.input-group-compact { width: 1px; }
+.input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { padding-top: 6px; padding-bottom: 6px; }
+.form-group input[type="email"], .form-group input[type="url"], .form-group input[type="search"], .form-group input[type="tel"], .form-group input[type="color"], .form-group input[type="text"], .form-group input[type="password"], .form-group input[type="datetime"], .form-group input[type="datetime-local"], .form-group input[type="date"], .form-group input[type="month"], .form-group input[type="time"], .form-group input[type="week"], .form-group input[type="number"], .form-group select, .form-group textarea { background: rgb(255, 255, 255) none repeat scroll 0% 0%; }
+.form-group.has-success input, .form-group.has-success select, .form-group.has-success textarea { border-color: rgb(156, 197, 115); color: rgb(139, 173, 76); box-shadow: none; }
+.form-group.has-success input:focus, .form-group.has-success select:focus, .form-group.has-success textarea:focus { box-shadow: 0px 0px 0px 2px rgba(130, 188, 58, 0.3); color: rgb(111, 138, 60); border-color: rgb(119, 156, 82); background-color: rgb(244, 249, 240); }
+.form-group.has-success .ace-icon, .form-group.has-success input:focus + .ace-icon, .form-group.has-success select:focus + .ace-icon, .form-group.has-success textarea:focus + .ace-icon { color: rgb(139, 173, 76); }
+.form-group.has-success .btn .ace-icon { color: inherit; }
+.form-group.has-success .control-label, .form-group.has-success .help-block, .form-group.has-success .help-inline { color: rgb(123, 160, 101); }
+.form-group.has-info input, .form-group.has-info select, .form-group.has-info textarea { border-color: rgb(114, 174, 194); color: rgb(75, 137, 170); box-shadow: none; }
+.form-group.has-info input:focus, .form-group.has-info select:focus, .form-group.has-info textarea:focus { box-shadow: 0px 0px 0px 2px rgba(58, 120, 188, 0.3); color: rgb(59, 108, 135); border-color: rgb(72, 142, 165); background-color: rgb(241, 247, 249); }
+.form-group.has-info .ace-icon, .form-group.has-info input:focus + .ace-icon, .form-group.has-info select:focus + .ace-icon, .form-group.has-info textarea:focus + .ace-icon { color: rgb(75, 137, 170); }
+.form-group.has-info .btn .ace-icon { color: inherit; }
+.form-group.has-info .control-label, .form-group.has-info .help-block, .form-group.has-info .help-inline { color: rgb(101, 123, 160); }
+.form-group.has-error input, .form-group.has-error select, .form-group.has-error textarea { border-color: rgb(242, 166, 150); color: rgb(214, 130, 115); box-shadow: none; }
+.form-group.has-error input:focus, .form-group.has-error select:focus, .form-group.has-error textarea:focus { box-shadow: 0px 0px 0px 2px rgba(219, 137, 120, 0.3); color: rgb(202, 95, 76); border-color: rgb(215, 123, 104); background-color: rgb(254, 249, 248); }
+.form-group.has-error .ace-icon, .form-group.has-error input:focus + .ace-icon, .form-group.has-error select:focus + .ace-icon, .form-group.has-error textarea:focus + .ace-icon { color: rgb(214, 130, 115); }
+.form-group.has-error .btn .ace-icon { color: inherit; }
+.form-group.has-error .control-label, .form-group.has-error .help-block, .form-group.has-error .help-inline { color: rgb(209, 110, 108); }
+.form-group.has-warning input, .form-group.has-warning select, .form-group.has-warning textarea { border-color: rgb(227, 201, 76); color: rgb(211, 189, 80); box-shadow: none; }
+.form-group.has-warning input:focus, .form-group.has-warning select:focus, .form-group.has-warning textarea:focus { box-shadow: 0px 0px 0px 2px rgba(216, 188, 65, 0.3); color: rgb(192, 168, 48); border-color: rgb(213, 182, 48); background-color: rgb(253, 251, 243); }
+.form-group.has-warning .ace-icon, .form-group.has-warning input:focus + .ace-icon, .form-group.has-warning select:focus + .ace-icon, .form-group.has-warning textarea:focus + .ace-icon { color: rgb(211, 189, 80); }
+.form-group.has-warning .btn .ace-icon { color: inherit; }
+.form-group.has-warning .control-label, .form-group.has-warning .help-block, .form-group.has-warning .help-inline { color: rgb(209, 157, 89); }
+.form-group input:disabled, .form-group input[disabled] { color: rgb(132, 132, 132) !important; background-color: rgb(238, 238, 238) !important; }
+.input-transparent, input.input-transparent[type], textarea.input-transparent { background-color: rgba(0, 0, 0, 0.5); color: rgb(187, 187, 187); border-color: transparent !important; }
+.input-transparent:focus, input.input-transparent[type]:focus, textarea.input-transparent:focus { background-color: rgba(0, 0, 0, 0.66); color: rgb(240, 240, 240); }
+@media only screen and (max-width: 767px) {
+ .help-inline, .input-icon + .help-inline { padding-left: 0px; display: block !important; }
+}
+.tab-content { border: 1px solid rgb(197, 208, 220); padding: 16px 12px; position: relative; }
+.tab-content.no-padding { padding: 0px; }
+.tab-content.no-border { border: medium none; padding: 12px; }
+.tab-content.padding-32 { padding: 32px 24px; }
+.tab-content.no-border.padding-32 { padding: 32px; }
+.tab-content.padding-30 { padding: 30px 23px; }
+.tab-content.no-border.padding-30 { padding: 30px; }
+.tab-content.padding-28 { padding: 28px 21px; }
+.tab-content.no-border.padding-28 { padding: 28px; }
+.tab-content.padding-26 { padding: 26px 20px; }
+.tab-content.no-border.padding-26 { padding: 26px; }
+.tab-content.padding-24 { padding: 24px 18px; }
+.tab-content.no-border.padding-24 { padding: 24px; }
+.tab-content.padding-22 { padding: 22px 17px; }
+.tab-content.no-border.padding-22 { padding: 22px; }
+.tab-content.padding-20 { padding: 20px 15px; }
+.tab-content.no-border.padding-20 { padding: 20px; }
+.tab-content.padding-18 { padding: 18px 14px; }
+.tab-content.no-border.padding-18 { padding: 18px; }
+.tab-content.padding-16 { padding: 16px 12px; }
+.tab-content.no-border.padding-16 { padding: 16px; }
+.tab-content.padding-14 { padding: 14px 11px; }
+.tab-content.no-border.padding-14 { padding: 14px; }
+.tab-content.padding-12 { padding: 12px 9px; }
+.tab-content.no-border.padding-12 { padding: 12px; }
+.tab-content.padding-10 { padding: 10px 8px; }
+.tab-content.no-border.padding-10 { padding: 10px; }
+.tab-content.padding-8 { padding: 8px 6px; }
+.tab-content.no-border.padding-8 { padding: 8px; }
+.tab-content.padding-6 { padding: 6px 5px; }
+.tab-content.no-border.padding-6 { padding: 6px; }
+.tab-content.padding-4 { padding: 4px 3px; }
+.tab-content.no-border.padding-4 { padding: 4px; }
+.tab-content.no-border.padding-2, .tab-content.padding-2 { padding: 2px; }
+.tab-content.no-border.padding-0, .tab-content.padding-0 { padding: 0px; }
+.nav.nav-tabs.padding-32 { padding-left: 32px; }
+.tabs-left > .nav.nav-tabs.padding-32, .tabs-right > .nav.nav-tabs.padding-32 { padding-left: 0px; padding-top: 32px; }
+.nav.nav-tabs.padding-30 { padding-left: 30px; }
+.tabs-left > .nav.nav-tabs.padding-30, .tabs-right > .nav.nav-tabs.padding-30 { padding-left: 0px; padding-top: 30px; }
+.nav.nav-tabs.padding-28 { padding-left: 28px; }
+.tabs-left > .nav.nav-tabs.padding-28, .tabs-right > .nav.nav-tabs.padding-28 { padding-left: 0px; padding-top: 28px; }
+.nav.nav-tabs.padding-26 { padding-left: 26px; }
+.tabs-left > .nav.nav-tabs.padding-26, .tabs-right > .nav.nav-tabs.padding-26 { padding-left: 0px; padding-top: 26px; }
+.nav.nav-tabs.padding-24 { padding-left: 24px; }
+.tabs-left > .nav.nav-tabs.padding-24, .tabs-right > .nav.nav-tabs.padding-24 { padding-left: 0px; padding-top: 24px; }
+.nav.nav-tabs.padding-22 { padding-left: 22px; }
+.tabs-left > .nav.nav-tabs.padding-22, .tabs-right > .nav.nav-tabs.padding-22 { padding-left: 0px; padding-top: 22px; }
+.nav.nav-tabs.padding-20 { padding-left: 20px; }
+.tabs-left > .nav.nav-tabs.padding-20, .tabs-right > .nav.nav-tabs.padding-20 { padding-left: 0px; padding-top: 20px; }
+.nav.nav-tabs.padding-18 { padding-left: 18px; }
+.tabs-left > .nav.nav-tabs.padding-18, .tabs-right > .nav.nav-tabs.padding-18 { padding-left: 0px; padding-top: 18px; }
+.nav.nav-tabs.padding-16 { padding-left: 16px; }
+.tabs-left > .nav.nav-tabs.padding-16, .tabs-right > .nav.nav-tabs.padding-16 { padding-left: 0px; padding-top: 16px; }
+.nav.nav-tabs.padding-14 { padding-left: 14px; }
+.tabs-left > .nav.nav-tabs.padding-14, .tabs-right > .nav.nav-tabs.padding-14 { padding-left: 0px; padding-top: 14px; }
+.nav.nav-tabs.padding-12 { padding-left: 12px; }
+.tabs-left > .nav.nav-tabs.padding-12, .tabs-right > .nav.nav-tabs.padding-12 { padding-left: 0px; padding-top: 12px; }
+.nav.nav-tabs.padding-10 { padding-left: 10px; }
+.tabs-left > .nav.nav-tabs.padding-10, .tabs-right > .nav.nav-tabs.padding-10 { padding-left: 0px; padding-top: 10px; }
+.nav.nav-tabs.padding-8 { padding-left: 8px; }
+.tabs-left > .nav.nav-tabs.padding-8, .tabs-right > .nav.nav-tabs.padding-8 { padding-left: 0px; padding-top: 8px; }
+.nav.nav-tabs.padding-6 { padding-left: 6px; }
+.tabs-left > .nav.nav-tabs.padding-6, .tabs-right > .nav.nav-tabs.padding-6 { padding-left: 0px; padding-top: 6px; }
+.nav.nav-tabs.padding-4 { padding-left: 4px; }
+.tabs-left > .nav.nav-tabs.padding-4, .tabs-right > .nav.nav-tabs.padding-4 { padding-left: 0px; padding-top: 4px; }
+.nav.nav-tabs.padding-2 { padding-left: 2px; }
+.tabs-left > .nav.nav-tabs.padding-2, .tabs-right > .nav.nav-tabs.padding-2 { padding-left: 0px; padding-top: 2px; }
+.nav-tabs { border-color: rgb(197, 208, 220); margin-bottom: 0px !important; position: relative; top: 1px; }
+.nav-tabs > li > a { padding: 7px 12px 8px; }
+.nav-tabs > li > a, .nav-tabs > li > a:focus { border-radius: 0px !important; border-color: rgb(197, 208, 220); background-color: rgb(249, 249, 249); color: rgb(153, 153, 153); margin-right: -1px; line-height: 18px; position: relative; }
+.nav-tabs > li > a:hover { background-color: rgb(255, 255, 255); color: rgb(76, 143, 189); border-color: rgb(197, 208, 220); }
+.nav-tabs > li > a:active, .nav-tabs > li > a:focus { outline: 0px none !important; }
+.nav-tabs > li.active > a, .nav-tabs > li.active > a:focus, .nav-tabs > li.active > a:hover { color: rgb(87, 99, 115); border-color: rgb(76, 143, 189) rgb(197, 208, 220) transparent; border-top: 2px solid rgb(76, 143, 189); background-color: rgb(255, 255, 255); z-index: 1; line-height: 18px; margin-top: -1px; box-shadow: 0px -2px 3px 0px rgba(0, 0, 0, 0.15); }
+.tabs-below > .nav-tabs { top: auto; margin-bottom: 0px; margin-top: -1px; border-color: rgb(197, 208, 220); border-bottom-width: 0px; }
+.tabs-below > .nav-tabs > li > a, .tabs-below > .nav-tabs > li > a:focus, .tabs-below > .nav-tabs > li > a:hover { border-color: rgb(197, 208, 220); }
+.tabs-below > .nav-tabs > li.active > a, .tabs-below > .nav-tabs > li.active > a:focus, .tabs-below > .nav-tabs > li.active > a:hover { border-color: transparent rgb(197, 208, 220) rgb(76, 143, 189); border-top-width: 1px; border-bottom: 2px solid rgb(76, 143, 189); margin-top: 0px; box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.15); }
+.tabs-left > .nav-tabs > li > a, .tabs-right > .nav-tabs > li > a { min-width: 60px; }
+.tabs-left > .nav-tabs { top: auto; margin-bottom: 0px; border-color: rgb(197, 208, 220); float: left; }
+.tabs-left > .nav-tabs > li { float: none !important; }
+.tabs-left > .nav-tabs > li > a, .tabs-left > .nav-tabs > li > a:focus, .tabs-left > .nav-tabs > li > a:hover { border-color: rgb(197, 208, 220); margin: 0px -1px 0px 0px; }
+.tabs-left > .nav-tabs > li.active > a, .tabs-left > .nav-tabs > li.active > a:focus, .tabs-left > .nav-tabs > li.active > a:hover { border-color: rgb(197, 208, 220) transparent rgb(197, 208, 220) rgb(76, 143, 189); border-top-width: 1px; border-left: 2px solid rgb(76, 143, 189); margin: 0px -1px; box-shadow: -2px 0px 3px 0px rgba(0, 0, 0, 0.15) !important; }
+.tabs-right > .nav-tabs { top: auto; margin-bottom: 0px; border-color: rgb(197, 208, 220); float: right; }
+.tabs-right > .nav-tabs > li { float: none !important; }
+.tabs-right > .nav-tabs > li > a, .tabs-right > .nav-tabs > li > a:focus, .tabs-right > .nav-tabs > li > a:hover { border-color: rgb(197, 208, 220); margin: 0px -1px; }
+.tabs-right > .nav-tabs > li.active > a, .tabs-right > .nav-tabs > li.active > a:focus, .tabs-right > .nav-tabs > li.active > a:hover { border-color: rgb(197, 208, 220) rgb(76, 143, 189) rgb(197, 208, 220) transparent; border-top-width: 1px; border-right: 2px solid rgb(76, 143, 189); margin: 0px -2px 0px -1px; box-shadow: 2px 0px 3px 0px rgba(0, 0, 0, 0.15); }
+.nav-tabs > li > a .badge { padding: 1px 5px; line-height: 15px; opacity: 0.75; vertical-align: initial; }
+.nav-tabs > li > a .ace-icon { opacity: 0.75; }
+.nav-tabs > li.active > a .ace-icon, .nav-tabs > li.active > a .badge { opacity: 1; }
+.nav-tabs li .ace-icon { width: 1.25em; display: inline-block; text-align: center; }
+.nav-tabs > li.open .dropdown-toggle { background-color: rgb(79, 153, 198); border-color: rgb(79, 153, 198); color: rgb(255, 255, 255); }
+.nav-tabs > li.open .dropdown-toggle > .ace-icon { color: rgb(255, 255, 255) !important; }
+.tabs-left .tab-content, .tabs-right .tab-content { overflow: auto; }
+.nav-pills .open .dropdown-toggle, .nav > li.dropdown.open.active > a:focus, .nav > li.dropdown.open.active > a:hover { background-color: rgb(79, 153, 198); border-color: rgb(79, 153, 198); color: rgb(255, 255, 255); }
+.nav-pills .open .dropdown-toggle > .ace-icon, .nav > li.dropdown.open.active > a:focus > .ace-icon, .nav > li.dropdown.open.active > a:hover > .ace-icon { color: rgb(255, 255, 255) !important; }
+.nav-tabs > li:not(.active):not(.open) > a:not(:hover) > .ace-icon.disabled:first-child { color: rgb(144, 144, 144) !important; }
+.nav-tabs.tab-size-bigger > li > a { padding-left: 14px; padding-right: 14px; }
+.nav-tabs.tab-size-bigger > li > a > .ace-icon:first-child { display: block; margin-bottom: 6px; width: auto; }
+.nav-tabs.tab-space-1 > li > a { margin-right: 1px; }
+.nav-tabs.tab-space-2 > li > a { margin-right: 2px; }
+.nav-tabs.tab-space-3 > li > a { margin-right: 3px; }
+.nav-tabs.tab-space-4 > li > a { margin-right: 4px; }
+.nav-tabs[class*="tab-color-"] > li > a, .nav-tabs[class*="tab-color-"] > li > a:focus, .nav-tabs[class*="tab-color-"] > li > a:hover { color: rgb(255, 255, 255); border-color: transparent; margin-right: 3px; }
+.nav-tabs[class*="tab-color-"] > li > a > .badge { border-radius: 2px; }
+.nav-tabs[class*="tab-color-"] > li:not(.active) > a:hover { opacity: 0.85; border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) transparent; }
+.nav-tabs[class*="tab-color-"] > li:not(.active) > a > .ace-icon:first-child { color: rgb(255, 255, 255) !important; }
+.nav-tabs[class*="tab-color-"] > li:not(.active) > a > .badge { color: rgba(0, 0, 0, 0.4) !important; background-color: rgb(255, 255, 255) !important; border-radius: 2px; }
+.nav-tabs.tab-color-blue > li > a, .nav-tabs.tab-color-blue > li > a:focus { background-color: rgb(125, 180, 216); }
+.nav-tabs[class*="tab-color-"] > li.active > a, .nav-tabs[class*="tab-color-"] > li.active > a:focus, .nav-tabs[class*="tab-color-"] > li.active > a:hover { background-color: rgb(255, 255, 255); color: rgb(79, 128, 160); box-shadow: none !important; }
+.nav-tabs.tab-color-blue > li.active > a, .nav-tabs.tab-color-blue > li.active > a:focus, .nav-tabs.tab-color-blue > li.active > a:hover { color: rgb(76, 113, 138); border-color: rgb(125, 180, 216) rgb(125, 180, 216) transparent; }
+.tabs-below .nav-tabs.tab-color-blue > li.active > a { border-color: transparent rgb(125, 180, 216) rgb(125, 180, 216); }
+.nav-tabs.tab-color-blue { border-bottom-color: rgb(197, 208, 220); }
+.nav-tabs.background-blue { padding-top: 6px; background-color: rgb(239, 243, 248); border: 1px solid rgb(197, 208, 220); }
+.tabs-below .nav-tabs.background-blue { padding-top: 0px; padding-bottom: 6px; }
+.tabs-below .nav-tabs.tab-color-blue { border-top: medium none; border-bottom-color: rgb(197, 208, 220); }
+.accordion-style1.panel-group .panel { border-radius: 0px; border-color: rgb(205, 216, 227); background-color: rgb(255, 255, 255); box-shadow: none; }
+.progress, .widget-box { box-shadow: none; }
+.accordion-style1.panel-group .panel:last-child { border-bottom-width: 1px; }
+.accordion-style1.panel-group .panel .collapse { background-color: rgb(255, 255, 255); }
+.accordion-style1.panel-group .panel + .panel { margin-top: 2px; }
+.accordion-style1.panel-group .panel-heading + .panel-collapse .panel-body { border-top-color: rgb(205, 216, 227) !important; }
+.accordion-style1.panel-group .panel-heading { padding: 0px; }
+.accordion-style1.panel-group .panel-heading .accordion-toggle { color: rgb(76, 143, 189); background-color: rgb(238, 244, 249); position: relative; font-weight: 700; font-size: 13px; line-height: 1; padding: 10px; display: block; }
+.accordion-style1.panel-group .panel-heading .accordion-toggle.collapsed { color: rgb(71, 143, 202); font-weight: 400; background-color: rgb(249, 249, 249); }
+.accordion-style1.panel-group .panel-heading .accordion-toggle:hover { color: rgb(110, 166, 204); background-color: rgb(241, 248, 253); text-decoration: none; }
+.accordion-style1.panel-group .panel-heading .accordion-toggle:active, .accordion-style1.panel-group .panel-heading .accordion-toggle:focus { outline: 0px none; text-decoration: none; }
+.accordion-style1.panel-group .panel-heading .accordion-toggle > .ace-icon:first-child { width: 16px; }
+.accordion-style1.panel-group .panel-heading .accordion-toggle:hover > .ace-icon:first-child { text-decoration: none; }
+.accordion-style1.panel-group .collapse.in > .panel-body, .accordion-style1.panel-group .panel-body { border-top: 1px solid rgb(205, 216, 227); }
+.accordion-style1.panel-group.no-padding { padding: 0px; }
+.accordion-style2.panel-group .panel { border-width: 0px; }
+.accordion-style2.panel-group .panel:last-child { border-bottom-width: 0px; }
+.accordion-style2.panel-group .panel + .panel { margin-top: 4px; }
+.accordion-style2.panel-group .panel .panel-body { border-top: medium none; }
+.accordion-style2.panel-group .panel-heading .accordion-toggle { background-color: rgb(237, 243, 247); border-style: solid; border-color: rgb(110, 174, 209); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 0px 0px 2px; }
+.accordion-style2.panel-group .panel-heading .accordion-toggle:hover { text-decoration: none; }
+.accordion-style2.panel-group .panel-heading .accordion-toggle.collapsed { background-color: rgb(243, 243, 243); color: rgb(96, 96, 96); border-width: 0px 0px 0px 1px; border-color: rgb(217, 217, 217); }
+.accordion-style2.panel-group .panel-heading .accordion-toggle.collapsed:hover { background-color: rgb(246, 246, 246); color: rgb(67, 142, 185); text-decoration: none; }
+.accordion-style2.panel-group .collapse.in > .panel-body, .accordion-style2.panel-group .panel-body { border-top: medium none; }
+.accordion-style2.panel-group .accordion-style2.panel-group .panel { border-bottom: 1px dotted rgb(217, 217, 217); }
+.accordion-style2.panel-group .accordion-style2.panel-group .panel:last-child { border-bottom: medium none; }
+.accordion-style2.panel-group .accordion-style2.panel-group .panel .panel-heading, .accordion-style2.panel-group .accordion-style2.panel-group .panel .panel-heading .accordion-toggle { background-color: transparent; border-width: 0px; font-size: 13px; padding-top: 6px; padding-bottom: 8px; }
+.accordion-style2.panel-group .accordion-style2.panel-group .panel .panel-heading { padding-top: 0px; padding-bottom: 0px; }
+.table-bordered, td, th { border-radius: 0px !important; }
+.table > thead > tr { color: rgb(112, 112, 112); font-weight: 400; background: rgb(242, 242, 242) linear-gradient(to bottom, rgb(248, 248, 248) 0px, rgb(236, 236, 236) 100%) repeat-x scroll 0% 0%; }
+.table > thead > tr > th { border-color: rgb(221, 221, 221); font-weight: 700; }
+.table > thead > tr > th .ace-icon:first-child { margin-right: 2px; }
+.table > thead > tr > th:first-child { border-left-color: rgb(241, 241, 241); }
+.table > thead > tr > th:last-child { border-right-color: rgb(241, 241, 241); }
+.table.table-bordered > thead > tr > th { vertical-align: middle; }
+.table.table-bordered > thead > tr > th:first-child { border-left-color: rgb(221, 221, 221); }
+td.center, th.center { text-align: center; }
+td .lbl, th .lbl { margin-bottom: 0px; }
+td .lbl:only-child, th .lbl:only-child { vertical-align: top; }
+.table-header { background-color: rgb(48, 126, 204); color: rgb(255, 255, 255); font-size: 14px; line-height: 38px; padding-left: 12px; margin-bottom: 1px; }
+.table-header .close { margin-right: 8px; margin-top: 0px; opacity: 0.45; }
+.table-header .close:hover { opacity: 0.75; }
+th.detail-col { width: 48px; text-align: center; }
+tr.detail-row { display: none; }
+tr.detail-row.open { display: table-row; }
+tr.detail-row > td { background-color: rgb(241, 246, 248); border-top: 3px solid rgb(209, 225, 234) !important; }
+.table-detail { background-color: rgb(255, 255, 255); border: 1px solid rgb(220, 235, 247); width: 100%; padding: 12px; }
+.table-detail td > .profile-user-info { width: 100%; }
+.widget-box { padding: 0px; box-shadow: none; margin: 3px 0px; border: 1px solid rgb(204, 204, 204); }
+@media only screen and (max-width: 767px) {
+ .widget-box { margin-top: 7px; margin-bottom: 7px; }
+}
+.widget-header { box-sizing: content-box; position: relative; min-height: 38px; background: rgb(247, 247, 247) linear-gradient(to bottom, rgb(255, 255, 255) 0px, rgb(238, 238, 238) 100%) repeat-x scroll 0% 0%; color: rgb(102, 159, 199); border-bottom: 1px solid rgb(221, 221, 221); padding-left: 12px; }
+.widget-box.transparent > .widget-header, .widget-header-flat { }
+.widget-header::after, .widget-header::before { content: ""; display: table; line-height: 0; }
+.widget-header::after { clear: right; }
+.widget-box.collapsed > .widget-header { border-bottom-width: 0px; }
+.collapsed.fullscreen > .widget-header { border-bottom-width: 1px; }
+.collapsed > .widget-body { display: none; }
+.widget-header-flat { background: rgb(247, 247, 247) none repeat scroll 0% 0%; }
+.widget-header-large { min-height: 49px; padding-left: 18px; }
+.widget-header-small { min-height: 31px; padding-left: 10px; }
+.widget-header > .widget-title { line-height: 36px; padding: 0px; margin: 0px; display: inline; }
+.widget-header > .widget-title > .ace-icon { margin-right: 5px; font-weight: 400; display: inline-block; }
+.infobox .infobox-content:first-child, .infobox > .badge, .infobox > .stat, .percentage { font-weight: 700; }
+.widget-header-large > .widget-title { line-height: 48px; }
+.widget-header-small > .widget-title { line-height: 30px; }
+.widget-toolbar { display: inline-block; padding: 0px 10px; line-height: 37px; float: right; position: relative; }
+.widget-header-large > .widget-toolbar { line-height: 48px; }
+.widget-header-small > .widget-toolbar { line-height: 29px; }
+.widget-toolbar.no-padding { padding: 0px; }
+.widget-toolbar.padding-5 { padding: 0px 5px; }
+.widget-toolbar::before { display: inline-block; content: ""; position: absolute; top: 3px; bottom: 3px; left: -1px; border-style: solid; border-color: rgb(217, 217, 217); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 0px 0px; }
+.popover-notitle + .popover .popover-title, .popover.popover-notitle .popover-title, .widget-toolbar.no-border::before { display: none; }
+.widget-header-large > .widget-toolbar::before { top: 6px; bottom: 6px; }
+[class*="widget-color-"] > .widget-header > .widget-toolbar::before { border-color: rgb(238, 238, 238); }
+.widget-color-orange > .widget-header > .widget-toolbar::before { border-color: rgb(255, 238, 170); }
+.widget-color-dark > .widget-header > .widget-toolbar::before { border-color: rgb(34, 34, 34); box-shadow: -1px 0px 0px rgba(255, 255, 255, 0.2), 1px 0px 0px rgba(255, 255, 255, 0.1) inset; }
+.widget-toolbar label { display: inline-block; vertical-align: middle; margin-bottom: 0px; }
+.widget-toolbar > .widget-menu > a, .widget-toolbar > a { font-size: 14px; margin: 0px 1px; display: inline-block; padding: 0px; line-height: 24px; }
+.widget-toolbar > .widget-menu > a:hover, .widget-toolbar > a:hover { text-decoration: none; }
+.widget-header-large > .widget-toolbar > .widget-menu > a, .widget-header-large > .widget-toolbar > a { font-size: 15px; margin: 0px 1px; }
+.widget-toolbar > .btn { line-height: 27px; margin-top: -2px; }
+.widget-toolbar > .btn.smaller { line-height: 26px; }
+.widget-toolbar > .btn.bigger { line-height: 28px; }
+.widget-toolbar > .btn-sm { line-height: 24px; }
+.widget-toolbar > .btn-sm.smaller { line-height: 23px; }
+.widget-toolbar > .btn-sm.bigger { line-height: 25px; }
+.widget-toolbar > .btn-xs { line-height: 22px; }
+.widget-toolbar > .btn-xs.smaller { line-height: 21px; }
+.widget-toolbar > .btn-xs.bigger { line-height: 23px; }
+.widget-toolbar > .btn-minier { line-height: 18px; }
+.widget-toolbar > .btn-minier.smaller { line-height: 17px; }
+.widget-toolbar > .btn-minier.bigger { line-height: 19px; }
+.widget-toolbar > .btn-lg { line-height: 36px; }
+.widget-toolbar > .btn-lg.smaller { line-height: 34px; }
+.widget-toolbar > .btn-lg.bigger { line-height: 38px; }
+.widget-toolbar-dark { background: rgb(68, 68, 68) none repeat scroll 0% 0%; }
+.widget-toolbar-light { background: rgba(255, 255, 255, 0.85) none repeat scroll 0% 0%; }
+.widget-toolbar > .widget-menu { display: inline-block; position: relative; }
+.widget-toolbar > .widget-menu > a[data-action], .widget-toolbar > a[data-action] { transition: transform 0.1s ease 0s; }
+.widget-toolbar > .widget-menu > a[data-action] > .ace-icon, .widget-toolbar > a[data-action] > .ace-icon { margin-right: 0px; }
+.widget-toolbar > .widget-menu > a[data-action]:focus, .widget-toolbar > a[data-action]:focus { text-decoration: none; outline: 0px none; }
+.widget-toolbar > .widget-menu > a[data-action]:hover, .widget-toolbar > a[data-action]:hover { transform: scale(1.2); }
+.widget-body { background-color: rgb(255, 255, 255); }
+.widget-main { padding: 12px; }
+.widget-main.padding-32 { padding: 32px; }
+.widget-main.padding-30 { padding: 30px; }
+.widget-main.padding-28 { padding: 28px; }
+.widget-main.padding-26 { padding: 26px; }
+.widget-main.padding-24 { padding: 24px; }
+.widget-main.padding-22 { padding: 22px; }
+.widget-main.padding-20 { padding: 20px; }
+.widget-main.padding-18 { padding: 18px; }
+.widget-main.padding-16 { padding: 16px; }
+.widget-main.padding-14 { padding: 14px; }
+.widget-main.padding-12 { padding: 12px; }
+.widget-main.padding-10 { padding: 10px; }
+.widget-main.padding-8 { padding: 8px; }
+.widget-main.padding-6 { padding: 6px; }
+.widget-main.padding-4 { padding: 4px; }
+.widget-main.padding-2 { padding: 2px; }
+.widget-main.no-padding, .widget-main.padding-0 { padding: 0px; }
+.widget-toolbar .progress { vertical-align: middle; display: inline-block; margin: 0px; }
+.widget-toolbar > .dropdown, .widget-toolbar > .dropup { display: inline-block; }
+.widget-toolbox.toolbox-vertical, .widget-toolbox.toolbox-vertical + .widget-main { display: table-cell; vertical-align: top; }
+.widget-box > .widget-header > .widget-toolbar > .widget-menu > [data-action="settings"], .widget-box > .widget-header > .widget-toolbar > [data-action="settings"], .widget-color-dark > .widget-header > .widget-toolbar > .widget-menu > [data-action="settings"], .widget-color-dark > .widget-header > .widget-toolbar > [data-action="settings"] { color: rgb(153, 202, 219); }
+.widget-box > .widget-header > .widget-toolbar > .widget-menu > [data-action="reload"], .widget-box > .widget-header > .widget-toolbar > [data-action="reload"], .widget-color-dark > .widget-header > .widget-toolbar > .widget-menu > [data-action="reload"], .widget-color-dark > .widget-header > .widget-toolbar > [data-action="reload"] { color: rgb(172, 211, 146); }
+.widget-box > .widget-header > .widget-toolbar > .widget-menu > [data-action="collapse"], .widget-box > .widget-header > .widget-toolbar > [data-action="collapse"], .widget-color-dark > .widget-header > .widget-toolbar > .widget-menu > [data-action="collapse"], .widget-color-dark > .widget-header > .widget-toolbar > [data-action="collapse"] { color: rgb(170, 170, 170); }
+.widget-box > .widget-header > .widget-toolbar > .widget-menu > [data-action="close"], .widget-box > .widget-header > .widget-toolbar > [data-action="close"], .widget-color-dark > .widget-header > .widget-toolbar > .widget-menu > [data-action="close"], .widget-color-dark > .widget-header > .widget-toolbar > [data-action="close"] { color: rgb(224, 158, 150); }
+.widget-box[class*="widget-color-"] > .widget-header { color: rgb(255, 255, 255); }
+.widget-color-blue { border-color: rgb(48, 126, 204); }
+.widget-color-blue > .widget-header { background: rgb(48, 126, 204) none repeat scroll 0% 0%; border-color: rgb(48, 126, 204); }
+.widget-color-blue2 { border-color: rgb(80, 144, 193); }
+.widget-color-blue2 > .widget-header { background: rgb(80, 144, 193) none repeat scroll 0% 0%; border-color: rgb(80, 144, 193); }
+.widget-color-blue3 { border-color: rgb(99, 121, 170); }
+.widget-color-blue3 > .widget-header { background: rgb(99, 121, 170) none repeat scroll 0% 0%; border-color: rgb(99, 121, 170); }
+.widget-color-green { border-color: rgb(130, 175, 111); }
+.widget-color-green > .widget-header { background: rgb(130, 175, 111) none repeat scroll 0% 0%; border-color: rgb(130, 175, 111); }
+.widget-color-green2 { border-color: rgb(46, 137, 101); }
+.widget-color-green2 > .widget-header { background: rgb(46, 137, 101) none repeat scroll 0% 0%; border-color: rgb(46, 137, 101); }
+.widget-color-green3 { border-color: rgb(78, 188, 48); }
+.widget-color-green3 > .widget-header { background: rgb(78, 188, 48) none repeat scroll 0% 0%; border-color: rgb(78, 188, 48); }
+.widget-color-red { border-color: rgb(226, 117, 95); }
+.widget-color-red > .widget-header { background: rgb(226, 117, 95) none repeat scroll 0% 0%; border-color: rgb(226, 117, 95); }
+.widget-color-red2 { border-color: rgb(224, 65, 65); }
+.widget-color-red2 > .widget-header { background: rgb(224, 65, 65) none repeat scroll 0% 0%; border-color: rgb(224, 65, 65); }
+.widget-color-red3 { border-color: rgb(209, 91, 71); }
+.widget-color-red3 > .widget-header { background: rgb(209, 91, 71) none repeat scroll 0% 0%; border-color: rgb(209, 91, 71); }
+.widget-color-purple { border-color: rgb(126, 110, 176); }
+.widget-color-purple > .widget-header { background: rgb(126, 110, 176) none repeat scroll 0% 0%; border-color: rgb(126, 110, 176); }
+.widget-color-pink { border-color: rgb(206, 111, 158); }
+.widget-color-pink > .widget-header { background: rgb(206, 111, 158) none repeat scroll 0% 0%; border-color: rgb(206, 111, 158); }
+.widget-color-orange { border-color: rgb(232, 177, 13); }
+.widget-color-orange > .widget-header { color: rgb(133, 93, 16) !important; border-color: rgb(232, 177, 13); background: rgb(255, 198, 87) none repeat scroll 0% 0%; }
+.widget-color-dark { border-color: rgb(90, 90, 90); }
+.widget-color-dark > .widget-header { border-color: rgb(102, 102, 102); background: rgb(64, 64, 64) none repeat scroll 0% 0%; }
+.widget-color-grey { border-color: rgb(158, 158, 158); }
+.widget-color-grey > .widget-header { border-color: rgb(170, 170, 170); background: rgb(132, 132, 132) none repeat scroll 0% 0%; }
+.widget-box.transparent { border-width: 0px; }
+.widget-box.transparent > .widget-header { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; border-width: 0px 0px 1px; border-bottom: 1px solid rgb(220, 232, 241); color: rgb(67, 131, 180); padding-left: 3px; }
+.widget-box.transparent > .widget-header-large { padding-left: 5px; }
+.widget-box.transparent > .widget-header-small { padding-left: 1px; }
+.widget-box.transparent > .widget-body { border-width: 0px; background-color: transparent; }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .widget-menu > [data-action], [class*="widget-color-"] > .widget-header > .widget-toolbar > [data-action] { text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.2); }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .widget-menu > [data-action="settings"], [class*="widget-color-"] > .widget-header > .widget-toolbar > [data-action="settings"] { color: rgb(211, 228, 237); }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .widget-menu > [data-action="reload"], [class*="widget-color-"] > .widget-header > .widget-toolbar > [data-action="reload"] { color: rgb(222, 234, 211); }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .widget-menu > [data-action="collapse"], [class*="widget-color-"] > .widget-header > .widget-toolbar > [data-action="collapse"] { color: rgb(226, 226, 226); }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .widget-menu > [data-action="close"], [class*="widget-color-"] > .widget-header > .widget-toolbar > [data-action="close"] { color: rgb(255, 217, 213); }
+.widget-color-orange > .widget-header > .widget-toolbar > .widget-menu > [data-action], .widget-color-orange > .widget-header > .widget-toolbar > [data-action] { text-shadow: none; }
+.widget-color-orange > .widget-header > .widget-toolbar > .widget-menu > [data-action="settings"], .widget-color-orange > .widget-header > .widget-toolbar > [data-action="settings"] { color: rgb(85, 154, 171); }
+.widget-color-orange > .widget-header > .widget-toolbar > .widget-menu > [data-action="reload"], .widget-color-orange > .widget-header > .widget-toolbar > [data-action="reload"] { color: rgb(124, 163, 98); }
+.widget-color-orange > .widget-header > .widget-toolbar > .widget-menu > [data-action="collapse"], .widget-color-orange > .widget-header > .widget-toolbar > [data-action="collapse"] { color: rgb(119, 119, 119); }
+.widget-color-orange > .widget-header > .widget-toolbar > .widget-menu > [data-action="close"], .widget-color-orange > .widget-header > .widget-toolbar > [data-action="close"] { color: rgb(160, 86, 86); }
+.widget-box.light-border[class*="widget-color-"]:not(.fullscreen) { border-width: 0px; }
+.widget-box.light-border[class*="widget-color-"]:not(.fullscreen) > .widget-header { border-width: 1px; border-style: solid; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-color: inherit; }
+.widget-box.light-border[class*="widget-color-"]:not(.fullscreen) > .widget-body { border-style: solid; border-color: rgb(214, 214, 214); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 1px; }
+.widget-box.no-border { border-width: 0px; }
+.widget-box.fullscreen { position: fixed; margin: 0px; top: 0px; bottom: 0px; left: 0px; right: 0px; background-color: rgb(255, 255, 255); border-width: 3px; z-index: 1040 !important; }
+.widget-box.fullscreen:not([class*="widget-color-"]) { border-color: rgb(170, 170, 170); }
+.widget-body .table { border-top: 1px solid rgb(229, 229, 229); }
+.widget-body .table thead:first-child tr { background: rgb(255, 255, 255) none repeat scroll 0% 0%; }
+[class*="widget-color-"] > .widget-body .table thead:first-child tr { background: rgb(242, 242, 242) linear-gradient(to bottom, rgb(248, 248, 248) 0px, rgb(236, 236, 236) 100%) repeat-x scroll 0% 0%; }
+.infobox-dark > .infobox-icon > .ace-icon::before, .tooltip.in { opacity: 1; }
+.widget-body .table.table-bordered thead:first-child > tr { border-top-width: 0px; }
+.widget-main.no-padding .table { margin-bottom: 0px; border-width: 0px; }
+.widget-main.no-padding .table-bordered td:first-child, .widget-main.no-padding .table-bordered th:first-child { border-left-width: 0px; }
+.transparent > .widget-body .widget-main .table-bordered > tbody > tr > td:last-child, .transparent > .widget-body .widget-main .table-bordered > tfoot > tr > td:last-child, .transparent > .widget-body .widget-main .table-bordered > thead > tr > th:last-child, .widget-main.no-padding .table-bordered > tbody > tr > td:last-child, .widget-main.no-padding .table-bordered > tfoot > tr > td:last-child, .widget-main.no-padding .table-bordered > thead > tr > th:last-child { border-right-width: 0px !important; }
+.transparent > .widget-body .widget-main .table-bordered > tbody > tr:last-child > td, .widget-main.no-padding .table-bordered > tbody > tr:last-child > td { border-bottom-width: 0px !important; }
+.table-bordered > thead.thin-border-bottom > tr > td, .table-bordered > thead.thin-border-bottom > tr > th { border-bottom-width: 1px; }
+.widget-body .alert:last-child { margin-bottom: 0px; }
+.widget-main .tab-content { border-width: 0px; }
+.widget-toolbar > .nav-tabs { border-bottom-width: 0px; margin-bottom: 0px; top: auto; margin-top: 3px !important; }
+.widget-toolbar > .nav-tabs > li { margin-bottom: auto; }
+.widget-toolbar > .nav-tabs > li > a { box-shadow: none; position: relative; top: 1px; margin-top: 1px; }
+.widget-toolbar > .nav-tabs > li:not(.active) > a { border-color: transparent; background-color: transparent; }
+.widget-toolbar > .nav-tabs > li:not(.active) > a:hover { background-color: transparent; }
+.widget-toolbar > .nav-tabs > li.active > a { background-color: rgb(255, 255, 255); border-bottom-color: transparent; box-shadow: none; margin-top: auto; }
+.widget-header-small > .widget-toolbar > .nav-tabs > li > a { line-height: 16px; padding-top: 6px; padding-bottom: 6px; }
+.widget-header-small > .widget-toolbar > .nav-tabs > li.active > a { border-top-width: 2px; }
+.widget-header-large > .widget-toolbar > .nav-tabs > li > a { line-height: 22px; padding-top: 9px; padding-bottom: 9px; margin-top: 4px; }
+.widget-header-large > .widget-toolbar > .nav-tabs > li.active > a { margin-top: 3px; }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .nav-tabs > li > a { border-color: transparent; background-color: transparent; color: rgb(255, 255, 255); margin-right: 1px; }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .nav-tabs > li > a:hover { background-color: rgb(255, 255, 255); color: rgb(85, 85, 85); border-top-color: rgb(255, 255, 255); }
+[class*="widget-color-"] > .widget-header > .widget-toolbar > .nav-tabs > li.active > a { background-color: rgb(255, 255, 255); color: rgb(85, 85, 85); border-top-width: 1px; margin-top: 0px; }
+.widget-toolbar > .nav-tabs .widget-color-orange > .widget-header > li > a { color: rgb(133, 93, 16); }
+.transparent > .widget-header > .widget-toolbar > .nav-tabs > li > a { color: rgb(85, 85, 85); background-color: transparent; border-right: 1px solid transparent; border-left: 1px solid transparent; }
+.transparent > .widget-header > .widget-toolbar > .nav-tabs > li.active > a { border-top-color: rgb(76, 143, 189); border-right: 1px solid rgb(197, 208, 220); border-left: 1px solid rgb(197, 208, 220); background-color: rgb(255, 255, 255); box-shadow: none; }
+.widget-toolbox { background-color: rgb(238, 238, 238); }
+.widget-toolbox:first-child { padding: 2px; border-bottom: 1px solid rgb(204, 204, 204); }
+.widget-toolbox:last-child { padding: 2px; border-top: 1px solid rgb(204, 204, 204); }
+.transparent > .widget-body > .widget-toolbox:last-child { border-width: 1px medium medium; border-style: solid none none; border-color: rgb(204, 204, 204) currentcolor currentcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; }
+.widget-toolbox > .btn-toolbar { margin: 0px !important; padding: 0px; }
+.widget-toolbox.center { text-align: center; }
+.widget-toolbox.toolbox-vertical { border-bottom-width: 0px; border-right: 1px solid rgb(217, 217, 217); padding: 6px 4px; width: 1px; }
+.widget-toolbox.padding-16 { padding: 16px; }
+.widget-toolbox.padding-14 { padding: 14px; }
+.widget-toolbox.padding-12 { padding: 12px; }
+.widget-toolbox.padding-10 { padding: 10px; }
+.widget-toolbox.padding-8 { padding: 8px; }
+.widget-toolbox.padding-6 { padding: 6px; }
+.widget-toolbox.padding-4 { padding: 4px; }
+.widget-toolbox.padding-2 { padding: 2px; }
+.widget-toolbox.padding-0 { padding: 0px; }
+.widget-box-overlay { position: absolute; top: -1px; bottom: -1px; right: -1px; left: -1px; z-index: 999; text-align: center; min-height: 100%; background-color: rgba(0, 0, 0, 0.3); }
+.widget-box-overlay > .loading-icon { position: relative; top: 20%; left: 0px; right: 0px; text-align: center; }
+.widget-box.collapsed .widget-box-overlay > .loading-icon { top: 10%; }
+.widget-box-overlay > .loading-icon.icon-spin { animation-duration: 1.2s; }
+.widget-main > form, .widget-main > form .input-append, .widget-main > form .input-prepend { margin-bottom: 0px; }
+.widget-main.no-padding > form > fieldset, .widget-main.padding-0 > form > fieldset { padding: 16px; }
+.widget-main.no-padding > form > fieldset + .form-actions, .widget-main.padding-0 > form > fieldset + .form-actions { padding: 10px 0px 12px; }
+.widget-main.no-padding > form > .form-actions, .widget-main.padding-0 > form > .form-actions { margin: 0px; padding: 10px 12px 12px; }
+.widget-placeholder { border: 2px dashed rgb(217, 217, 217); }
+.infobox, .popover, .popover-title, .progress, .tooltip-inner { border-radius: 0px; }
+.widget-container-col { min-height: 10px; }
+.tooltip-inner { background-color: rgb(51, 51, 51); color: rgb(255, 255, 255); font-size: 12px; text-shadow: 1px 1px 0px rgba(42, 45, 50, 0.5); padding: 5px 9px; }
+.tooltip.top .tooltip-arrow { border-bottom-width: 0px; border-top-color: rgb(51, 51, 51); }
+.tooltip.right .tooltip-arrow { border-left-width: 0px; border-right-color: rgb(51, 51, 51); }
+.tooltip.left .tooltip-arrow { border-right-width: 0px; border-left-color: rgb(51, 51, 51); }
+.tooltip.bottom .tooltip-arrow { border-top-width: 0px; border-bottom-color: rgb(51, 51, 51); }
+.tooltip-error + .tooltip > .tooltip-inner, .tooltip.tooltip-error > .tooltip-inner { background-color: rgb(201, 77, 50); text-shadow: 1px 1px 0px rgba(100, 60, 20, 0.3); }
+.tooltip-error + .tooltip.top .tooltip-arrow, .tooltip.tooltip-error.top .tooltip-arrow { border-top-color: rgb(201, 77, 50); }
+.tooltip-error + .tooltip.right .tooltip-arrow, .tooltip.tooltip-error.right .tooltip-arrow { border-right-color: rgb(201, 77, 50); }
+.tooltip-error + .tooltip.left .tooltip-arrow, .tooltip.tooltip-error.left .tooltip-arrow { border-left-color: rgb(201, 77, 50); }
+.tooltip-error + .tooltip.bottom .tooltip-arrow, .tooltip.tooltip-error.bottom .tooltip-arrow { border-bottom-color: rgb(201, 77, 50); }
+.tooltip-success + .tooltip > .tooltip-inner, .tooltip.tooltip-success > .tooltip-inner { background-color: rgb(98, 155, 88); text-shadow: 1px 1px 0px rgba(60, 100, 20, 0.3); }
+.tooltip-success + .tooltip.top .tooltip-arrow, .tooltip.tooltip-success.top .tooltip-arrow { border-top-color: rgb(98, 155, 88); }
+.tooltip-success + .tooltip.right .tooltip-arrow, .tooltip.tooltip-success.right .tooltip-arrow { border-right-color: rgb(98, 155, 88); }
+.tooltip-success + .tooltip.left .tooltip-arrow, .tooltip.tooltip-success.left .tooltip-arrow { border-left-color: rgb(98, 155, 88); }
+.tooltip-success + .tooltip.bottom .tooltip-arrow, .tooltip.tooltip-success.bottom .tooltip-arrow { border-bottom-color: rgb(98, 155, 88); }
+.tooltip-warning + .tooltip > .tooltip-inner, .tooltip.tooltip-warning > .tooltip-inner { background-color: rgb(237, 148, 33); text-shadow: 1px 1px 0px rgba(100, 90, 10, 0.3); }
+.tooltip-warning + .tooltip.top .tooltip-arrow, .tooltip.tooltip-warning.top .tooltip-arrow { border-top-color: rgb(237, 148, 33); }
+.tooltip-warning + .tooltip.right .tooltip-arrow, .tooltip.tooltip-warning.right .tooltip-arrow { border-right-color: rgb(237, 148, 33); }
+.tooltip-warning + .tooltip.left .tooltip-arrow, .tooltip.tooltip-warning.left .tooltip-arrow { border-left-color: rgb(237, 148, 33); }
+.tooltip-warning + .tooltip.bottom .tooltip-arrow, .tooltip.tooltip-warning.bottom .tooltip-arrow { border-bottom-color: rgb(237, 148, 33); }
+.tooltip-info + .tooltip > .tooltip-inner, .tooltip.tooltip-info > .tooltip-inner { background-color: rgb(75, 137, 170); text-shadow: 1px 1px 0px rgba(40, 50, 100, 0.3); }
+.tooltip-info + .tooltip.top .tooltip-arrow, .tooltip.tooltip-info.top .tooltip-arrow { border-top-color: rgb(75, 137, 170); }
+.tooltip-info + .tooltip.right .tooltip-arrow, .tooltip.tooltip-info.right .tooltip-arrow { border-right-color: rgb(75, 137, 170); }
+.tooltip-info + .tooltip.left .tooltip-arrow, .tooltip.tooltip-info.left .tooltip-arrow { border-left-color: rgb(75, 137, 170); }
+.tooltip-info + .tooltip.bottom .tooltip-arrow, .tooltip.tooltip-info.bottom .tooltip-arrow { border-bottom-color: rgb(75, 137, 170); }
+.popover { padding: 0px; border-color: rgb(204, 204, 204); border-width: 1px; box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.2); color: rgb(77, 92, 115); }
+.popover-title { background-color: rgb(239, 243, 248); color: rgb(85, 85, 85); border-bottom: 1px solid rgb(221, 230, 240); text-shadow: 1px 1px 1px rgba(220, 220, 220, 0.2); }
+.popover.bottom > .arrow::after { top: 1px; margin-left: -10px; border-bottom-color: rgb(239, 243, 248); border-top-width: 0px; }
+.popover-error + .popover, .popover.popover-error { border-color: rgb(247, 240, 239); }
+.popover-error + .popover .popover-title, .popover.popover-error .popover-title { background-color: rgb(247, 240, 239); border-bottom-color: rgb(239, 224, 222); color: rgb(183, 84, 69); text-shadow: none; }
+.popover-error + .popover.top .arrow::after, .popover.popover-error.top .arrow::after { border-top-color: rgb(247, 240, 239); }
+.popover-error + .popover.bottom .arrow::after, .popover.popover-error.bottom .arrow::after { border-bottom-color: rgb(247, 240, 239); }
+.popover-error + .popover.right .arrow::after, .popover.popover-error.right .arrow::after { border-right-color: rgb(247, 240, 239); }
+.popover-error + .popover.left .arrow::after, .popover.popover-error.left .arrow::after { border-left-color: rgb(247, 240, 239); }
+.popover-warning + .popover, .popover.popover-warning { border-color: rgb(244, 238, 227); }
+.popover-warning + .popover .popover-title, .popover.popover-warning .popover-title { background-color: rgb(244, 238, 227); border-bottom-color: rgb(237, 227, 209); color: rgb(214, 126, 49); text-shadow: none; }
+.popover-warning + .popover.top .arrow::after, .popover.popover-warning.top .arrow::after { border-top-color: rgb(244, 238, 227); }
+.popover-warning + .popover.bottom .arrow::after, .popover.popover-warning.bottom .arrow::after { border-bottom-color: rgb(244, 238, 227); }
+.popover-warning + .popover.right .arrow::after, .popover.popover-warning.right .arrow::after { border-right-color: rgb(244, 238, 227); }
+.popover-warning + .popover.left .arrow::after, .popover.popover-warning.left .arrow::after { border-left-color: rgb(244, 238, 227); }
+.popover-success + .popover, .popover.popover-success { border-color: rgb(232, 242, 227); }
+.popover-success + .popover .popover-title, .popover.popover-success .popover-title { background-color: rgb(232, 242, 227); border-bottom-color: rgb(218, 234, 210); color: rgb(98, 155, 88); text-shadow: none; }
+.popover-success + .popover.top .arrow::after, .popover.popover-success.top .arrow::after { border-top-color: rgb(232, 242, 227); }
+.popover-success + .popover.bottom .arrow::after, .popover.popover-success.bottom .arrow::after { border-bottom-color: rgb(232, 242, 227); }
+.popover-success + .popover.right .arrow::after, .popover.popover-success.right .arrow::after { border-right-color: rgb(232, 242, 227); }
+.popover-success + .popover.left .arrow::after, .popover.popover-success.left .arrow::after { border-left-color: rgb(232, 242, 227); }
+.popover-info + .popover, .popover.popover-info { border-color: rgb(229, 237, 248); }
+.popover-info + .popover .popover-title, .popover.popover-info .popover-title { background-color: rgb(229, 237, 248); border-bottom-color: rgb(209, 223, 243); color: rgb(63, 121, 182); text-shadow: none; }
+.popover-info + .popover.top .arrow::after, .popover.popover-info.top .arrow::after { border-top-color: rgb(229, 237, 248); }
+.popover-info + .popover.bottom .arrow::after, .popover.popover-info.bottom .arrow::after { border-bottom-color: rgb(229, 237, 248); }
+.popover-info + .popover.right .arrow::after, .popover.popover-info.right .arrow::after { border-right-color: rgb(229, 237, 248); }
+.popover-info + .popover.left .arrow::after, .popover.popover-info.left .arrow::after { border-left-color: rgb(229, 237, 248); }
+.popover-notitle + .popover.top .arrow::after, .popover.popover-notitle.top .arrow::after { border-top-color: rgb(255, 255, 255); }
+.popover-notitle + .popover.bottom .arrow::after, .popover.popover-notitle.bottom .arrow::after { border-bottom-color: rgb(255, 255, 255); }
+.popover-notitle + .popover.left .arrow::after, .popover.popover-notitle.left .arrow::after { border-left-color: rgb(255, 255, 255); }
+.popover-notitle + .popover.right .arrow::after, .popover.popover-notitle.right .arrow::after { border-right-color: rgb(255, 255, 255); }
+.progress { box-shadow: none; background: rgb(233, 233, 233) none repeat scroll 0% 0%; height: 18px; }
+.progress-striped .progress-bar, .progress-striped .progress-bar-danger { background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress .progress-bar { box-shadow: none; line-height: 18px; }
+.progress[data-percent]::after { display: inline-block; content: attr(data-percent); color: rgb(255, 255, 255); position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; line-height: 16px; text-align: center; font-size: 12px; }
+.infobox > .stat::after, .infobox > .stat::before, .social-or-login::before { content: ""; }
+.progress.progress-yellow[data-percent]::after { color: rgb(153, 102, 51); }
+.progress.progress-small { height: 12px; }
+.progress.progress-small .progress-bar, .progress.progress-small[data-percent]::after { line-height: 10px; font-size: 11px; }
+.progress.progress-mini { height: 9px; }
+.progress.progress-mini .progress-bar, .progress.progress-mini[data-percent]::after { line-height: 8px; font-size: 11px; }
+.progress-bar { background-color: rgb(42, 145, 216); }
+.progress-striped .progress-bar { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-danger { background-color: rgb(202, 89, 82); }
+.progress-striped .progress-bar-danger { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-striped .progress-bar-success, .progress-striped .progress-bar-warning { background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-success { background-color: rgb(89, 168, 75); }
+.progress-striped .progress-bar-success { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-warning { background-color: rgb(242, 187, 70); }
+.progress-striped .progress-bar-warning { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-striped .progress-bar-pink, .progress-striped .progress-bar-purple { background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-pink { background-color: rgb(214, 72, 126); }
+.progress-striped .progress-bar-pink { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-purple { background-color: rgb(149, 133, 191); }
+.progress-striped .progress-bar-purple { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-striped .progress-bar-inverse, .progress-striped .progress-bar-yellow { background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-yellow { background-color: rgb(255, 210, 89); }
+.progress-striped .progress-bar-yellow { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-inverse { background-color: rgb(64, 64, 64); }
+.progress-striped .progress-bar-inverse { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-grey { background-color: rgb(138, 138, 138); }
+.progress-striped .progress-bar-grey { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.infobox-container { text-align: center; font-size: 0px; }
+.infobox { display: inline-block; width: 210px; height: 66px; color: rgb(85, 85, 85); background-color: rgb(255, 255, 255); box-shadow: none; margin: -1px 0px 0px -1px; padding: 8px 3px 6px 9px; border-width: 1px; border-style: dotted; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-color: rgb(216, 216, 216) !important; vertical-align: middle; text-align: left; position: relative; }
+.infobox > .infobox-icon { display: inline-block; vertical-align: top; width: 44px; }
+.infobox > .infobox-icon > .ace-icon { display: inline-block; height: 42px; margin: 0px; padding: 1px 1px 0px 2px; background-color: transparent; border-width: 0px; text-align: center; position: relative; border-radius: 100%; box-shadow: 1px 1px 0px rgba(0, 0, 0, 0.2); }
+.infobox > .infobox-icon > .ace-icon::before { font-size: 24px; display: block; padding: 6px 0px 7px; width: 40px; text-align: center; border-radius: 100%; color: rgba(255, 255, 255, 0.9); background-color: rgba(255, 255, 255, 0.2); text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.14); }
+.infobox .infobox-content { color: rgb(85, 85, 85); max-width: 140px; }
+.infobox > .infobox-data { display: inline-block; border-width: 0px; font-size: 13px; text-align: left; line-height: 21px; min-width: 130px; padding-left: 8px; position: relative; top: 0px; }
+.infobox > .infobox-data > .infobox-data-number { display: block; font-size: 22px; margin: 2px 0px 4px; position: relative; text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.15); }
+.infobox > .infobox-data > .infobox-text { display: block; font-size: 16px; margin: 2px 0px 4px; position: relative; text-shadow: none; }
+.infobox.no-border { border-width: 0px !important; }
+@media only screen and (max-width: 479px) {
+ .infobox { min-width: 95%; margin-top: 2px; margin-bottom: 2px; }
+}
+.infobox-purple { color: rgb(111, 60, 196); border-color: rgb(111, 60, 196); }
+.infobox-purple > .infobox-icon > .ace-icon { background-color: rgb(111, 60, 196); }
+.infobox-purple.infobox-dark { background-color: rgb(111, 60, 196); border-color: rgb(111, 60, 196); }
+.infobox-purple2 { color: rgb(95, 71, 176); border-color: rgb(95, 71, 176); }
+.infobox-purple2 > .infobox-icon > .ace-icon { background-color: rgb(95, 71, 176); }
+.infobox-purple2.infobox-dark { background-color: rgb(95, 71, 176); border-color: rgb(95, 71, 176); }
+.infobox-pink { color: rgb(203, 111, 215); border-color: rgb(203, 111, 215); }
+.infobox-pink > .infobox-icon > .ace-icon { background-color: rgb(203, 111, 215); }
+.infobox-pink.infobox-dark { background-color: rgb(203, 111, 215); border-color: rgb(203, 111, 215); }
+.infobox-blue { color: rgb(111, 179, 224); border-color: rgb(111, 179, 224); }
+.infobox-blue > .infobox-icon > .ace-icon { background-color: rgb(111, 179, 224); }
+.infobox-blue.infobox-dark { background-color: rgb(111, 179, 224); border-color: rgb(111, 179, 224); }
+.infobox-blue2 { color: rgb(57, 131, 194); border-color: rgb(57, 131, 194); }
+.infobox-blue2 > .infobox-icon > .ace-icon { background-color: rgb(57, 131, 194); }
+.infobox-blue2.infobox-dark { background-color: rgb(57, 131, 194); border-color: rgb(57, 131, 194); }
+.infobox-blue3 { color: rgb(17, 68, 235); border-color: rgb(17, 68, 235); }
+.infobox-blue3 > .infobox-icon > .ace-icon { background-color: rgb(17, 68, 235); }
+.infobox-blue3.infobox-dark { background-color: rgb(17, 68, 235); border-color: rgb(17, 68, 235); }
+.infobox-red { color: rgb(213, 63, 64); border-color: rgb(213, 63, 64); }
+.infobox-red > .infobox-icon > .ace-icon { background-color: rgb(213, 63, 64); }
+.infobox-red.infobox-dark { background-color: rgb(213, 63, 64); border-color: rgb(213, 63, 64); }
+.infobox-brown { color: rgb(198, 122, 62); border-color: rgb(198, 122, 62); }
+.infobox-brown > .infobox-icon > .ace-icon { background-color: rgb(198, 122, 62); }
+.infobox-brown.infobox-dark { background-color: rgb(198, 122, 62); border-color: rgb(198, 122, 62); }
+.infobox-wood { color: rgb(123, 63, 37); border-color: rgb(123, 63, 37); }
+.infobox-wood > .infobox-icon > .ace-icon { background-color: rgb(123, 63, 37); }
+.infobox-wood.infobox-dark { background-color: rgb(123, 63, 37); border-color: rgb(123, 63, 37); }
+.infobox-light-brown { color: rgb(206, 190, 165); border-color: rgb(206, 190, 165); }
+.infobox-light-brown > .infobox-icon > .ace-icon { background-color: rgb(206, 190, 165); }
+.infobox-light-brown.infobox-dark { background-color: rgb(206, 190, 165); border-color: rgb(206, 190, 165); }
+.infobox-orange { color: rgb(232, 177, 16); border-color: rgb(232, 177, 16); }
+.infobox-orange > .infobox-icon > .ace-icon { background-color: rgb(232, 177, 16); }
+.infobox-orange.infobox-dark { background-color: rgb(232, 177, 16); border-color: rgb(232, 177, 16); }
+.infobox-orange2 { color: rgb(247, 146, 99); border-color: rgb(247, 146, 99); }
+.infobox-orange2 > .infobox-icon > .ace-icon { background-color: rgb(247, 146, 99); }
+.infobox-orange2.infobox-dark { background-color: rgb(247, 146, 99); border-color: rgb(247, 146, 99); }
+.infobox-green { color: rgb(154, 188, 50); border-color: rgb(154, 188, 50); }
+.infobox-green > .infobox-icon > .ace-icon { background-color: rgb(154, 188, 50); }
+.infobox-green.infobox-dark { background-color: rgb(154, 188, 50); border-color: rgb(154, 188, 50); }
+.infobox-green2 { color: rgb(4, 144, 166); border-color: rgb(4, 144, 166); }
+.infobox-green2 > .infobox-icon > .ace-icon { background-color: rgb(4, 144, 166); }
+.infobox-green2.infobox-dark { background-color: rgb(4, 144, 166); border-color: rgb(4, 144, 166); }
+.infobox-grey { color: rgb(153, 153, 153); border-color: rgb(153, 153, 153); }
+.infobox-grey > .infobox-icon > .ace-icon { background-color: rgb(153, 153, 153); }
+.infobox-grey.infobox-dark { background-color: rgb(153, 153, 153); border-color: rgb(153, 153, 153); }
+.infobox-black { color: rgb(57, 57, 57); border-color: rgb(57, 57, 57); }
+.infobox-black > .infobox-icon > .ace-icon { background-color: rgb(57, 57, 57); }
+.infobox-black.infobox-dark { background-color: rgb(57, 57, 57); border-color: rgb(57, 57, 57); }
+.infobox-dark { margin: 1px 1px 0px 0px; border-color: transparent !important; border-width: 0px; color: rgb(255, 255, 255); padding: 4px; }
+.infobox-dark > .infobox-icon > .ace-icon, .infobox-dark > .infobox-icon > .ace-icon::before { background-color: transparent; box-shadow: none !important; text-shadow: none; border-radius: 0px; font-size: 30px; }
+.infobox-dark .infobox-content { color: rgb(255, 255, 255); }
+.infobox > .infobox-progress { padding-top: 0px; display: inline-block; vertical-align: top; width: 44px; }
+.infobox > .infobox-chart { padding-top: 0px; display: inline-block; vertical-align: text-bottom; width: 44px; text-align: center; }
+.infobox > .infobox-chart > .sparkline { font-size: 24px; }
+.infobox > .infobox-chart canvas { vertical-align: middle !important; }
+.infobox > .stat { display: inline-block; position: absolute; right: 20px; top: 11px; text-shadow: none; color: rgb(171, 186, 195); font-size: 13px; padding-right: 18px; padding-top: 3px; }
+.infobox > .stat::before { display: inline-block; width: 8px; height: 11px; background-color: rgb(171, 186, 195); position: absolute; right: 4px; top: 7px; }
+.infobox > .stat::after { display: inline-block; position: absolute; right: 1px; top: -8px; border-style: solid; border-color: transparent transparent rgb(171, 186, 195); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 8px 7px; }
+.infobox > .stat.stat-success { color: rgb(119, 198, 70); }
+.infobox > .stat.stat-success::before { background-color: rgb(119, 198, 70); }
+.infobox > .stat.stat-success::after { border-bottom-color: rgb(119, 198, 70); }
+.infobox > .stat.stat-important { color: rgb(228, 86, 79); }
+.infobox.infobox-dark > .stat, .infobox.infobox-dark > .stat.stat-important, .infobox.infobox-dark > .stat.stat-success, .infobox > .badge { color: rgb(255, 255, 255); }
+.infobox > .stat.stat-important::before { background-color: rgb(228, 86, 79); top: 3px; }
+.infobox > .stat.stat-important::after { border-top-color: rgb(228, 86, 79); border-bottom-color: transparent; bottom: -6px; top: auto; }
+.infobox.infobox-dark > .stat::before { background-color: rgb(225, 229, 232); }
+.infobox.infobox-dark > .stat::after { border-bottom-color: rgb(225, 229, 232); }
+.infobox.infobox-dark > .stat.stat-success::before { background-color: rgb(208, 226, 158); }
+.infobox.infobox-dark > .stat.stat-success::after { border-bottom-color: rgb(208, 226, 158); }
+.infobox.infobox-dark > .stat.stat-important::before { background-color: rgb(255, 132, 130); top: 3px; }
+.infobox.infobox-dark > .stat.stat-important::after { border-top-color: rgb(255, 132, 130); border-bottom-color: transparent; bottom: -6px; top: auto; }
+.infobox > .badge { position: absolute; right: 20px; top: 11px; border-radius: 0px; text-shadow: none; font-size: 11px; line-height: 15px; height: 16px; padding: 0px 1px; }
+.infobox.infobox-dark > .badge { color: rgb(255, 255, 255); background-color: rgba(255, 255, 255, 0.2) !important; border: 1px solid rgb(241, 241, 241); top: 2px; right: 2px; }
+.infobox.infobox-dark > .badge.badge-success > .ace-icon { color: rgb(198, 233, 161); }
+.infobox.infobox-dark > .badge.badge-important > .ace-icon, .infobox.infobox-dark > .badge.badge-warning > .ace-icon { color: rgb(236, 183, 146); }
+.infobox-small { width: 135px; height: 52px; text-align: left; padding-bottom: 5px; }
+.infobox-small > .infobox-chart, .infobox-small > .infobox-icon, .infobox-small > .infobox-progress { display: inline-block; width: 40px; max-width: 40px; height: 42px; line-height: 38px; vertical-align: middle; }
+.infobox-small > .infobox-data { display: inline-block; text-align: left; vertical-align: middle; max-width: 72px; min-width: 0px; }
+.infobox-small > .infobox-chart > .sparkline { font-size: 14px; margin-left: 2px; }
+.percentage { font-size: 14px; display: inline-block; vertical-align: top; }
+.infobox-small .percentage { font-size: 13px; font-weight: 400; margin-top: 2px; margin-left: 2px; }
+.pricing-box:not(:first-child) { padding-left: 7px; }
+.pricing-box:not(:last-child) { padding-right: 7px; }
+.pricing-box .price { font-size: 22px; line-height: 20px; height: 28px; text-align: center; color: rgb(85, 85, 85); }
+.pricing-box .price small { font-size: 22px; }
+.pricing-box .btn { font-size: 16px; }
+.pricing-box .widget-header { text-align: center; padding-left: 0px; }
+@media only screen and (max-width: 480px) {
+ .pricing-box { margin: 0px 0px 16px -1px; padding-left: 0px !important; padding-right: 0px !important; }
+ .pricing-box:nth-child(2n+1) { padding-left: 12px !important; }
+ .pricing-box:nth-child(2n) { padding-right: 12px !important; }
+}
+@media only screen and (max-width: 479px) {
+ .pricing-box { margin: 0px 0px 16px; width: 100%; padding-left: 12px !important; padding-right: 12px !important; }
+}
+.pricing-table-header { padding-top: 0px; margin-top: 0px; text-align: left; }
+.pricing-table-header > li { padding: 7px 0px 7px 11px; font-size: 13px; }
+.pricing-table { margin-top: 0px; }
+.pricing-table > li { text-align: center; padding: 7px 0px; font-size: 13px; }
+.list-striped > li:nth-child(2n+1) { background-color: rgb(255, 255, 255); }
+.list-striped > li:nth-child(2n) { background-color: rgb(242, 243, 235); }
+.list-striped.pricing-table-header > li:nth-child(2n) { background-color: rgb(238, 238, 238); }
+.pricing-box-small { box-shadow: none; margin-left: -2px; background-color: rgb(255, 255, 255); position: relative; z-index: 10; }
+.pricing-box-small .price { line-height: 20px; height: 28px; text-align: center; }
+.pricing-box-small .price .label::after, .pricing-box-small .price .label::before { margin-top: -2px; opacity: 0.9; }
+.pricing-box-small:hover { box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.15); z-index: 11; transform: scale(1.04); }
+.pricing-box-small:hover .price > .label { transform: scale(0.96); }
+.pricing-span { margin: 0px; width: 19%; max-width: 150px !important; min-width: 110px !important; float: left !important; }
+.pricing-span-header { padding-right: 0px; }
+@media only screen and (min-width: 480px) {
+ .pricing-span-body { padding-left: 0px; padding-right: 0px; }
+}
+@media only screen and (max-width: 480px) {
+ .pricing-span-body, .pricing-span-header { width: 100%; padding-right: 12px; }
+}
+.login-container { width: 375px; margin: 0px auto; }
+.login-layout label, .ui-jqdialog-content .searchFilter .queryresult { margin-bottom: 11px; }
+.login-layout { background-color: rgb(29, 32, 36); }
+.login-layout .main-container::before { display: none; }
+.login-layout .main-content { margin-left: 0px !important; margin-right: 0px !important; min-height: 100%; padding-left: 15px; padding-right: 15px; }
+.login-layout .widget-box { visibility: hidden; position: fixed; z-index: -5; border-bottom: medium none; box-shadow: none; padding: 6px; background-color: rgb(57, 69, 87); transform: scale(0, 1) translate(-150px); }
+.login-layout .widget-box.visible { visibility: visible; position: relative; z-index: auto; transform: scale(1, 1) translate(0px); transition: -webkit-transform 0.3s ease 0s; }
+.login-layout .widget-box .widget-main { padding: 16px 36px 36px; background: rgb(247, 247, 247) none repeat scroll 0% 0%; }
+.login-layout .widget-box .widget-main form { margin: 0px; }
+.login-layout .widget-box .widget-body .toolbar > div > a { font-size: 15px; font-weight: 400; text-shadow: 1px 0px 1px rgba(0, 0, 0, 0.25); }
+.login-box .forgot-password-link { color: rgb(255, 238, 153); }
+.login-box .user-signup-link { color: rgb(204, 255, 119); }
+.login-box .toolbar { background: rgb(80, 144, 193) none repeat scroll 0% 0%; border-top: 2px solid rgb(89, 117, 151); }
+.login-box .toolbar > div { width: 50%; display: inline-block; padding: 9px 0px 11px; }
+.login-box .toolbar > div:first-child { float: left; text-align: left; }
+.login-box .toolbar > div:first-child > a { margin-left: 11px; }
+.login-box .toolbar > div:first-child + div { float: right; text-align: right; }
+.login-box .toolbar > div:first-child + div > a { margin-right: 11px; }
+.forgot-box .toolbar { background: rgb(193, 96, 80) none repeat scroll 0% 0%; border-top: 2px solid rgb(151, 101, 89); padding: 9px 18px; }
+.signup-box .toolbar { background: rgb(118, 183, 116) none repeat scroll 0% 0%; border-top: 2px solid rgb(117, 151, 89); padding: 9px 18px; }
+.forgot-box .back-to-login-link, .signup-box .back-to-login-link { color: rgb(255, 238, 153); font-size: 14px; font-weight: 700; text-shadow: 1px 0px 1px rgba(0, 0, 0, 0.25); }
+.login-layout .login-box .widget-main { padding-bottom: 16px; }
+.social-or-login { margin-top: 4px; text-align: center; position: relative; z-index: 1; }
+.social-or-login :first-child { display: inline-block; background: rgb(247, 247, 247) none repeat scroll 0% 0%; padding: 0px 8px; color: rgb(80, 144, 193); font-size: 13px; }
+.social-or-login::before { display: block; position: absolute; z-index: -1; top: 50%; left: 0px; right: 0px; border-top: 1px dotted rgb(166, 196, 219); }
+.social-login a { border-radius: 100%; width: 42px; height: 42px; line-height: 46px; padding: 0px; margin: 0px 1px; border-width: 0px; }
+.social-login a > .ace-icon { font-size: 24px; margin: 0px; }
+@media only screen and (max-width: 540px) {
+ .login-layout .widget-box .widget-main { padding: 16px; }
+ .login-container { width: 98%; }
+ .login-layout .widget-box { padding: 0px; }
+ .login-layout .main-content { padding-left: 6px; padding-right: 6px; }
+ .login-box .toolbar > div { width: auto; }
+}
+.light-login { background: rgb(223, 224, 226) url("pattern.jpg") repeat scroll 0% 0%; }
+.light-login .widget-box { padding: 1px 1px 0px; box-shadow: 0px 0px 2px 1px rgba(0, 0, 0, 0.12); border-bottom: 1px solid rgba(50, 50, 50, 0.33); }
+.light-login .widget-box .toolbar { border-top-width: 1px; }
+.light-login .widget-box.login-box { background-color: rgba(100, 110, 120, 0.4); }
+.light-login .widget-box.signup-box { background-color: rgba(110, 120, 100, 0.4); }
+.light-login .widget-box.forgot-box { background-color: rgba(120, 110, 100, 0.4); }
+.blur-login { background: rgb(57, 69, 87) url("meteorshower2.jpg") repeat scroll 0% 0%; }
+.invoice-info { line-height: 24px !important; color: rgb(68, 68, 68); vertical-align: bottom; margin-left: 9px; margin-right: 9px; }
+.invoice-info-label { display: inline-block; max-width: 100px; text-align: right; font-size: 14px; }
+.ace-thumbnails > li, .ace-thumbnails > li > :first-child { display: block; position: relative; }
+.invoice-box .label-large[class*="arrowed"] { margin-left: 11px !important; max-width: 95%; }
+.error-container { margin: 20px; padding: 0px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; }
+@media only screen and (max-width: 767px) {
+ .error-container { margin: 12px; }
+}
+@media only screen and (max-width: 479px) {
+ .error-container { margin: 6px; }
+}
+.ace-thumbnails { list-style: outside none none; margin: 0px; padding: 0px; }
+.ace-thumbnails > li { float: left; overflow: hidden; margin: 2px; border: 2px solid rgb(51, 51, 51); }
+.ace-thumbnails > li > :first-child:focus { outline: 0px none; }
+.ace-thumbnails > li .tags { display: inline-block; position: absolute; bottom: 0px; right: 0px; overflow: visible; direction: rtl; padding: 0px; margin: 0px; height: auto; width: auto; background-color: transparent; border-width: 0px; vertical-align: inherit; }
+.ace-thumbnails > li .tags > .label-holder { opacity: 0.92; display: table; margin: 1px 0px 0px; direction: ltr; text-align: left; }
+.ace-thumbnails > li > .tools, .ace-thumbnails > li > :first-child > .text { position: absolute; text-align: center; background-color: rgba(0, 0, 0, 0.55); }
+.ace-thumbnails > li .tags > .label-holder:hover { opacity: 1; }
+.ace-thumbnails > li > .tools { top: 0px; bottom: 0px; left: -30px; width: 24px; vertical-align: middle; transition: all 0.2s ease 0s; }
+.ace-thumbnails > li > .tools.tools-right { left: auto; right: -30px; }
+.ace-thumbnails > li > .tools.tools-bottom { width: auto; height: 28px; left: 0px; right: 0px; top: auto; bottom: -30px; }
+.ace-thumbnails > li > .tools.tools-top { width: auto; height: 28px; left: 0px; right: 0px; top: -30px; bottom: auto; }
+.ace-thumbnails > li:hover > .tools { left: 0px; right: 0px; }
+.ace-thumbnails > li:hover > .tools.tools-bottom { top: auto; bottom: 0px; }
+.ace-thumbnails > li:hover > .tools.tools-top { bottom: auto; top: 0px; }
+.ace-thumbnails > li:hover > .tools.tools-right { left: auto; right: 0px; }
+.ace-thumbnails > li > .in.tools { left: 0px; right: 0px; }
+.ace-thumbnails > li > .in.tools.tools-bottom { top: auto; bottom: 0px; }
+.ace-thumbnails > li > .in.tools.tools-top { bottom: auto; top: 0px; }
+.ace-thumbnails > li > .in.tools.tools-right { left: auto; right: 0px; }
+.ace-thumbnails > li > .tools > a, .ace-thumbnails > li > :first-child .inner a { display: inline-block; color: rgb(255, 255, 255); font-size: 18px; font-weight: 400; padding: 0px 4px; }
+.ace-thumbnails > li > .tools > a:hover, .ace-thumbnails > li > :first-child .inner a:hover { text-decoration: none; color: rgb(201, 226, 234); }
+.ace-thumbnails > li .tools.tools-bottom > a, .ace-thumbnails > li .tools.tools-top > a { display: inline-block; }
+.ace-thumbnails > li > :first-child > .text { right: 0px; left: 0px; bottom: 0px; top: 0px; color: rgb(255, 255, 255); opacity: 0; transition: all 0.2s ease 0s; }
+.dialogs, .itemdiv { position: relative; }
+.ace-thumbnails > li > :first-child > .text::before { content: ""; display: inline-block; height: 100%; vertical-align: middle; margin-right: 0px; }
+.ace-thumbnails > li > :first-child > .text > .inner { padding: 4px 0px; margin: 0px; display: inline-block; vertical-align: middle; max-width: 90%; }
+.ace-thumbnails > li:hover > :first-child > .text { opacity: 1; }
+@media only screen and (max-width: 480px) {
+ .ace-thumbnails { text-align: center; }
+ .ace-thumbnails > li { float: none; display: inline-block; }
+}
+.dialogs { padding: 9px; }
+.itemdiv { padding-right: 3px; min-height: 66px; }
+.itemdiv > .user { display: inline-block; width: 42px; position: absolute; left: 0px; }
+.itemdiv > .user > .img, .itemdiv > .user > img { border-radius: 100%; border: 2px solid rgb(82, 147, 196); max-width: 40px; position: relative; }
+.itemdiv > .user > .img { padding: 2px; }
+.itemdiv > .body { width: auto; margin-left: 50px; margin-right: 12px; position: relative; }
+.itemdiv > .body > .time { display: block; font-size: 11px; font-weight: 700; color: rgb(102, 102, 102); position: absolute; right: 9px; top: 0px; }
+.itemdiv > .body > .time .ace-icon { font-size: 14px; font-weight: 400; }
+.itemdiv > .body > .name { display: block; color: rgb(153, 153, 153); }
+.itemdiv > .body > .name > b { color: rgb(119, 119, 119); }
+.itemdiv > .body > .text { display: block; position: relative; margin-top: 2px; padding-bottom: 19px; padding-left: 7px; font-size: 13px; }
+.itemdiv.dialogdiv::before, .itemdiv.dialogdiv > .body::before, .itemdiv > .body > .text::after { content: ""; position: absolute; }
+.itemdiv > .body > .text::after { display: block; height: 1px; font-size: 0px; overflow: hidden; left: 16px; right: -12px; margin-top: 9px; border-top: 1px solid rgb(228, 236, 243); }
+.itemdiv > .body > .text > .ace-icon:first-child { color: rgb(220, 227, 237); margin-right: 4px; }
+.itemdiv:last-child > .body > .text { border-bottom-width: 0px; }
+.itemdiv:last-child > .body > .text::after { display: none; }
+.itemdiv.dialogdiv { padding-bottom: 14px; }
+.itemdiv.dialogdiv::before { display: block; top: 0px; bottom: 0px; left: 19px; width: 3px; max-width: 3px; background-color: rgb(225, 230, 237); border-style: solid; border-color: rgb(215, 219, 221); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px; }
+.itemdiv.dialogdiv:last-child { padding-bottom: 0px; }
+.itemdiv.dialogdiv:last-child::before { display: none; }
+.itemdiv.dialogdiv > .user > img { border-color: rgb(201, 214, 229); }
+.itemdiv.dialogdiv > .body { border-width: 1px 1px 1px 2px; border-style: solid; border-color: rgb(221, 228, 237); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; padding: 5px 8px 8px; margin-right: 1px; }
+.itemdiv.dialogdiv > .body::before { display: block; left: -7px; top: 11px; width: 8px; height: 8px; border-style: solid; border-color: rgb(221, 228, 237); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 2px 0px 0px 2px; background-color: rgb(255, 255, 255); box-sizing: content-box; transform: rotate(-45deg); }
+.itemdiv.dialogdiv > .body > .time { position: static; float: right; }
+.itemdiv.dialogdiv > .body > .text { padding-left: 0px; padding-bottom: 0px; }
+.itemdiv.dialogdiv > .body > .text::after { display: none; }
+.itemdiv.dialogdiv .tooltip-inner { word-break: break-all; }
+.itemdiv.memberdiv { width: 175px; padding: 2px; margin: 3px 0px; float: left; border-bottom: 1px solid rgb(232, 232, 232); }
+@media (min-width: 992px) {
+ .itemdiv.memberdiv { max-width: 50%; }
+}
+@media (max-width: 991px) {
+ .itemdiv.memberdiv { min-width: 33.333%; }
+}
+.itemdiv.memberdiv > .user > img { border-color: rgb(220, 227, 237); }
+.itemdiv.memberdiv > .body > .time { position: static; }
+.itemdiv.memberdiv > .body > .name { line-height: 18px; height: 18px; margin-bottom: 0px; }
+.itemdiv.memberdiv > .body > .name > a { display: inline-block; max-width: 100px; max-height: 18px; overflow: hidden; text-overflow: ellipsis; word-break: break-all; }
+.itemdiv .tools { position: absolute; right: 5px; bottom: 10px; display: none; }
+.item-list > li > .checkbox, .item-list > li > label.inline, .itemdiv:hover .tools { display: inline-block; }
+.itemdiv .tools .btn { border-radius: 36px; margin: 1px 0px; }
+.itemdiv .body .tools { bottom: 4px; }
+.itemdiv.commentdiv .tools { right: 9px; }
+.item-list { margin: 0px; padding: 0px; list-style: outside none none; }
+.item-list > li { padding: 9px; background-color: rgb(255, 255, 255); margin-top: -1px; position: relative; }
+.item-list > li.selected { color: rgb(128, 144, 160); background-color: rgb(244, 249, 252); }
+.item-list > li.selected .lbl, .item-list > li.selected label { text-decoration: line-through; color: rgb(128, 144, 160); }
+.item-list > li label { font-size: 13px; }
+.item-list > li .percentage { font-size: 11px; font-weight: 700; color: rgb(119, 119, 119); }
+li[class*="item-"] { border-width: 1px 1px 1px 3px; border-style: solid; border-color: rgb(221, 221, 221); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; }
+li.item-orange { border-left-color: rgb(232, 177, 16); }
+li.item-orange2 { border-left-color: rgb(247, 146, 99); }
+li.item-red { border-left-color: rgb(213, 63, 64); }
+li.item-red2 { border-left-color: rgb(209, 91, 71); }
+li.item-green { border-left-color: rgb(154, 188, 50); }
+li.item-green2 { border-left-color: rgb(4, 144, 166); }
+li.item-blue { border-left-color: rgb(79, 153, 198); }
+li.item-blue2 { border-left-color: rgb(57, 131, 194); }
+li.item-blue3 { border-left-color: rgb(17, 68, 235); }
+li.item-pink { border-left-color: rgb(203, 111, 215); }
+li.item-purple { border-left-color: rgb(111, 60, 196); }
+li.item-black { border-left-color: rgb(80, 80, 80); }
+li.item-grey { border-left-color: rgb(160, 160, 160); }
+li.item-brown { border-left-color: brown; }
+li.item-default { border-left-color: rgb(171, 186, 195); }
+.ui-sortable-helper, .ui-sortable-helper > a, .ui-sortable-placeholder, .ui-sortable-placeholder > a { cursor: move !important; }
+@media only screen and (max-width: 480px) {
+ .itemdiv.memberdiv { float: none; width: auto; }
+}
+.profile-user-info { display: table; width: calc(100% - 24px); margin: 0px auto; }
+.profile-info-row { display: table-row; }
+.profile-info-name, .profile-info-value { display: table-cell; border-top: 1px dotted rgb(213, 228, 241); }
+.profile-info-name { text-align: right; padding: 6px 10px 6px 4px; font-weight: 400; color: rgb(102, 126, 153); background-color: transparent; width: 110px; vertical-align: middle; }
+.profile-info-value { padding: 6px 4px 6px 6px; }
+.profile-info-value > span + span::before { display: inline; content: ","; margin-left: 1px; margin-right: 3px; color: rgb(102, 102, 102); border-bottom: 1px solid rgb(255, 255, 255); }
+.profile-info-value > span + span.editable-container::before { display: none; }
+.profile-info-row:first-child .profile-info-name, .profile-info-row:first-child .profile-info-value { border-top: medium none; }
+.profile-user-info-striped { border: 1px solid rgb(220, 235, 247); }
+.profile-user-info-striped .profile-info-name { color: rgb(51, 97, 153); background-color: rgb(237, 243, 244); border-top: 1px solid rgb(247, 251, 255); }
+.profile-user-info-striped .profile-info-value { border-top: 1px dotted rgb(220, 235, 247); padding-left: 12px; }
+.profile-picture { border: 1px solid rgb(204, 204, 204); background-color: rgb(255, 255, 255); padding: 4px; display: inline-block; max-width: 100%; box-sizing: border-box; box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.15); }
+.dd-empty, .dd-handle, .dd-placeholder, .dd2-content { box-sizing: border-box; }
+.profile-activity { padding: 10px 4px; border-bottom: 1px dotted rgb(208, 216, 224); position: relative; border-left: 1px dotted rgb(255, 255, 255); border-right: 1px dotted rgb(255, 255, 255); }
+.profile-activity:first-child { border-top: 1px dotted transparent; }
+.profile-activity:first-child:hover { border-top-color: rgb(208, 216, 224); }
+.profile-activity:hover { background-color: rgb(244, 249, 253); border-left: 1px dotted rgb(208, 216, 224); border-right: 1px dotted rgb(208, 216, 224); }
+.profile-activity img { border: 2px solid rgb(201, 214, 229); border-radius: 100%; max-width: 40px; margin-right: 10px; margin-left: 0px; box-shadow: none; }
+.profile-activity .thumbicon { background-color: rgb(116, 171, 215); display: inline-block; border-radius: 100%; width: 38px; height: 38px; color: rgb(255, 255, 255); font-size: 18px; text-align: center; line-height: 38px; margin-right: 10px; margin-left: 0px; text-shadow: none !important; }
+.profile-activity .time { display: block; margin-top: 4px; color: rgb(119, 119, 119); }
+.profile-activity a.user { font-weight: 700; color: rgb(149, 133, 191); }
+.profile-activity .tools { position: absolute; right: 12px; bottom: 8px; display: none; }
+.profile-activity:hover .tools { display: block; }
+.user-profile .ace-thumbnails li { border: 1px solid rgb(204, 204, 204); padding: 3px; margin: 6px; }
+.user-profile .ace-thumbnails li .tools { left: 3px; right: 3px; }
+.user-profile .ace-thumbnails li:hover .tools { bottom: 3px; }
+.user-title-label:hover { text-decoration: none; }
+.user-title-label + .dropdown-menu { margin-left: -12px; }
+.profile-contact-links { padding: 4px 2px 5px; border: 1px solid rgb(224, 226, 229); background-color: rgb(248, 250, 252); }
+.btn-link:hover .ace-icon { text-decoration: none !important; }
+.profile-social-links > a:hover > .ace-icon, .profile-users .memberdiv .name a:hover .ace-icon, .profile-users .memberdiv .tools > a:hover { text-decoration: none; }
+.profile-social-links > a { text-decoration: none; margin: 0px 1px; }
+.profile-skills .progress { height: 26px; margin-bottom: 2px; background-color: transparent; }
+.profile-skills .progress .progress-bar { line-height: 26px; font-size: 13px; font-weight: 700; font-family: "Open Sans"; padding: 0px 8px; }
+.profile-users .user { display: block; position: static; text-align: center; width: auto; }
+.profile-users .user img { padding: 2px; border-radius: 100%; border: 1px solid rgb(170, 170, 170); max-width: none; width: 64px; transition: all 0.1s ease 0s; }
+.profile-users .user img:hover { box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.33); }
+.profile-users .memberdiv { background-color: rgb(255, 255, 255); width: 100px; box-sizing: border-box; border: medium none; text-align: center; margin: 0px 8px 24px; }
+.profile-users .memberdiv .body { display: inline-block; margin: 8px 0px 0px; }
+.profile-users .memberdiv .popover { visibility: hidden; min-width: 0px; max-height: 0px; max-width: 0px; margin-left: 0px; margin-right: 0px; top: -5%; left: auto; right: auto; opacity: 0; display: none; position: absolute; transition: opacity 0.2s linear 0s, visibility 0s linear 0.2s, max-height 0s linear 0.2s, max-width 0s linear 0.2s, min-width 0s linear 0.2s; }
+.profile-users .memberdiv .popover.right { left: 100%; right: auto; display: block; }
+.profile-users .memberdiv .popover.left { left: auto; right: 100%; display: block; }
+.profile-users .memberdiv > :first-child:hover .popover { visibility: visible; opacity: 1; z-index: 1060; max-height: 250px; max-width: 250px; min-width: 150px; transition-delay: 0s; }
+.profile-users .memberdiv .tools { position: static; display: block; width: 100%; margin-top: 2px; }
+.profile-users .memberdiv .tools > a { margin: 0px 2px; }
+.user-status { display: inline-block; width: 11px; height: 11px; background-color: rgb(255, 255, 255); border: 3px solid rgb(170, 170, 170); border-radius: 100%; vertical-align: middle; margin-right: 1px; }
+.user-status.status-online { border-color: rgb(138, 193, 108); }
+.user-status.status-busy { border-color: rgb(224, 127, 105); }
+.user-status.status-idle { border-color: rgb(255, 183, 82); }
+.tab-content.profile-edit-tab-content { border: 1px solid rgb(221, 221, 221); padding: 8px 32px 32px; box-shadow: 1px 1px 0px 0px rgba(0, 0, 0, 0.2); background-color: rgb(255, 255, 255); }
+@media only screen and (max-width: 480px) {
+ .profile-info-name { width: 80px; }
+ .profile-user-info-striped .profile-info-name { float: none; width: auto; text-align: left; padding: 6px 4px 6px 10px; display: block; }
+ .profile-user-info-striped .profile-info-value { margin-left: 10px; display: block; }
+ .user-profile .memberdiv { width: 50%; margin-left: 0px; margin-right: 0px; }
+}
+.inbox-tabs.nav-tabs > li > a { background-color: rgb(250, 250, 250); }
+.inbox-tabs.nav-tabs > li.active:not(.open) > a, .inbox-tabs.nav-tabs > li.active:not(.open) > a:focus, .inbox-tabs.nav-tabs > li.active:not(.open) > a:hover { background-color: rgb(241, 245, 250); box-shadow: 0px -2px 3px 0px rgba(0, 0, 0, 0.1); color: rgb(72, 118, 142); }
+.inbox-tabs.nav-tabs > li > a.btn-new-mail { background-color: transparent; border: medium none !important; padding: 0px !important; }
+.inbox-tabs.nav-tabs > li > a.btn-new-mail > .btn { border-width: 0px !important; border-radius: 3px !important; padding: 0px 6px !important; position: relative; transition: none 0s ease 0s !important; }
+.inbox-tabs.nav-tabs > li.active > a.btn-new-mail { box-shadow: none !important; }
+.inbox-tabs.nav-tabs > li.active > a.btn-new-mail > .btn::before { content: ""; display: block; position: absolute; top: 100%; left: 50%; margin-left: -6px; border-width: 6px 8px; border-style: solid; border-right: 8px solid transparent; border-bottom: 6px solid transparent; border-left: 8px solid transparent; border-top-color: inherit; }
+.message-container, .message-item, .message-list { position: relative; }
+.inbox-tabs.nav-tabs.tab-size-bigger > li > a { padding: 5px 15px 7px; font-size: 14px; }
+.inbox-tabs.nav-tabs.tab-size-bigger > li > a > .ace-icon:first-child { margin-bottom: 5px; }
+.inbox-tabs.nav-tabs.tab-size-bigger > li > a.btn-new-mail > .btn { padding: 10px !important; border-radius: 7px !important; }
+.inbox-tabs.nav-tabs.tab-size-bigger > li.active > a.btn-new-mail { margin-top: 0px !important; top: 1px; }
+.inbox-tabs.nav-tabs.tab-size-bigger > li.active > a.btn-new-mail > .btn::before { left: 50%; margin-left: -8px; border-width: 8px 10px; }
+@media only screen and (max-width: 479px) {
+ .inbox-tabs > .li-new-mail { display: block; text-align: right; margin-bottom: 8px !important; float: none !important; }
+ .inbox-tabs > .li-new-mail > .btn-new-mail { display: inline-block; width: auto; }
+}
+.message-item .sender, .message-item .summary, .message-item .summary .text { display: inline-block; white-space: nowrap; vertical-align: middle; }
+.message-item { border-width: 1px 1px 0px; border-style: solid; border-color: rgb(234, 237, 241); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; padding: 12px 12px 14px; line-height: 18px; background-color: rgb(255, 255, 255); }
+.message-item:first-child { border-top-width: 0px; }
+.message-item:hover { border-color: rgb(226, 234, 242); background-color: rgb(242, 246, 249); }
+.message-item:hover + .message-item { border-top-color: rgb(226, 234, 242); }
+.message-item.selected + .message-item, .message-item.selected + .message-item:hover + .message-item, .message-item:hover + .message-item.selected { border-top-color: rgb(255, 255, 255); }
+.message-item.selected { background-color: rgb(239, 244, 247); border-color: rgb(255, 255, 255) rgb(226, 234, 242); }
+.message-item input.ace + .lbl::before, .message-navbar input.ace + .lbl::before { top: auto; }
+.message-item .sender { margin: 0px 6px 0px 4px; color: rgb(70, 114, 135); width: 110px; height: 18px; text-overflow: ellipsis; overflow: hidden; cursor: pointer; }
+.message-item.message-unread .sender { color: rgb(106, 156, 186); font-weight: 700; }
+.message-item .summary { position: relative; margin-left: 30px; max-width: calc(100% - 300px); min-width: 200px; }
+.message-item .summary .text { color: rgb(85, 85, 85); width: auto; max-width: 100%; height: 18px; text-overflow: ellipsis; overflow: hidden; cursor: pointer; }
+.message-item .summary .text:hover { text-decoration: underline; }
+.message-item .summary .message-flags { display: block; position: absolute; right: 100%; margin-right: 4px; height: 18px; white-space: nowrap; }
+.message-item.message-unread .summary .text { color: rgb(96, 159, 196); font-weight: 700; }
+.message-item .time { float: right; width: 60px; height: 18px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; color: rgb(102, 102, 102); }
+.message-item.message-unread .time { font-weight: 700; color: rgb(96, 159, 196); }
+.message-content .time, .message-item.message-unread .message-content .time { font-weight: 400; }
+.message-item .attachment { color: rgb(153, 153, 153); font-size: 18px; vertical-align: middle; float: right; margin: 0px 12px; position: relative; }
+.message-item.message-unread .attachment { color: rgb(79, 153, 198); }
+.message-star { vertical-align: middle; margin: 2px 4px 0px 6px; font-size: 15px; cursor: pointer; }
+.message-star:hover { color: rgb(254, 185, 2) !important; text-decoration: none; }
+.mail-tag:empty { display: inline-block; width: 8px; height: 11px; padding: 0px; line-height: normal; vertical-align: middle; margin: 0px 1px 0px 0px; }
+.badge.mail-tag { border-radius: 2px; }
+.dropdown-menu > li > a > .mail-tag { vertical-align: inherit; }
+@media only screen and (max-width: 991px) {
+ .message-item .summary { min-width: 0px; }
+ .message-item .sender { width: 100px; }
+}
+@media only screen and (max-width: 550px) {
+ .message-item .summary { margin: 8px 0px 0px 32px; max-width: 95%; min-width: 0px; display: block; }
+ .message-item .sender { width: auto; max-width: 150px; }
+ .message-item .summary .text { max-width: 95%; }
+}
+.btn-message, .btn-message:active, .btn-message:focus, .btn-message:hover, .open .btn-message.dropdown-toggle { background-color: rgb(255, 255, 255) !important; border: 1px solid rgb(148, 185, 206) !important; color: rgb(124, 163, 186) !important; text-shadow: none !important; }
+.message-content { padding: 16px 12px; border-width: 0px 1px 1px; border-style: solid; border-color: rgb(233, 233, 233); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.02); background-color: rgba(255, 255, 255, 0.8); }
+.message-item .message-content { margin-top: 16px; border-top-width: 1px; }
+.message-body { padding: 0px 9px; color: rgb(106, 113, 119); }
+.message-navbar { line-height: 24px; padding: 10px 12px; border-width: 1px; border-style: solid; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-color: rgb(214, 225, 234) transparent; background-color: rgb(241, 245, 250); text-align: center; position: relative; }
+.message-content .dropdown-toggle, .message-navbar .dropdown-toggle { color: rgb(119, 119, 119); }
+.message-content .dropdown-toggle:focus, .message-content .dropdown-toggle:hover, .message-navbar .dropdown-toggle:focus, .message-navbar .dropdown-toggle:hover { text-decoration: none; color: rgb(34, 131, 197); }
+.message-bar { display: inline-block; min-height: 28px; }
+@media only screen and (max-width: 480px) {
+ .message-bar { display: block; min-height: 60px; }
+}
+.message-footer { background-color: rgb(241, 241, 241); padding: 12px 16px; border-style: solid; border-color: rgb(228, 233, 238) rgb(230, 230, 230) rgb(230, 230, 230); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 0px; }
+.message-footer .pagination { margin: 0px; }
+.message-footer .pagination > li { margin: 0px; padding: 0px; }
+.message-footer .pagination > li > a, .message-footer .pagination > li > span { color: rgb(119, 119, 119); padding: 3px 6px; margin-left: 1px; margin-right: 1px; background-color: transparent; border: 1px solid transparent; }
+.message-footer .pagination > li.disabled > span { color: rgb(187, 187, 187); cursor: default; background-color: transparent; border-color: transparent; }
+.message-footer .pagination > li > a:hover { border-color: rgb(145, 186, 214); color: rgb(34, 131, 197); text-decoration: none; background-color: rgb(255, 255, 255); }
+.message-footer input[type="text"] { font-size: 12px; width: 34px; height: 24px; line-height: 20px; margin-bottom: 0px; padding: 3px; vertical-align: middle; text-align: center; }
+.message-footer-style2 .pagination > li > a, .message-footer-style2 .pagination > li > span { border: 1px solid rgb(181, 181, 181); border-radius: 100% !important; width: 26px; height: 26px; line-height: 26px; display: inline-block; text-align: center; padding: 0px; }
+.message-content .sender, .message-content .time { width: auto; text-overflow: inherit; vertical-align: middle; }
+.message-footer-style2 .pagination > li.disabled > span, .message-footer-style2 .pagination > li > span { border-color: rgb(204, 204, 204); }
+.message-footer-style2 .pagination > li > a:hover { border-color: rgb(132, 175, 201); background-color: rgb(247, 247, 247); }
+.message-item.message-inline-open { background-color: rgb(242, 246, 249); border-width: 1px; border-style: solid; border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(204, 204, 204); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; }
+.message-item.message-inline-open:first-child { border-top-color: rgb(238, 238, 238); }
+.message-item.message-inline-open:last-child { border-bottom-color: rgb(221, 221, 221); }
+.message-item.message-inline-open + .message-item { border-bottom-color: transparent; }
+.message-loading-overlay { position: absolute; z-index: 14; top: 0px; bottom: 0px; right: 0px; left: 0px; background-color: rgba(255, 255, 255, 0.5); text-align: center; }
+.message-loading-overlay > .ace-icon { position: absolute; top: 15%; left: 0px; right: 0px; text-align: center; }
+.message-content .sender { color: rgb(106, 156, 186); font-weight: 700; margin: 0px; }
+.dataTables_filter label, .dataTables_length label { font-weight: 400; }
+.message-content .time { white-space: normal; float: none; }
+ul.attachment-list { margin: 6px 0px 4px 8px; }
+ul.attachment-list > li { margin-bottom: 3px; }
+.message-attachment { padding-left: 10px; padding-right: 10px; }
+.attached-file { color: rgb(119, 119, 119); width: 200px; display: inline-block; }
+.attached-file > .ace-icon { display: inline-block; width: 16px; margin-right: 2px; vertical-align: middle; }
+.attached-file:hover { text-decoration: none; color: rgb(67, 142, 185); }
+.attached-file:hover .attached-name { color: rgb(34, 131, 197); }
+.attached-file .attached-name { display: inline-block; max-width: 175px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; vertical-align: middle; }
+.messagebar-item-left, .messagebar-item-right { position: absolute; bottom: 14px; left: 12px; text-align: left; }
+.messagebar-item-right { right: 12px; left: auto; }
+.message-navbar .nav-search { right: auto; left: 5px; top: auto; bottom: 11px; }
+.message-navbar .messagebar-item-left ~ .nav-search { left: 60px; }
+.message-form { border-width: medium 1px 1px; border-style: none solid solid; border-color: currentcolor rgb(221, 221, 221) rgb(221, 221, 221); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; padding-top: 22px; }
+.message-form .form-actions { margin-bottom: 0px; }
+.message-form .wysiwyg-editor { overflow: auto; min-height: 150px; max-height: 250px; height: auto; }
+.btn-send-message { position: relative; top: 6px; vertical-align: middle; }
+.btn-back-message-list { color: rgb(119, 119, 119); }
+.btn-back-message-list:hover { color: rgb(71, 143, 202); text-decoration: none; }
+.message-condensed .message-item { padding-top: 8px; padding-bottom: 9px; }
+.message-condensed .message-footer, .message-condensed .message-navbar { padding-top: 7px; padding-bottom: 7px; }
+.message-condensed .messagebar-item-left, .message-condensed .messagebar-item-right { bottom: 9px; }
+.message-condensed .message-navbar .nav-search { bottom: 7px; }
+@media only screen and (max-width: 480px) {
+ .message-form { padding-left: 16px; padding-right: 16px; }
+ .message-condensed .message-bar { min-height: 42px; }
+}
+.inbox-folders .btn-block { margin-top: 0px; }
+@media only screen and (max-width: 767px) {
+ .inbox-folders.inbox-folders-responsive .btn-block { width: 24%; }
+}
+@media only screen and (max-width: 600px) {
+ .inbox-folders.inbox-folders-responsive .btn-block { width: 48%; }
+}
+@media only screen and (max-width: 320px) {
+ .inbox-folders.inbox-folders-responsive .btn-block { width: 99%; }
+}
+.inbox-folders .btn-lighter, .inbox-folders .btn-lighter.active { background-color: rgb(244, 244, 244) !important; text-shadow: none !important; color: rgb(124, 131, 149) !important; border: 1px solid rgb(255, 255, 255) !important; padding: 5px 11px; }
+.inbox-folders .btn-lighter.active { background-color: rgb(237, 242, 248) !important; color: rgb(83, 97, 124) !important; }
+.inbox-folders .btn-lighter:hover { background-color: rgb(239, 239, 239) !important; color: rgb(96, 146, 196) !important; }
+.inbox-folders .btn > .ace-icon:first-child { display: inline-block; width: 14px; text-align: left; }
+.inbox-folders .btn-lighter + .btn-lighter { border-top-width: 0px !important; }
+.inbox-folders .btn.active::before { display: block; content: ""; position: absolute; top: 1px; bottom: 1px; left: -1px; border-left: 3px solid rgb(79, 153, 198); }
+.inbox-folders .btn.active::after { display: none; }
+.inbox-folders .btn .counter { border-radius: 3px; position: absolute; right: 8px; top: 8px; padding-left: 6px; padding-right: 6px; opacity: 0.75; }
+.inbox-folders .btn:hover .badge { opacity: 1; }
+.timeline-container { position: relative; padding-top: 4px; margin-bottom: 32px; }
+.timeline-container:last-child { margin-bottom: 0px; }
+.timeline-container::before { content: ""; display: block; position: absolute; left: 28px; top: 0px; bottom: 0px; border-style: solid; border-color: rgb(226, 227, 231); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; background-color: rgb(231, 234, 239); width: 4px; border-width: 0px 1px; }
+.timeline-container:first-child::before { border-top-width: 1px; }
+.timeline-container:last-child::before { border-bottom-width: 1px; }
+.timeline-item { position: relative; margin-bottom: 8px; }
+.timeline-item .widget-box { background-color: rgb(242, 246, 249); color: rgb(89, 92, 102); }
+.timeline-item .transparent.widget-box { border-left: 3px solid rgb(218, 225, 229); }
+.timeline-item .transparent .widget-header { background-color: rgb(236, 241, 244); border-bottom-width: 0px; }
+.timeline-item .transparent .widget-header > .widget-title { margin-left: 8px; }
+.timeline-item:nth-child(2n) .widget-box { background-color: rgb(243, 243, 243); color: rgb(97, 97, 97); }
+.timeline-item:nth-child(2n) .widget-box.transparent { border-left-color: rgb(219, 219, 219) !important; }
+.timeline-item:nth-child(2n) .widget-box.transparent .widget-header { background-color: rgb(238, 238, 238) !important; }
+.timeline-item .widget-box { margin: 0px 0px 0px 60px; position: relative; max-width: none; }
+.timeline-item .widget-main { margin: 0px; position: relative; max-width: none; border-bottom-width: 0px; }
+.timeline-item .widget-body { background-color: transparent; }
+.timeline-item .widget-toolbox { padding: 4px 8px 0px !important; background-color: transparent !important; border-width: 0px !important; margin: 0px !important; }
+.timeline-info { float: left; width: 60px; text-align: center; position: relative; }
+.timeline-info img { border-radius: 100%; max-width: 42px; }
+.timeline-info .badge, .timeline-info .label { font-size: 12px; }
+.timeline-container:not(.timeline-style2) .timeline-indicator { opacity: 1; border-radius: 100%; display: inline-block; font-size: 16px; height: 36px; line-height: 30px; width: 36px; text-align: center; text-shadow: none !important; padding: 0px; cursor: default; border: 3px solid rgb(255, 255, 255) !important; }
+.timeline-label { display: block; clear: both; margin: 0px 0px 18px 34px; }
+.timeline-item img { border: 1px solid rgb(170, 170, 170); padding: 2px; background-color: rgb(255, 255, 255); }
+.timeline-style2::before { display: none; }
+.timeline-style2 .timeline-item { padding-bottom: 22px; margin-bottom: 0px; }
+.timeline-style2 .timeline-item:last-child { padding-bottom: 0px; }
+.timeline-style2 .timeline-item::before { content: ""; display: block; position: absolute; left: 90px; top: 5px; bottom: -5px; border-width: 0px; background-color: rgb(221, 221, 221); width: 2px; max-width: 2px; }
+.timeline-style2 .timeline-item:last-child::before { display: none; }
+.timeline-style2 .timeline-item:first-child::before { display: block; }
+.timeline-style2 .timeline-item .transparent .widget-header { background-color: transparent !important; }
+.timeline-style2 .timeline-item .transparent.widget-box { background-color: transparent !important; border-left: medium none !important; }
+.timeline-style2 .timeline-info { width: 100px; }
+.timeline-style2 .timeline-indicator { font-size: 0px; height: 12px; line-height: 12px; width: 12px; border-width: 1px !important; background-color: rgb(255, 255, 255) !important; position: absolute; left: 85px; top: 3px; opacity: 1; border-radius: 100%; display: inline-block; padding: 0px; }
+.timeline-style2 .timeline-date { display: inline-block; width: 72px; text-align: right; margin-right: 25px; color: rgb(119, 119, 119); }
+.timeline-style2 .timeline-item .widget-box { margin-left: 112px; }
+.timeline-style2 .timeline-label { width: 75px; margin-left: 0px; margin-bottom: 10px; text-align: right; color: rgb(102, 102, 102); font-size: 14px; }
+.timeline-time { text-align: center; position: static; }
+.dataTables_filter, .dataTables_paginate { text-align: right; }
+.well.search-area { background-color: rgb(236, 241, 244); border-color: rgb(214, 225, 234); box-shadow: none; }
+.search-thumbnail { transition-duration: 0.1s; }
+.search-thumbnail:hover { border-color: rgb(117, 168, 206); }
+.search-thumbnail .search-title { margin-top: 15px; }
+.search-media { border: 1px solid rgb(221, 221, 221); margin-top: -1px; padding: 12px 150px 12px 12px; transition: border 0.1s ease-in-out 0s; position: relative; }
+.search-media:hover { border-color: rgb(117, 168, 206); z-index: 1; }
+.search-media .search-actions { position: absolute; right: 0px; top: 0px; bottom: 0px; height: 100%; width: 20%; min-width: 100px; max-width: 150px; padding: 6px 9px; }
+.search-media .search-actions::before { content: ""; display: block; position: absolute; left: 0px; top: 8px; bottom: 16px; width: 1px; background-image: linear-gradient(to bottom, rgb(255, 255, 255) 0px, rgb(221, 221, 221) 100%); background-repeat: repeat-x; }
+.search-media:hover .search-actions { background-color: rgb(240, 244, 247); }
+.search-media.disabled:hover .search-actions { background-color: rgb(246, 246, 246); }
+.search-media:hover:not(.disabled) .search-actions::before { background-image: linear-gradient(to bottom, rgb(255, 255, 255) 0px, rgb(132, 190, 229) 100%); background-repeat: repeat-x; }
+.search-filter-header { padding: 8px; margin: -4px; }
+.search-btn-action { position: absolute; bottom: -5px; left: 0px; right: 0px; width: auto; transition: bottom 0.15s ease 0s; }
+.search-media:hover .search-btn-action { bottom: 1px; }
+.search-promotion.label { position: absolute; margin-top: -1px; margin-left: -1px; }
+.search-filter-element { padding: 12px; background-color: rgb(255, 255, 255); border: 1px solid rgb(201, 221, 231); }
+.search-results { padding: 24px 12px; min-height: 20px; }
+.search-result { margin-top: -1px; position: relative; padding: 12px; border-width: 1px; border-style: dotted; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-color: rgba(0, 0, 0, 0.11) transparent transparent; }
+.search-result:hover { background-color: rgb(247, 247, 247); border-color: rgb(214, 225, 234); border-style: solid; z-index: 1; }
+.search-result:first-child { border-top-color: transparent; }
+.search-result:first-child:hover { border-top-color: rgb(214, 225, 234); }
+.search-result .search-title { font-size: 16px; margin-top: 0px; margin-bottom: 6px; }
+.search-result .search-content { margin-top: 2px; }
+.dataTables_length select { width: 70px; height: 25px; padding: 2px 3px; }
+.dataTables_filter input[type="search"], .dataTables_filter input[type="text"] { width: 125px; height: 18px; line-height: 18px; box-sizing: content-box; padding: 4px 6px; }
+.dataTables_info { font-size: 14px; }
+.dataTables_paginate .pagination { margin: 0px 12px; }
+.dataTables_wrapper label { display: inline-block; font-size: 13px; }
+.dataTables_wrapper input[type="search"], .dataTables_wrapper input[type="text"], .dataTables_wrapper select { margin-bottom: 0px !important; margin-top: 0px; margin-right: 4px; margin-left: 4px; }
+div.dataTables_scrollBody table, div.dataTables_scrollFoot table { margin-top: 0px !important; border-top: medium none; }
+.dataTables_wrapper .row { margin: 0px !important; }
+.dataTables_wrapper .row:first-child { padding-top: 12px; padding-bottom: 12px; background-color: rgb(239, 243, 248); }
+.dataTables_wrapper .row:first-child + .dataTable { border-top: 1px solid rgb(221, 221, 221); border-bottom: 1px solid rgb(221, 221, 221); }
+.dataTables_wrapper .row:last-child { border-bottom: 1px solid rgb(224, 224, 224); padding-top: 12px; padding-bottom: 12px; background-color: rgb(239, 243, 248); }
+.dataTables_wrapper .dataTables_scroll + .row { border-top: 1px solid rgb(224, 224, 224); }
+.dataTable { margin-bottom: 0px; }
+.dataTable > thead > tr > th[class*="sort"] { cursor: pointer; }
+.dataTable > thead > tr > th[class*="sort"]::after { float: right; display: inline; content: ""; font-family: FontAwesome; font-size: 13px; font-weight: 400; color: rgb(85, 85, 85); }
+.dataTable > thead > tr > th.sorting_disabled::after, .dataTables_scrollHead + .dataTables_scrollBody > .dataTable > thead > tr > th::after, .fc-state-default .fc-button-effect { display: none; }
+.dataTable > thead > tr > th[class*="sort"]:hover { color: rgb(84, 126, 168); }
+.dataTable > thead > tr > th[class*="sorting_"] { color: rgb(48, 126, 204); }
+.dataTable > thead > tr > th.sorting_asc, .dataTable > thead > tr > th.sorting_desc { background-image: linear-gradient(to bottom, rgb(239, 243, 248) 0px, rgb(227, 231, 237) 100%); background-repeat: repeat-x; }
+.dataTable > thead > tr > th.sorting_desc::after { content: ""; top: -6px; color: rgb(48, 126, 204); }
+.dataTable > thead > tr > th.sorting_asc::after { content: ""; top: 4px; color: rgb(48, 126, 204); }
+.dataTable > thead > tr > th.sorting_disabled { cursor: inherit; }
+.dataTables_scrollHeadInner { width: auto !important; }
+.dataTables_scrollHeadInner > .dataTable > thead > tr > th { border-bottom-width: 0px !important; }
+.dataTables_borderWrap .dataTables_scrollBody, .dataTables_borderWrap .dataTables_scrollHead { border-style: solid !important; border-color: rgb(221, 221, 221) !important; -moz-border-top-colors: none !important; -moz-border-right-colors: none !important; -moz-border-bottom-colors: none !important; -moz-border-left-colors: none !important; border-image: none !important; border-width: 0px 1px !important; }
+.dataTables_borderWrap .dataTables_scrollBody .table-bordered, .dataTables_borderWrap .dataTables_scrollHead .table-bordered { border-left-width: 0px; border-right-width: 0px; }
+.dataTables_borderWrap .dataTables_scrollBody .table-bordered > tbody > tr > td:first-child, .dataTables_borderWrap .dataTables_scrollBody .table-bordered > thead > tr > th:first-child, .dataTables_borderWrap .dataTables_scrollHead .table-bordered > tbody > tr > td:first-child, .dataTables_borderWrap .dataTables_scrollHead .table-bordered > thead > tr > th:first-child { border-left-width: 0px; }
+.dataTables_borderWrap .dataTables_scrollBody .table-bordered > tbody > tr > td:last-child, .dataTables_borderWrap .dataTables_scrollBody .table-bordered > thead > tr > th:last-child, .dataTables_borderWrap .dataTables_scrollHead .table-bordered > tbody > tr > td:last-child, .dataTables_borderWrap .dataTables_scrollHead .table-bordered > thead > tr > th:last-child { border-right-width: 0px; }
+table.dataTable { clear: both; max-width: none !important; }
+table.dataTable th:active { outline: 0px none; }
+div.dataTables_scrollHead table { margin-bottom: 0px !important; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; }
+div.dataTables_scrollHead table thead tr:last-child td:first-child, div.dataTables_scrollHead table thead tr:last-child th:first-child { border-bottom-left-radius: 0px !important; border-bottom-right-radius: 0px !important; }
+div.dataTables_scrollBody table { margin-bottom: 0px !important; }
+div.dataTables_scrollBody tbody tr:first-child td, div.dataTables_scrollBody tbody tr:first-child th { border-top: medium none; }
+.tableTools-container { margin-bottom: 8px; position: relative; }
+.gritter-item-wrapper.dt-button-info { padding: 12px 11px 8px; z-index: 1999; }
+.gritter-item-wrapper.dt-button-info > h2 { margin-top: 0px; }
+.dt-button-collection .dropdown-menu { display: block; z-index: 1101; }
+.dt-button-collection .dropdown-menu > li > a { color: rgb(136, 136, 136); text-decoration: line-through; }
+.dt-button-collection .dropdown-menu > li > a.active { color: rgb(51, 51, 51); text-decoration: none; }
+div.dt-button-background { position: fixed; top: 0px; left: 0px; height: 100%; width: 100%; background-color: rgb(0, 0, 0); z-index: 1100; opacity: 0.1; }
+.dataTable > tbody > tr.selected > td { background-color: rgb(223, 240, 216); }
+.dataTable > tbody > tr.selected:hover > td { background-color: rgb(208, 233, 198); }
+div.dataTables_processing { position: absolute; top: 50%; left: 50%; width: 80%; height: 60px; margin-left: -40%; margin-top: -25px; padding-top: 20px; padding-bottom: 20px; text-align: center; font-size: 1.2em; border: 2px solid rgb(221, 221, 221); background-color: rgba(255, 255, 255, 0.66); }
+.fc-toolbar h2 { font-size: 22px; color: rgb(101, 160, 206); }
+.fc-unthemed .fc-popover, .fc-unthemed .fc-row, .fc-unthemed hr, .fc-unthemed tbody, .fc-unthemed td, .fc-unthemed th, .fc-unthemed thead { border-color: rgb(188, 212, 229); }
+.fc-unthemed .fc-today { background: rgb(255, 255, 204) none repeat scroll 0% 0%; }
+.fc-event { border-width: 0px; color: rgb(255, 255, 255); padding: 1px 1px 2px 2px; border-radius: 0px; }
+.fc-event:not([class*="label-"]) { background-color: rgb(171, 186, 195); }
+.fc-event.label-yellow { color: rgb(153, 102, 51); }
+.fc-event.label-light { color: rgb(136, 136, 136); }
+.label-yellow .fc-event { color: rgb(153, 102, 51); }
+.label-light .fc-event { color: rgb(136, 136, 136); }
+[class*="label-"] > .fc-event, [class*="label-"] > .fc-event > .fc-event-skin.fc-event-head { background-color: inherit; }
+.fc-event-vert > .fc-event, .fc-event.fc-event-vert { padding: 0px 0px 1px; }
+.fc-day-number { color: rgb(46, 101, 137); opacity: 1; }
+.fc .fc-axis, .fc-widget-header { background: rgb(236, 242, 247) none repeat scroll 0% 0%; color: rgb(128, 144, 160); }
+.fc-event-hori, .fc-event-vert { border-radius: 0px !important; border-color: transparent; }
+.fc-event-vert .fc-event-content { padding-left: 1px; padding-right: 1px; }
+.fc-event-vert .fc-event-time { padding: 0px; }
+.fc-state-default { border: medium none; }
+.fc-state-default, .fc-state-default .fc-button-inner { border: medium none; background-color: rgb(171, 186, 195); color: rgb(255, 255, 255); background-image: none; box-shadow: none; text-shadow: none; border-radius: 0px !important; margin-left: 2px; }
+.fc-state-disabled, .fc-state-disabled .fc-button-inner { opacity: 0.75; color: rgb(221, 221, 221); }
+.fc-state-active, .fc-state-active .fc-button-inner { border-color: rgb(79, 153, 198); background-color: rgb(111, 179, 224); }
+.fc-state-hover, .fc-state-hover .fc-button-inner { background-color: rgb(139, 154, 163); }
+.fc .fc-button-group > * { margin: 0px 1px 0px 0px; }
+.external-event { margin: 6px 0px; padding: 0px; cursor: default; display: block; font-size: 13px; line-height: 28px; color: rgb(255, 255, 255); }
+.external-event:not([class*="label-"]) { background-color: rgb(171, 186, 195); }
+.external-event:hover { opacity: 1; }
+.external-event.ui-draggable-dragging { cursor: move; }
+.external-event.label-yellow { color: rgb(153, 102, 51); }
+.external-event.label-light { color: rgb(136, 136, 136); }
+.external-event > .ace-icon:first-child { display: inline-block; height: 32px; width: 32px; text-align: center; line-height: 30px; margin-right: 5px; font-size: 15px; border-right: 1px solid rgb(255, 255, 255); }
+@media only screen and (max-width: 480px) {
+ .fc-header td { display: block; width: auto; text-align: left; }
+}
+.chosen-container, .chosen-container + .help-inline, [class*="chosen-container"] { vertical-align: middle; }
+.select2-container-multi.tag-input-style .select2-choices .select2-search-choice, .select2.tag-input-style .select2-selection .select2-selection__choice, .tag-input-style + .chosen-container-multi .chosen-choices li.search-choice { font-weight: 400; text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.15); transition: all 0.2s ease 0s; vertical-align: baseline; white-space: nowrap; }
+.chosen-container > .chosen-single, [class*="chosen-container"] > .chosen-single { line-height: 28px; height: 32px; box-shadow: none; background: rgb(250, 250, 250) none repeat scroll 0% 0%; }
+.chosen-choices { box-shadow: none !important; }
+.chosen-container-single .chosen-single abbr { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; }
+.chosen-container-single .chosen-single abbr::after { content: ""; display: inline-block; color: rgb(136, 136, 136); font-family: FontAwesome; font-size: 13px; position: absolute; right: 0px; top: -7px; }
+.chosen-container-single .chosen-single abbr:hover::after, .chosen-container-single.chosen-disabled .chosen-single abbr:hover::after { color: rgb(70, 70, 70); }
+.chosen-single div b { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; }
+.chosen-container .chosen-results-scroll-down span, .chosen-container .chosen-results-scroll-up span, .chosen-container-multi .chosen-choices li.search-choice .search-choice-close, .chosen-rtl .chosen-search input[type="text"] { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; }
+.chosen-single div b::before { content: ""; display: inline-block; color: rgb(136, 136, 136); font-family: FontAwesome; font-size: 12px; position: relative; top: -1px; left: 1px; }
+.chosen-container-active.chosen-with-drop .chosen-single div b::before { content: ""; }
+.chosen-container-single .chosen-search { position: relative; }
+.chosen-container-single .chosen-search input[type="text"] { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; border-radius: 0px; line-height: 28px; height: 28px; }
+.chosen-container-single .chosen-search::after { content: ""; display: inline-block; color: rgb(136, 136, 136); font-family: FontAwesome; font-size: 14px; position: absolute; top: 8px; right: 12px; }
+.chosen-container-multi .chosen-choices li.search-field input[type="text"] { height: 25px; }
+.chosen-container-multi .chosen-choices li.search-choice { line-height: 16px; padding-bottom: 4px; }
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close::before { content: ""; display: inline-block; color: rgb(136, 136, 136); font-family: FontAwesome; font-size: 13px; position: absolute; right: 2px; top: -1px; }
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { text-decoration: none; }
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover::before, .chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close::before { color: rgb(70, 70, 70); }
+.chosen-container .chosen-results-scroll-down span::before, .chosen-container .chosen-results-scroll-up span::before { content: ""; display: inline-block; color: rgb(136, 136, 136); font-family: FontAwesome; font-size: 12px; position: relative; top: -1px; left: 1px; }
+.chosen-container .chosen-results-scroll-up span::before, .chosen-container-active .chosen-single-with-drop div b::before { content: ""; }
+.chosen-rtl .chosen-search::after { content: ""; display: none; }
+.chosen-rtl .chosen-search::before, .select2-search::before { content: ""; font-family: FontAwesome; }
+.chosen-rtl .chosen-search::before { display: inline-block; color: rgb(136, 136, 136); font-size: 14px; position: absolute; top: 9px; left: 12px; }
+.chosen-container-single .chosen-single { border-radius: 0px; }
+.chosen-container .chosen-results li.highlighted { background: rgb(49, 106, 197) none repeat scroll 0% 0%; color: rgb(255, 255, 255); }
+.chosen-container-single .chosen-drop { border-radius: 0px; border-bottom: 3px solid rgb(68, 146, 201); border-color: rgb(68, 146, 201); }
+.chosen-container-active .chosen-single, .chosen-single.chosen-single-with-drop { border-color: rgb(68, 146, 201); }
+.form-group.has-error .chosen-single { border-color: rgb(242, 166, 150) !important; }
+.form-group.has-info .chosen-single { border-color: rgb(114, 174, 194) !important; }
+.form-group.has-warning .chosen-single { border-color: rgb(227, 201, 76) !important; }
+.form-group.has-success .chosen-single { border-color: rgb(156, 197, 115) !important; }
+.chosen-container-active.chosen-with-drop .chosen-single { border-color: rgb(68, 146, 201); }
+.chosen-container.chosen-with-drop .chosen-drop { left: auto; right: auto; display: block; }
+@media not all, only screen and (min-resolution: 144dpi) {
+ .chosen-container .chosen-results-scroll-down span, .chosen-container .chosen-results-scroll-up span, .chosen-container-multi .chosen-choices li.search-choice .search-choice-close, .chosen-container-single .chosen-search input[type="text"], .chosen-container-single .chosen-single abbr, .chosen-container-single .chosen-single div b, .chosen-rtl .chosen-search input[type="text"] { background-image: none !important; background-repeat: no-repeat !important; background-size: auto auto !important; }
+}
+.tag-input-style + .chosen-container-multi .chosen-choices li.search-choice { background-image: none; background-color: rgb(145, 184, 208); color: rgb(255, 255, 255); display: inline-block; font-size: 13px; margin-bottom: 3px; margin-right: 3px; padding: 6px 22px 7px 9px; position: relative; border: medium none; box-shadow: none; border-radius: 0px; }
+.tag-input-style + .chosen-container-multi .chosen-choices li.search-choice .search-choice-close { position: absolute; top: 0px; bottom: 0px; right: 0px; width: 18px; height: auto; line-height: 25px; text-align: center; }
+.tag-input-style + .chosen-container-multi .chosen-choices li.search-choice .search-choice-close::before { color: rgb(255, 255, 255); position: static; font-size: 11px; }
+.tag-input-style + .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { background-color: rgba(0, 0, 0, 0.2); }
+.tag-input-style + .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover::before { color: rgb(255, 255, 255); }
+.tag-input-style + .chosen-container-multi.chosen-rtl .chosen-choices li.search-choice { padding: 6px 9px 7px 22px; margin-left: 0px; margin-right: 3px !important; }
+.tag-input-style + .chosen-container-multi.chosen-rtl .chosen-choices li.search-choice .search-choice-close { right: auto; left: 0px; }
+.select2-container--default .select2-selection { border-radius: 0px; line-height: 24px; border-color: rgb(170, 170, 170); }
+.select2-container--default.select2-container--focus .select2-selection { border-color: rgb(68, 146, 201); }
+.select2-container--open .select2-dropdown { border-radius: 0px; border-color: rgb(68, 146, 201); box-shadow: 0px -4px 5px rgba(0, 0, 0, 0.15); }
+.select2-container--default .select2-selection .select2-selection__clear { position: absolute; right: -32px; font-size: 16px; }
+.select2-container .select2-selection--single { height: 32px; }
+.select2-container--default .select2-selection .select2-selection__choice__remove { font-size: 15px; margin-right: 3px; }
+.select2-container--default .select2-results__option[aria-selected="true"] { background-color: rgb(228, 238, 245); }
+.select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: rgb(79, 153, 198); }
+.select2-search { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; }
+.select2-search::before { font-size: 12px; display: inline; color: rgb(136, 136, 136); position: absolute; right: 12px; top: 8px; }
+.select2-search:hover::before { color: rgb(85, 85, 85); }
+.select2-selection--multiple .select2-search::before { display: none; }
+.form-group.has-error .select2-container--default .select2-selection { border-color: rgb(242, 166, 150) !important; }
+.form-group.has-info .select2-container--default .select2-selection { border-color: rgb(114, 174, 194) !important; }
+.form-group.has-warning .select2-container--default .select2-selection { border-color: rgb(227, 201, 76) !important; }
+.form-group.has-success .select2-container--default .select2-selection { border-color: rgb(156, 197, 115) !important; }
+.select2.tag-input-style .select2-selection .select2-selection__choice { background-color: rgb(145, 184, 208); color: rgb(255, 255, 255); display: inline-block; font-size: 13px; margin-bottom: 2px; margin-right: 2px; padding: 6px 22px 7px 9px; position: relative; border: medium none; box-shadow: none; border-radius: 0px; }
+.select2-container.select2-drop-above .select2-choice, .select2-drop { border-radius: 0px; }
+.select2.tag-input-style .select2-selection .select2-selection__choice .select2-selection__choice__remove { position: absolute; top: 0px; bottom: 0px; right: -2px; left: auto; width: 18px; height: auto; line-height: 36px; text-align: center; color: rgb(255, 255, 255); }
+.select2.tag-input-style .select2-selection .select2-selection__choice .select2-selection__choice__remove:hover { background-color: rgba(0, 0, 0, 0.2); color: rgb(255, 255, 255); }
+.select2-container .select2-choice { border-radius: 0px; height: 32px; line-height: 28px; }
+.select2-container[class*="input-"] { max-width: none; }
+.select2-container.input-mini { min-width: 100px; }
+.select2-container .select2-choice abbr, .select2-search-choice-close { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; }
+.select2-container .select2-choice abbr::before, .select2-search-choice-close::before { font-family: FontAwesome; font-size: 12px; display: inline; content: ""; color: rgb(136, 136, 136); position: relative; top: -1px; }
+.select2-container .select2-choice abbr:hover::before, .select2-search-choice-close:hover::before { color: rgb(85, 85, 85); }
+.select2-container .select2-choice abbr::before { top: -7px; }
+.select2-search-choice-close:hover { text-decoration: none !important; }
+.select2-result-single { margin-left: 0px; }
+.select2-drop { border-style: solid; border-color: rgb(68, 146, 201); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px 3px; }
+.select2-drop.select2-drop-above { border-radius: 0px; }
+.select2-container .select2-choice { background: rgb(250, 250, 250) none repeat scroll 0% 0%; }
+.select2-container-active .select2-choice, .select2-container-active .select2-choices, .select2-container-multi.select2-container-active .select2-choices, .select2-dropdown-open.select2-drop-above .select2-choice, .select2-dropdown-open.select2-drop-above .select2-choices { border-color: rgb(68, 146, 201); }
+.select2-results .select2-highlighted { background: rgb(49, 106, 197) none repeat scroll 0% 0%; }
+.select2-container .select2-choice .select2-arrow { border-radius: 0px; background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; border: medium none; }
+.select2-container .select2-choice .select2-arrow b { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; }
+.select2-container .select2-choice .select2-arrow b::before { font-family: FontAwesome; font-size: 12px; display: inline; content: ""; color: rgb(136, 136, 136); position: relative; left: 5px; }
+.select2-dropdown-open .select2-choice .select2-arrow b::before { content: ""; }
+.select2-search-field .select2-search .select2-input { background: rgb(255, 255, 255) none repeat scroll 0% 0%; margin-top: 4px; }
+.select2-search-field .select2-search::after { font-family: FontAwesome; font-size: 14px; display: inline; content: ""; color: rgb(119, 119, 119); position: relative; top: 0px; left: -20px; z-index: 0; }
+.select2-dropdown-open.select2-drop-above .select2-choice, .select2-dropdown-open.select2-drop-above .select2-choices { background-image: none; background-color: rgb(246, 246, 246); }
+.select2-container-multi .select2-choices .select2-search-field input { border: medium none !important; box-shadow: none !important; background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; font-size: 14px; }
+.select2-container-multi .select2-choices .select2-search-choice { line-height: 16px; padding-bottom: 4px; }
+.select2-container-active .select2-choice, .select2-container-active .select2-choices, .select2-container-multi.select2-container-active .select2-choices, .select2-dropdown-open.select2-drop-above .select2-choice, .select2-dropdown-open.select2-drop-above .select2-choices { box-shadow: none; }
+.select2-search-field .select2-search input.select2-active { background-color: rgb(255, 255, 255); position: relative; z-index: 1; }
+@media not all, only screen and (min-resolution: 144dpi) {
+ .select2-container .select2-choice abbr, .select2-container .select2-choice div b, .select2-search-choice-close, .select2-search-field .select2-search input { background-image: none !important; background-size: auto auto !important; }
+ .select2-search-field .select2-search input { }
+}
+.select2-container-active.select2-dropdown-open .select2-choice { background-image: linear-gradient(to bottom, rgb(238, 238, 238) 0px, rgb(255, 255, 255) 100%); background-repeat: repeat-x; }
+.select2-container-active.select2-drop-above .select2-choice, .ui-jqdialog .ui-widget-header { background-image: -moz-linear-gradient(center top , rgb(255, 255, 255) 0px, rgb(238, 238, 238) 100%); }
+.select2-container-active.select2-drop-above .select2-choice { background-image: linear-gradient(to bottom, rgb(255, 255, 255) 0px, rgb(238, 238, 238) 100%); background-repeat: repeat-x; }
+.form-group.has-error .select2-choice, .form-group.has-error .select2-choices { border-color: rgb(242, 166, 150) !important; }
+.form-group.has-info .select2-choice, .form-group.has-info .select2-choices { border-color: rgb(114, 174, 194) !important; }
+.form-group.has-warning .select2-choice, .form-group.has-warning .select2-choices { border-color: rgb(227, 201, 76) !important; }
+.form-group.has-success .select2-choice, .form-group.has-success .select2-choices { border-color: rgb(156, 197, 115) !important; }
+@media not all, only screen and (min-resolution: 144dpi) {
+ .select2-container .select2-choice .select2-arrow b, .select2-container .select2-choice abbr, .select2-search-choice-close, .select2-search-field .select2-search input { background-image: none !important; background-repeat: no-repeat !important; background-size: auto auto !important; }
+ .select2-search-field .select2-search input { }
+}
+.select2-container-multi.tag-input-style .select2-choices .select2-search-choice { background-image: none; background-color: rgb(145, 184, 208); color: rgb(255, 255, 255); display: inline-block; font-size: 13px; margin-bottom: 3px; margin-right: 0px; padding: 6px 22px 7px 9px; position: relative; border: medium none; box-shadow: none; border-radius: 0px; }
+.gritter-light .gritter-title, .gritter-title { text-shadow: none; }
+#cboxLoadingGraphic > .ace-icon, .ace-spinner.touch-spinner .spinbox-buttons > .btn > .ace-icon { vertical-align: middle; display: inline-block; }
+.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close { position: absolute; top: 0px; bottom: 0px; right: 0px; left: auto; width: 18px; height: auto; line-height: 25px; text-align: center; }
+.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close::before { color: rgb(255, 255, 255); position: static; font-size: 11px; }
+#cboxCurrent, #cboxTitle { margin-bottom: 4px; font-size: 14px; }
+.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close:hover { background-color: rgba(0, 0, 0, 0.2); }
+.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close:hover::before { color: rgb(255, 255, 255); }
+#colorbox:active, #colorbox:focus { outline: 0px none; }
+#cboxBottomCenter, #cboxBottomLeft, #cboxBottomRight, #cboxMiddleLeft, #cboxMiddleRight, #cboxTopCenter, #cboxTopLeft, #cboxTopRight { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; opacity: 0; }
+#cboxContent { border: 12px solid rgb(0, 0, 0); background-color: rgb(255, 255, 255); padding: 7px; overflow: visible; }
+#cboxOverlay { background: rgb(0, 0, 0) none repeat scroll 0% 0%; }
+#cboxCurrent { left: 64px; }
+#cboxTitle { color: rgb(119, 119, 119); }
+#cboxClose, #cboxNext, #cboxPrevious { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; text-indent: 0px; width: 26px; height: 26px; line-height: 22px; padding: 0px 4px; text-align: center; border: 2px solid rgb(153, 153, 153); border-radius: 16px; color: rgb(102, 102, 102); font-size: 12px; margin-left: 5px; margin-bottom: 5px; }
+#cboxNext:hover, #cboxPrevious:hover { color: rgb(51, 51, 51); border-color: rgb(102, 102, 102); }
+#cboxClose { background-color: rgb(0, 0, 0); border: 2px solid rgb(255, 255, 255); border-radius: 32px; color: rgb(255, 255, 255); font-size: 21px; height: 28px; width: 28px; padding-bottom: 2px; margin-left: 0px; right: -14px; top: -14px; }
+#cboxLoadingOverlay { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; }
+#cboxLoadingGraphic { background: rgb(255, 255, 255) none repeat scroll 0% 0% !important; text-align: center; }
+#cboxLoadingGraphic > .ace-icon { background-color: rgb(255, 255, 255); border-radius: 8px; width: 32px; height: 32px; position: relative; top: 48%; text-align: center; font-size: 24px; color: rgb(254, 126, 62); }
+.ace-spinner { display: inline-block; }
+.ace-spinner .spinbox-buttons.btn-group-vertical { min-width: 18px; }
+.ace-spinner .spinbox-buttons.btn-group-vertical > .btn { font-size: 10px; padding: 0px; width: 22px; height: 16px; line-height: 8px; margin-left: 0px; }
+.ace-spinner .spinbox-buttons.btn-group-vertical > .btn:first-child { margin-top: 0px; }
+.ace-spinner .spinbox-buttons.btn-group-vertical > .btn > .ace-icon { margin: 0px; padding: 0px; }
+.ace-spinner .spinbox-buttons.btn-group-vertical > .btn + .btn { margin-top: 2px; }
+.ace-spinner .spinbox-buttons.btn-group-vertical > .btn-xs { height: 14px; line-height: 7px; }
+.ace-spinner .spinbox-buttons.btn-group-vertical > .btn-lg { height: 22px; line-height: 10px; width: 22px; }
+.steps > li .step, .steps > li.complete .step::before { line-height: 30px; background-color: rgb(255, 255, 255); text-align: center; }
+.ace-spinner .spinbox-buttons > button.btn.spinbox-up:active { top: -1px; }
+.ace-spinner:not(.touch-spinner) .spinbox-buttons > .btn > .ace-icon { margin-top: -1px; }
+.ace-spinner.touch-spinner .spinbox-buttons { margin: 0px; font-size: 0px; }
+.ace-spinner.touch-spinner .spinbox-buttons .btn-sm { width: 32px; padding-left: 6px; padding-right: 6px; }
+.ace-spinner.touch-spinner .spinbox-buttons .btn-xs { width: 24px; padding-left: 4px; padding-right: 4px; }
+.ace-spinner.touch-spinner .spinbox-buttons .btn-lg { width: 40px; padding-left: 8px; padding-right: 8px; }
+.ace-spinner.touch-spinner .spinbox-buttons > .btn { margin: 0px 1px !important; }
+.ace-spinner.touch-spinner .spinbox-buttons > .btn-xs { padding-top: 3px; padding-bottom: 3px; }
+.steps { list-style: outside none none; display: table; width: 100%; padding: 0px; margin: 0px; position: relative; }
+.steps > li { display: table-cell; text-align: center; width: 1%; }
+.steps > li .step { border: 5px solid rgb(206, 209, 214); color: rgb(84, 100, 116); font-size: 15px; border-radius: 100%; position: relative; z-index: 2; display: inline-block; width: 40px; height: 40px; }
+.steps > li::before { display: block; content: ""; width: 100%; height: 1px; font-size: 0px; overflow: hidden; border-top: 4px solid rgb(206, 209, 214); position: relative; top: 21px; z-index: 1; }
+.steps > li.last-child::before { max-width: 50%; width: 50%; }
+.steps > li:last-child::before { max-width: 50%; width: 50%; }
+.steps > li:first-child::before { max-width: 51%; left: 50%; }
+.steps > li.active .step, .steps > li.active::before, .steps > li.complete .step, .steps > li.complete::before { border-color: rgb(82, 147, 196); }
+.steps > li.complete .step { cursor: default; color: rgb(255, 255, 255); transition: transform 0.1s ease 0s; }
+.steps > li.complete .step::before { display: block; position: absolute; top: 0px; left: 0px; bottom: 0px; right: 0px; border-radius: 100%; content: ""; z-index: 3; font-family: FontAwesome; font-size: 17px; color: rgb(135, 186, 33); }
+.step-content, .tree { position: relative; }
+.steps > li.complete:hover .step { transform: scale(1.1); border-color: rgb(128, 175, 212); }
+.steps > li.complete:hover::before { border-color: rgb(128, 175, 212); }
+.steps > li .title { display: block; margin-top: 4px; max-width: 100%; color: rgb(148, 158, 167); font-size: 14px; z-index: 104; text-align: center; table-layout: fixed; overflow-wrap: break-word; }
+.steps > li.active .title, .steps > li.complete .title { color: rgb(43, 61, 83); }
+.step-content .step-pane { display: none; min-height: 200px; padding: 4px 8px 12px; }
+.step-content .step-pane.active { display: block; }
+.wizard-actions { text-align: right; }
+@media only screen and (max-width: 767px) {
+ .steps li .step, .steps li::after, .steps li::before { border-width: 3px; }
+ .steps li .step { width: 30px; height: 30px; line-height: 24px; }
+ .steps li.complete .step::before { line-height: 24px; font-size: 13px; }
+ .steps li::before { top: 16px; }
+ .step-content .step-pane { padding: 4px 4px 6px; min-height: 150px; }
+}
+.tree { margin: auto; padding: 0px 0px 0px 9px; overflow-x: hidden; overflow-y: auto; }
+.tree::before { display: inline-block; content: ""; position: absolute; top: -20px; bottom: 16px; left: 0px; z-index: 1; border-style: dotted; border-color: rgb(103, 178, 221); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 0px 0px 1px; }
+.tree .tree { padding: 0px; overflow: visible; }
+.tree .tree::before { display: none; }
+.tree .tree-branch-name, .tree .tree-item-name { cursor: pointer; }
+.tree .icon-caret { vertical-align: baseline !important; }
+.tree .tree-branch { width: auto; min-height: 20px; cursor: pointer; }
+.tree .tree-branch .tree-branch-header { position: relative; height: 20px; line-height: 20px; }
+.tree .tree-branch .tree-branch-header:hover { background-color: rgba(98, 168, 209, 0.1); }
+.tree .tree-branch .icon-caret ~ .tree-branch-header { display: inline-block; width: calc(100% - 36px); }
+.tree .tree-branch.tree-selected > .tree-branch-header { background-color: rgba(98, 168, 209, 0.18); }
+.tree .tree-branch .tree-branch-header .tree-branch-name, .tree .tree-item .tree-item-name { display: inline; z-index: 2; }
+.tree .tree-branch .tree-branch-header > .tree-branch-name > .ace-icon:first-child, .tree .tree-item > .tree-item-name > .ace-icon:first-child { display: inline-block; position: relative; z-index: 2; top: -1px; }
+.tree .tree-branch > .tree-branch-header > .tree-branch-name > .tree-label { margin-left: 2px; }
+.tree .tree-branch > .tree-branch-header > .tree-branch-name > .ace-icon:first-child { margin: -2px 0px 0px -2px; }
+.tree .tree-branch:last-child::after { display: inline-block; content: ""; position: absolute; z-index: 1; top: 15px; bottom: 0px; left: -10px; border-left: 2px solid rgb(255, 255, 255); }
+.tree .tree-branch .tree-branch-children, .tree .tree-branch .tree-branch-children.tree { margin: 0px 0px 0px 23px; padding: 0px; position: relative; }
+.tree .tree-branch .tree-branch-children.tree::before, .tree .tree-branch .tree-branch-children::before { display: inline-block; content: ""; position: absolute; z-index: 1; top: -14px; bottom: 16px; left: -14px; border-style: dotted; border-color: rgb(103, 178, 221); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 0px 0px 1px; }
+.tree .tree-branch.tree-selected > .icon-caret ~ .tree-branch-header > .tree-branch-name > .tree-label { font-weight: 700; }
+.tree .tree-item { height: 20px; line-height: 20px; cursor: pointer; max-width: calc(100% - 20px); }
+.tree .tree-item:hover { background-color: rgba(98, 168, 209, 0.1); }
+.tree .tree-item.tree-selected, .tree .tree-item.tree-selected:hover { background-color: rgba(98, 168, 209, 0.16); }
+.tree .tree-item > .tree-item-name > .ace-icon:first-child { margin-right: 3px; }
+.tree .tree-item > .tree-item-name > .tree-label > .ace-icon:first-child { margin-left: 3px; margin-right: 3px; }
+.tree .tree-item > .ace-icon:first-child { margin-top: -1px; }
+.tree .tree-branch, .tree .tree-item { position: relative; list-style: outside none none; border-left: 1px solid rgb(255, 255, 255); margin: 1px 0px; }
+.tree .tree-branch::before, .tree .tree-item::before { display: inline-block; content: ""; position: absolute; top: 14px; left: -13px; width: 18px; height: 0px; border-top: 1px dotted rgb(103, 178, 221); z-index: 1; }
+.tree .tree-selected { color: rgb(99, 152, 176); }
+.tree .tree-branch .tree-branch-header { border-radius: 0px; }
+.tree .tree-branch .tree-branch-header, .tree .tree-item { padding: 5px; color: rgb(77, 104, 120); box-sizing: content-box; }
+.tree .tree-item > .tree-item-name > .ace-icon:first-child { color: rgb(249, 232, 206); width: 13px; height: 13px; line-height: 13px; font-size: 11px; text-align: center; border-radius: 3px; box-sizing: content-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(204, 204, 204); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05); }
+.tree .tree-selected > .tree-item-name > .ace-icon:first-child { background-color: rgb(249, 160, 33); border-color: rgb(249, 160, 33); color: rgb(255, 255, 255); }
+.tree .tree-minus.ace-icon:first-child, .tree .tree-plus.ace-icon:first-child { display: inline-block; font-style: normal; vertical-align: middle; height: 11px; width: 11px; box-sizing: content-box; text-align: center; border: 1px solid rgb(139, 174, 191); line-height: 10px; background-color: rgb(255, 255, 255); position: relative; z-index: 2; }
+.tree .tree-minus.ace-icon:first-child::before, .tree .tree-plus.ace-icon:first-child::before { content: ""; display: block; width: 7px; height: 0px; border-top: 1px solid rgb(77, 104, 120); position: absolute; top: 5px; left: 2px; }
+.tree .tree-plus.ace-icon:first-child::after { content: ""; display: block; height: 7px; width: 0px; border-left: 1px solid rgb(77, 104, 120); position: absolute; top: 2px; left: 5px; }
+.tree .tree-unselectable .tree-item > .tree-item-name > .tree-label > .ace-icon:first-child { color: rgb(80, 132, 160); width: 13px; height: 13px; line-height: 13px; font-size: 10px; text-align: center; border-radius: 0px; background-color: transparent; border: medium none; box-shadow: none; }
+.tree .ace-icon[class*="-down"] { transform: rotate(-45deg); }
+.tree .ace-icon[class*="-download"] { transform: none; }
+.tree .fa-spin { height: auto; }
+.tree .tree-loading { margin-left: 36px; }
+.tree img { display: inline; }
+.tree .icon-open { width: 16px; position: relative; z-index: 2; padding-left: 2px; }
+.tree .tree-branch .tree-leaf-head.ace-icon, .tree .tree-leaf .tree-branch-head.ace-icon { display: none; }
+.tree .tree-branch.tree-leaf .tree-leaf-head { display: inline-block; position: relative; z-index: 2; color: rgb(221, 221, 221); background-color: rgb(255, 255, 255); }
+.tree .tree-selected.tree-branch.tree-leaf .tree-leaf-head { color: rgb(254, 185, 2); }
+.tree-container { background-color: rgb(255, 255, 255); border-width: 1px; border-style: solid; border-color: rgb(221, 221, 221) rgb(221, 221, 221) rgb(221, 221, 221) rgb(103, 178, 221); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; display: block; padding: 0px; max-width: 200px; max-height: 250px; }
+.tree-container .tree::before { margin-left: -1px; }
+.gritter-item-wrapper { background-image: none !important; box-shadow: 0px 2px 10px rgba(50, 50, 50, 0.5); background-color: rgba(50, 50, 50, 0.92); background-repeat: repeat; background-attachment: scroll; background-clip: border-box; background-origin: padding-box; background-position: 0% 0%; background-size: auto auto; }
+.gritter-item-wrapper.gritter-info { background: rgba(49, 81, 133, 0.92) none repeat scroll 0% 0%; }
+.gritter-item-wrapper.gritter-error { background: rgba(153, 40, 18, 0.92) none repeat scroll 0% 0%; }
+.gritter-item-wrapper.gritter-success { background: rgba(89, 131, 75, 0.92) none repeat scroll 0% 0%; }
+.gritter-item-wrapper.gritter-warning { background: rgba(190, 112, 31, 0.92) none repeat scroll 0% 0%; }
+.gritter-item-wrapper.gritter-light { background: rgba(245, 245, 245, 0.95) none repeat scroll 0% 0%; border: 1px solid rgb(187, 187, 187); }
+.gritter-item-wrapper.gritter-light.gritter-info { background: rgba(232, 242, 255, 0.95) none repeat scroll 0% 0%; }
+.gritter-item-wrapper.gritter-light.gritter-info .gritter-item { color: rgb(74, 87, 125); }
+.gritter-item-wrapper.gritter-light.gritter-error { background: rgba(255, 235, 235, 0.95) none repeat scroll 0% 0%; }
+.gritter-item-wrapper.gritter-light.gritter-error .gritter-item { color: rgb(137, 74, 56); }
+.gritter-item-wrapper.gritter-light.gritter-success { background: rgba(239, 250, 227, 0.95) none repeat scroll 0% 0%; }
+.gritter-item-wrapper.gritter-light.gritter-success .gritter-item { color: rgb(65, 97, 49); }
+.gritter-item-wrapper.gritter-light.gritter-warning { background: rgba(252, 248, 227, 0.95) none repeat scroll 0% 0%; }
+.gritter-bottom, .gritter-close, .gritter-item, .gritter-top { background-image: none; }
+.gritter-item-wrapper.gritter-light.gritter-warning .gritter-item { color: rgb(148, 100, 70); }
+.gritter-item p { line-height: 1.8; }
+.gritter-close { left: auto; right: 4px; width: 18px; height: 18px; line-height: 17px; text-align: center; border: 2px solid transparent; border-radius: 16px; color: rgb(225, 123, 103); font-size: 0px; text-indent: 0px; }
+.gritter-close::before { font-family: FontAwesome; font-size: 16px; content: ""; }
+.gritter-info .gritter-close { color: orange; }
+.gritter-error .gritter-close, .gritter-success .gritter-close, .gritter-warning .gritter-close { color: rgb(255, 234, 7); }
+.gritter-close:hover { color: rgb(255, 255, 255) !important; text-decoration: none; }
+.gritter-light .gritter-bottom, .gritter-light .gritter-close, .gritter-light .gritter-item, .gritter-light .gritter-top { background-image: none; color: rgb(68, 68, 68); }
+.gritter-light .gritter-close:hover { color: rgb(138, 49, 4) !important; }
+.gritter-center { position: fixed; left: 33%; right: 33%; top: 33%; }
+.wysiwyg-style1 .btn-group, .wysiwyg-style2 .btn-group, .wysiwyg-toolbar { position: relative; }
+@media only screen and (max-width: 767px) {
+ .gritter-center { left: 16%; right: 16%; top: 30%; }
+}
+@media only screen and (max-width: 480px) {
+ .gritter-center { left: 30px; right: 30px; }
+}
+@media only screen and (max-width: 320px) {
+ .gritter-center { left: 10px; right: 10px; }
+}
+.wysiwyg-editor { max-height: 250px; height: 250px; background-color: rgb(247, 248, 250); border-collapse: separate; border: 1px solid rgb(187, 192, 202); padding: 4px; box-sizing: content-box; overflow-y: scroll; overflow-x: hidden; outline: 0px none; }
+.wysiwyg-editor:focus { background-color: rgb(255, 255, 255); }
+.wysiwyg-toolbar { line-height: 33px; margin: 0px !important; }
+.wysiwyg-toolbar .dropdown-menu { text-align: left; }
+.wysiwyg-toolbar .btn-group { float: none !important; font-size: 0px; }
+.wysiwyg-toolbar .btn-group > .btn { float: none; padding-left: 0px; padding-right: 0px; text-align: center; margin-left: 1px; }
+.wysiwyg-toolbar .btn-group > .btn > .ace-icon:first-child { font-size: 14px; width: 25px; max-width: 25px; display: inline-block; border-width: 1px !important; }
+.wysiwyg-toolbar .btn-group > .btn.dropdown-toggle > .ace-icon:last-child { margin-right: 4px; }
+.wysiwyg-style1 .btn-group > .btn, .wysiwyg-style1 .btn-group > .inline > .btn, .wysiwyg-style2 .btn-group > .btn, .wysiwyg-style2 .btn-group > .inline > .btn { margin: 0px !important; background: rgb(255, 255, 255) none repeat scroll 0% 0% !important; border-width: 0px !important; color: rgb(173, 179, 190) !important; text-shadow: none !important; }
+.wysiwyg-style1 .btn-group > .btn:hover, .wysiwyg-style1 .btn-group > .inline > .btn:hover, .wysiwyg-style2 .btn-group > .btn:hover, .wysiwyg-style2 .btn-group > .inline > .btn:hover { background: rgb(255, 255, 255) none repeat scroll 0% 0% !important; }
+.wysiwyg-style1 .btn-group > .btn.active, .wysiwyg-style1 .btn-group > .inline > .btn.active, .wysiwyg-style2 .btn-group > .btn.active, .wysiwyg-style2 .btn-group > .inline > .btn.active { color: rgb(91, 128, 206) !important; }
+.wysiwyg-style1 .btn-group > .btn.active::after, .wysiwyg-style1 .btn-group > .inline > .btn.active::after, .wysiwyg-style2 .btn-group > .btn.active::after, .wysiwyg-style2 .btn-group > .inline > .btn.active::after { display: none; }
+.wysiwyg-style1 .btn-group::after, .wysiwyg-style2 .btn-group::after { display: block; content: ""; position: absolute; left: -2px; top: 6px; bottom: 6px; width: 0px; max-width: 0px; border-left: 1px solid rgb(225, 230, 234); }
+.wysiwyg-style1 .btn-group:first-child::after, .wysiwyg-style2 .btn-group::after, .wysiwyg-style2 .btn-group:first-child::after { display: none; }
+.wysiwyg-style2 { background-color: rgb(229, 229, 229); }
+.wysiwyg-style2 + .wysiwyg-editor { border-color: currentcolor rgb(221, 221, 221) rgb(221, 221, 221); background-color: rgb(255, 255, 255); border-top: medium none; }
+.wysiwyg-style2 .btn-group > .btn, .wysiwyg-style2 .btn-group > .inline > .btn { margin: 0px 1px 0px 0px !important; background: rgb(255, 255, 255) none repeat scroll 0% 0% !important; border: medium none !important; color: rgb(141, 147, 158) !important; text-shadow: none !important; }
+.wysiwyg-style2 .btn-group > .btn.active, .wysiwyg-style2 .btn-group > .inline > .btn.active { color: rgb(255, 255, 255) !important; background: rgb(106, 174, 223) none repeat scroll 0% 0% !important; }
+.wysiwyg-toolbar .btn-colorpicker { width: 24px; height: 24px; position: relative; background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb(207, 62, 115) 10%, rgb(255, 255, 255) 20%, rgb(34, 131, 197) 30%, rgb(255, 255, 255) 40%, rgb(135, 184, 127) 50%, rgb(255, 255, 255) 60%, rgb(255, 183, 82) 70%, rgb(255, 255, 255) 80%, rgb(209, 91, 71) 90%, rgb(255, 255, 255) 100%) repeat scroll 0% 0%; }
+.wysiwyg-toolbar .dropdown-colorpicker > .dropdown-menu { top: auto; }
+.wysiwyg-toolbar input[type="file"] { position: fixed; z-index: -10; opacity: 0; max-width: 0px; max-height: 0px; display: block; }
+.wysiwyg-toolbar .wysiwyg-choose-file { display: inline-block; width: auto; margin: 4px auto 0px; padding-left: 5px; padding-right: 5px; }
+.wysiwyg-toolbar .dropdown-menu input[type="text"] { margin-left: 8px; margin-bottom: 0px; }
+.wysiwyg-toolbar .dropdown-menu input.form-control[type="text"] { min-width: 150px; }
+.wysiwyg-toolbar .dropdown-menu .btn { margin-right: 8px; margin-left: 8px; }
+.wysiwyg-style1 .btn-colorpicker { width: 20px; height: 20px; margin-left: 4px; }
+@media not all {
+ .wysiwyg-editor img { display: inline !important; }
+ .wysiwyg-editor .ui-wrapper { border: 1px dotted rgb(221, 0, 0); overflow: visible !important; display: inline-block !important; vertical-align: middle; }
+ .wysiwyg-editor .ui-wrapper::after { content: ""; display: block; position: absolute; right: -3px; bottom: -3px; width: 7px; height: 7px; border: 1px solid rgb(221, 0, 0); background-color: rgb(255, 255, 255); z-index: 1; }
+}
+.widget-header .wysiwyg-toolbar { background-color: transparent; }
+.widget-header .wysiwyg-toolbar .btn-group > .btn, .widget-header .wysiwyg-toolbar .btn-group > .inline > .btn { border-color: transparent; background: rgba(255, 255, 255, 0.25) none repeat scroll 0% 0% !important; color: rgb(255, 255, 255) !important; min-width: 32px; border-width: 1px !important; border-radius: 4px !important; padding: 2px 1px 4px; }
+.widget-header .wysiwyg-toolbar .btn-group > .btn.active, .widget-header .wysiwyg-toolbar .btn-group > .inline > .btn.active { background: rgba(0, 0, 0, 0.25) none repeat scroll 0% 0% !important; }
+.widget-body .wysiwyg-editor { border-width: 0px; }
+.wysiwyg-speech-input { width: 20px !important; color: transparent !important; background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; border-width: 0px !important; transform: scale(2, 2); box-shadow: none !important; position: absolute; right: 0px; top: -10px; cursor: pointer; }
+.wysiwyg-speech-input:focus { box-shadow: none !important; }
+.md-editor { display: block; border: 1px solid rgb(221, 221, 221); }
+.md-editor .md-footer, .md-editor > .md-header { display: block; padding: 6px 4px; background: rgb(245, 245, 245) none repeat scroll 0% 0%; }
+.md-editor > .md-header { margin: 0px; }
+.md-editor > .md-preview { border-top: 1px dashed rgb(221, 221, 221); border-bottom: 1px dashed rgb(221, 221, 221); min-height: 10px; overflow: auto; }
+.md-editor > textarea { font-family: Menlo,Monaco,Consolas,"Courier New",monospace; font-size: 14px; outline: 0px none; margin: 0px; display: block; padding: 0px; width: 100%; border-width: 1px 0px; border-style: dashed none; border-color: rgb(221, 221, 221) currentcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-radius: 0px; box-shadow: none; background: rgb(247, 248, 250) none repeat scroll 0% 0%; }
+.md-editor > textarea:focus { box-shadow: none; background: rgb(255, 255, 255) none repeat scroll 0% 0%; }
+.md-editor.active { border-color: rgb(245, 153, 66); outline: 0px none; }
+.md-editor .md-controls { float: right; padding: 3px; }
+.md-editor .md-controls .md-control { right: 5px; color: rgb(190, 190, 190); padding: 3px 3px 3px 10px; }
+.md-editor .md-controls .md-control:hover { color: rgb(51, 51, 51); }
+.md-editor.md-fullscreen-mode { width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; z-index: 99999; padding: 60px 30px 15px; background: rgb(255, 255, 255) none repeat scroll 0% 0% !important; border: 0px none !important; }
+.md-editor.md-fullscreen-mode .md-footer { display: none; }
+.md-editor.md-fullscreen-mode .md-input, .md-editor.md-fullscreen-mode .md-preview { margin: 0px auto !important; height: 100% !important; font-size: 20px !important; padding: 20px !important; color: rgb(153, 153, 153); line-height: 1.6em !important; resize: none !important; box-shadow: none !important; background: rgb(255, 255, 255) none repeat scroll 0% 0% !important; border: 0px none !important; }
+.md-editor.md-fullscreen-mode .md-preview { color: rgb(51, 51, 51); overflow: auto; }
+.md-editor.md-fullscreen-mode .md-input:focus, .md-editor.md-fullscreen-mode .md-input:hover { color: rgb(51, 51, 51); background: rgb(255, 255, 255) none repeat scroll 0% 0% !important; }
+.md-editor.md-fullscreen-mode .md-header { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; text-align: center; position: fixed; width: 100%; top: 20px; }
+.md-editor.md-fullscreen-mode .btn-group { float: none; }
+.md-editor.md-fullscreen-mode .btn { border: 0px none; background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; color: rgb(179, 179, 179); }
+.md-editor.md-fullscreen-mode .btn.active, .md-editor.md-fullscreen-mode .btn:active, .md-editor.md-fullscreen-mode .btn:focus, .md-editor.md-fullscreen-mode .btn:hover { box-shadow: none; color: rgb(51, 51, 51); }
+.md-editor.md-fullscreen-mode .md-fullscreen-controls { position: absolute; top: 20px; right: 20px; text-align: right; z-index: 1002; display: block; }
+.md-editor.md-fullscreen-mode .md-fullscreen-controls a { color: rgb(179, 179, 179); clear: right; margin: 10px; width: 30px; height: 30px; text-align: center; }
+.md-editor.md-fullscreen-mode .md-fullscreen-controls a:hover { color: rgb(51, 51, 51); text-decoration: none; }
+.md-editor.md-fullscreen-mode .md-editor { height: 100% !important; position: relative; }
+.md-editor .md-fullscreen-controls { display: none; }
+.md-nooverflow { overflow: hidden; position: fixed; width: 100%; }
+.editable-container .popover-title { color: rgb(67, 142, 185); }
+.editable-click { border-bottom: 1px dashed rgb(187, 187, 187); cursor: pointer; font-weight: 400; }
+img.editable-click { border: 1px dotted rgb(187, 187, 187); }
+.editable-click:hover { border-color: rgb(0, 136, 204); color: rgb(0, 136, 204); }
+img.editable-click:hover { opacity: 0.75; }
+.editable-buttons, .editable-input { display: inline-block; }
+.editable-buttons { margin-left: 1px; }
+.editable-buttons .btn { padding: 0px; width: 28px; line-height: 24px; border-width: 3px; font-size: 12px; margin: 0px 1px 0px 0px; }
+.editable-buttons .btn > .ace-icon { margin: 0px; }
+.editable-clear-x { cursor: pointer; color: rgb(136, 136, 136); background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; }
+.editable-clear-x:hover { color: rgb(209, 91, 71); }
+.editable-clear-x::before { display: inline-block; content: ""; font-family: FontAwesome; font-size: 15px; position: absolute; margin-top: -9px; width: 16px; height: 30px; line-height: 30px; text-align: center; }
+.editable-input .ace-spinner { margin-right: 8px; }
+.editable-input .ace-spinner .spinner-input { width: 100%; }
+.editable-inline .editable-slider { margin-top: 10px; margin-right: 4px; }
+.editable-popup .editable-slider { display: block; margin-bottom: 16px; margin-top: 4px; }
+.editable-slider input[type="text"] { display: none; }
+.editable-slider input[type="range"] { outline: 0px none !important; }
+.editable-input .ace-file-input { display: block; }
+.editable-image .ace-file-multiple .ace-file-container.selected { border-color: transparent; }
+.editable-image + .editable-buttons, .editable-wysiwyg + .editable-buttons { display: block; text-align: center; margin-top: 8px; }
+.editable-wysiwyg { width: 95%; }
+.editable-wysiwyg .wysiwyg-editor { height: auto; overflow-y: hidden; min-height: 32px; }
+.editableform .input-append.dropdown-menu { display: none; }
+.editableform .control-group, .editableform .open .input-append.dropdown-menu { display: block; }
+.editable-container .editableform { margin-bottom: 10px; }
+.editable-inline .editableform { margin-bottom: 0px; }
+.editableform-loading { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; }
+.editableform-loading .ace-icon, .editableform-loading .progress { position: relative; top: 35%; }
+.input-group.date .input-group-addon { cursor: pointer; }
+.datepicker td, .datepicker th, .daterangepicker td, .daterangepicker th { border-radius: 0px !important; font-size: 13px; }
+.datepicker td.active, .datepicker td.active:hover, .daterangepicker td.active, .daterangepicker td.active:hover { background: rgb(34, 131, 197) none repeat scroll 0% 0% !important; }
+.datepicker td.active.disabled, .datepicker td.active.disabled:hover, .daterangepicker td.active.disabled, .daterangepicker td.active.disabled:hover { background: rgb(139, 154, 163) none repeat scroll 0% 0% !important; }
+.datepicker td, .datepicker th { min-width: 32px; }
+.daterangepicker .calendar-date { border-radius: 0px; }
+.datepicker-months .month, .datepicker-years .year { border-radius: 0px !important; }
+.bootstrap-datetimepicker-widget table td span, .bootstrap-timepicker-widget table td a:hover { border-radius: 0px; }
+.datepicker-months .month.active, .datepicker-months .month.active:active, .datepicker-months .month.active:focus, .datepicker-months .month.active:hover, .datepicker-years .year.active, .datepicker-years .year.active:active, .datepicker-years .year.active:focus, .datepicker-years .year.active:hover { background-image: none !important; background-color: rgb(34, 131, 197) !important; }
+.bootstrap-timepicker-widget table td input { width: 32px; }
+.well .datepicker table tr td.day:hover { background-color: rgb(125, 136, 147); color: rgb(255, 255, 255); }
+.bootstrap-datetimepicker-widget [class="btn"] { border-width: 0px !important; background-color: transparent !important; color: rgb(115, 153, 184) !important; text-shadow: none !important; }
+.bootstrap-datetimepicker-widget [class="btn"]:hover { color: rgb(27, 106, 170) !important; }
+.bootstrap-datetimepicker-widget .btn.btn-primary { border-width: 3px !important; }
+.bootstrap-datetimepicker-widget .picker-switch { margin-bottom: 2px; }
+.bootstrap-datetimepicker-widget .picker-switch a { width: 90% !important; background-color: rgb(238, 238, 238) !important; color: rgb(71, 143, 202) !important; font-size: 16px; }
+.bootstrap-datetimepicker-widget .picker-switch a:hover { background-color: rgb(227, 237, 245) !important; }
+.bootstrap-datetimepicker-widget .picker-switch a span { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; width: 90%; }
+.bootstrap-datetimepicker-widget .timepicker-hour, .bootstrap-datetimepicker-widget .timepicker-minute, .bootstrap-datetimepicker-widget .timepicker-second { color: rgb(85, 85, 85) !important; }
+.ui-slider { background-color: rgb(213, 213, 213); }
+.ui-slider-horizontal { height: 9px; }
+.ui-slider-vertical { width: 9px; }
+.ui-slider .ui-slider-handle { border-radius: 0px; width: 1.45em; height: 1.45em; background-color: rgb(248, 248, 248); border: 1px solid; }
+.ui-slider .ui-slider-handle::after, .ui-slider .ui-slider-handle::before { display: block; content: ""; position: absolute; top: 4px; left: 5px; width: 4px; height: 8px; border-style: solid; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 1px; border-color: inherit; }
+.ui-slider .ui-slider-handle::after { left: 8px; border-width: 0px 1px 0px 0px; }
+.ui-slider .ui-slider-handle:hover { background-color: rgb(255, 255, 255); }
+.ui-slider .ui-slider-handle:active, .ui-slider .ui-slider-handle:focus, .ui-slider .ui-slider-handle:hover { outline: 0px none; box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.3); }
+.onpage-help-modal-buttons button:focus, .ui-slider-handle { outline: 0px none !important; }
+.ui-slider-horizontal .ui-slider-handle { margin-left: -0.725em; top: -0.4em; }
+.ui-slider-vertical .ui-slider-handle { left: -0.35em; margin-bottom: -0.65em; }
+.ui-slider-small.ui-slider-horizontal { height: 5px; }
+.ui-slider-small.ui-slider-vertical { width: 5px; }
+.ui-slider-small .ui-slider-handle { border-radius: 100%; width: 17px; height: 17px; margin-bottom: -0.45em; left: -0.35em; }
+.ui-slider-small .ui-slider-handle::after, .ui-slider-small .ui-slider-handle::before { height: 7px; left: 5px; width: 3px; }
+.ui-slider-small .ui-slider-handle::after { left: 7px; }
+.ui-slider-simple .ui-slider-handle::after, .ui-slider-simple .ui-slider-handle::before { display: none; }
+.ui-slider-range { background-color: rgb(74, 164, 206); }
+.ui-slider-handle { border-color: rgb(74, 164, 206) !important; }
+.ui-state-disabled.ui-slider { background-color: rgb(229, 229, 229); }
+.ui-state-disabled .ui-slider-range { background-color: rgb(141, 174, 190); }
+.ui-state-disabled .ui-slider-handle { box-shadow: none !important; border-color: rgb(141, 174, 190) !important; }
+.ui-slider-green .ui-slider-range { background-color: rgb(139, 188, 103); }
+.ui-slider-green .ui-slider-handle { border-color: rgb(139, 188, 103) !important; }
+.ui-slider-green.ui-state-disabled .ui-slider-range { background-color: rgb(170, 176, 166); }
+.ui-slider-green.ui-state-disabled .ui-slider-handle { border-color: rgb(170, 176, 166) !important; }
+.ui-slider-red .ui-slider-range { background-color: rgb(211, 110, 110); }
+.ui-slider-red .ui-slider-handle { border-color: rgb(211, 110, 110) !important; }
+.ui-slider-red.ui-state-disabled .ui-slider-range { background-color: rgb(200, 172, 172); }
+.ui-slider-red.ui-state-disabled .ui-slider-handle { border-color: rgb(200, 172, 172) !important; }
+.ui-slider-purple .ui-slider-range { background-color: rgb(172, 104, 186); }
+.ui-slider-purple .ui-slider-handle { border-color: rgb(172, 104, 186) !important; }
+.ui-slider-purple.ui-state-disabled .ui-slider-range { background-color: rgb(173, 167, 174); }
+.ui-slider-purple.ui-state-disabled .ui-slider-handle { border-color: rgb(173, 167, 174) !important; }
+.ui-slider-orange .ui-slider-range { background-color: rgb(239, 173, 98); }
+.ui-slider-orange .ui-slider-handle { border-color: rgb(239, 173, 98) !important; }
+.ui-slider-orange.ui-state-disabled .ui-slider-range { background-color: rgb(224, 196, 164); }
+.ui-slider-orange.ui-state-disabled .ui-slider-handle { border-color: rgb(224, 196, 164) !important; }
+.ui-slider-dark .ui-slider-range { background-color: rgb(96, 96, 96); }
+.ui-slider-dark .ui-slider-handle { border-color: rgb(96, 96, 96) !important; }
+.ui-slider-dark.ui-state-disabled .ui-slider-range { background-color: rgb(122, 122, 122); }
+.ui-slider-dark.ui-state-disabled .ui-slider-handle { border-color: rgb(122, 122, 122) !important; }
+.ui-slider-pink .ui-slider-range { background-color: rgb(214, 72, 126); }
+.ui-slider-pink .ui-slider-handle { border-color: rgb(214, 72, 126) !important; }
+.ui-slider-pink.ui-state-disabled .ui-slider-range { background-color: rgb(195, 142, 162); }
+.ui-slider-pink.ui-state-disabled .ui-slider-handle { border-color: rgb(195, 142, 162) !important; }
+.ui-datepicker { background-color: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.2); box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.ui-dialog, .ui-jqdialog, .ui-menu { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.ui-datepicker .ui-datepicker-next, .ui-datepicker .ui-datepicker-prev { height: 26px; min-width: 32px; max-width: 32px; text-align: center; cursor: pointer; color: transparent; line-height: 26px; box-sizing: content-box; }
+.ui-datepicker .ui-datepicker-next .ui-icon, .ui-datepicker .ui-datepicker-prev .ui-icon { color: transparent; visibility: hidden; }
+.ui-datepicker .ui-datepicker-next:hover, .ui-datepicker .ui-datepicker-prev:hover { background-color: rgb(238, 238, 238); text-decoration: none; }
+.ui-datepicker .ui-datepicker-next::before, .ui-datepicker .ui-datepicker-prev::before { display: inline; font-family: FontAwesome; font-size: 14px; content: ""; color: rgb(57, 57, 57); }
+.ui-datepicker .ui-datepicker-next-hover, .ui-datepicker .ui-datepicker-prev-hover { top: 2px; }
+.ui-datepicker .ui-datepicker-next::before { content: ""; }
+.ui-datepicker .ui-datepicker-prev-hover { left: 2px; }
+.ui-datepicker .ui-datepicker-next-hover { right: 2px; }
+.ui-datepicker td { padding: 0px; }
+.ui-datepicker td > a, .ui-datepicker td > span { display: inline-block; height: 22px; min-width: 24px; max-width: 24px; text-align: center; color: rgb(57, 57, 57); font-size: 13px; box-sizing: content-box; }
+.ui-datepicker td > a:hover { background-color: rgb(238, 238, 238); }
+.ui-datepicker td > a.ui-state-highlight { background-color: rgb(213, 229, 239); }
+.ui-datepicker td > a.ui-state-active { background-color: rgb(34, 131, 197); color: rgb(255, 255, 255); }
+.ui-datepicker td > a.ui-priority-secondary { color: rgb(136, 136, 136); }
+.ui-datepicker td > span { color: rgb(153, 153, 153); }
+.ui-datepicker td .ui-datepicker-title select { height: 24px; line-height: 24px; padding: 2px 3px; }
+.ui-datepicker td .ui-datepicker-buttonpane { background-color: rgb(221, 221, 221); height: 1px; }
+.ui-widget-overlay { background: rgba(0, 0, 0, 0.25) none repeat scroll 0% 0%; opacity: 1 !important; z-index: 1049 !important; }
+.ui-dialog, .ui-jqdialog { z-index: 1050 !important; background-color: rgb(255, 255, 255); padding: 0px; border: 1px solid rgb(221, 221, 221); box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.ui-dialog .ui-dialog-titlebar, .ui-dialog .ui-jqdialog-titlebar, .ui-jqdialog .ui-dialog-titlebar, .ui-jqdialog .ui-jqdialog-titlebar { background-color: rgb(241, 241, 241); font-size: 16px; color: rgb(102, 159, 199); padding: 0px; }
+.ui-dialog .ui-dialog-title, .ui-dialog .ui-jqdialog-title, .ui-jqdialog .ui-dialog-title, .ui-jqdialog .ui-jqdialog-title { float: none !important; width: auto; }
+.ui-dialog .widget-header, .ui-jqdialog .widget-header { margin: 0px; border-width: 0px 0px 1px; }
+.ui-dialog .ui-dialog-buttonpane, .ui-dialog .ui-jqdialog-buttonpane, .ui-jqdialog .ui-dialog-buttonpane, .ui-jqdialog .ui-jqdialog-buttonpane { background-color: rgb(239, 243, 248); border-top: 1px solid rgb(228, 233, 238); }
+.ui-dialog .ui-dialog-buttonpane button, .ui-dialog .ui-jqdialog-buttonpane button, .ui-jqdialog .ui-dialog-buttonpane button, .ui-jqdialog .ui-jqdialog-buttonpane button { font-size: 14px; }
+.ui-dialog .ui-dialog-titlebar-close, .ui-dialog .ui-jqdialog-titlebar-close, .ui-jqdialog .ui-dialog-titlebar-close, .ui-jqdialog .ui-jqdialog-titlebar-close { border: medium none; background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; opacity: 0.4; color: rgb(209, 91, 71); padding: 0px; top: 50%; right: 8px !important; text-align: center; }
+.ui-dialog .ui-dialog-titlebar-close::before, .ui-dialog .ui-jqdialog-titlebar-close::before, .ui-jqdialog .ui-dialog-titlebar-close::before, .ui-jqdialog .ui-jqdialog-titlebar-close::before { content: ""; display: inline; font-family: FontAwesome; font-size: 16px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-dialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:hover { opacity: 1; text-decoration: none; padding: 0px; }
+.ui-dialog .ui-dialog-titlebar-close .ui-button-text, .ui-dialog .ui-jqdialog-titlebar-close .ui-button-text, .ui-jqdialog .ui-dialog-titlebar-close .ui-button-text, .ui-jqdialog .ui-jqdialog-titlebar-close .ui-button-text { text-indent: 0px; visibility: hidden; }
+.ui-dialog .widget-header .ui-dialog-titlebar-close, .ui-dialog .widget-header .ui-jqdialog-titlebar-close, .ui-jqdialog .widget-header .ui-dialog-titlebar-close, .ui-jqdialog .widget-header .ui-jqdialog-titlebar-close { right: 10px !important; }
+.ui-accordion .ui-accordion-header { color: rgb(71, 143, 202); font-weight: 400; background-color: rgb(249, 249, 249); border: 1px solid rgb(205, 216, 227); padding: 8px 8px 9px 24px; }
+.ui-accordion .ui-accordion-header:hover { color: rgb(110, 166, 204); background-color: rgb(241, 248, 253); }
+.ui-accordion .ui-accordion-header.ui-state-active { color: rgb(76, 143, 189); background-color: rgb(238, 244, 249); position: relative; font-weight: 700; }
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon { text-indent: 0px; margin-top: 0px; position: absolute; left: 10px; top: 7px; }
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon::before { display: inline; font-family: FontAwesome; font-size: 15px; content: ""; }
+.ui-accordion .ui-accordion-header.ui-state-active .ui-accordion-header-icon::before { content: ""; font-weight: 400; }
+.ui-accordion .ui-accordion-content { border-width: 0px 1px 1px; border-style: solid; border-color: rgb(205, 216, 227); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; padding: 11px 16px; }
+.ui-tabs .ui-tabs-nav { padding: 0px; border-bottom: 1px solid rgb(197, 208, 220); }
+.ui-tabs .ui-tabs-nav li.ui-state-default > a { background-color: rgb(249, 249, 249); border-width: 1px 1px 0px; border-style: solid; border-color: rgb(197, 208, 220); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; color: rgb(153, 153, 153); line-height: 16px; margin-right: -1px; z-index: 11; padding: 8px 12px; position: relative; top: 2px; }
+.ui-tabs .ui-tabs-nav li > a:focus { outline: 0px none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-active > a { background-color: rgb(255, 255, 255); border-width: 2px 1px 1px; border-style: solid; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-color: rgb(76, 143, 189) rgb(197, 208, 220) transparent; box-shadow: 0px -2px 3px 0px rgba(0, 0, 0, 0.15); color: rgb(87, 99, 115); position: relative; top: 1px; }
+.ui-tabs .ui-tabs-panel { border-width: 0px 1px 1px; border-style: solid; border-color: rgb(197, 208, 220); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; margin: 0px; left: auto; right: auto; top: auto; bottom: auto; }
+.ui-autocomplete, .ui-menu { border: 1px solid rgba(0, 0, 0, 0.2); }
+.ui-menu { box-sizing: content-box; width: 150px; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); background-color: rgb(255, 255, 255); padding: 3px; }
+.ui-spinner-button, .ui-spinner-button > .ace-icon { width: 18px; display: inline-block; }
+.tt-menu, .ui-autocomplete { box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.ui-menu .ui-menu-item { padding: 5px 10px 6px; color: rgb(68, 68, 68); cursor: pointer; display: block; box-sizing: inherit; }
+.ui-menu .ui-menu-item .ui-menu-icon { float: right; position: relative; left: auto; right: 4px; bottom: auto; text-indent: 0px; }
+.ui-menu .ui-menu-item .ui-menu-icon::before { content: ""; font-family: FontAwesome; font-size: 14px; display: inline; }
+.ui-grid-ico-sort::before, .ui-selectmenu-button .ui-icon::before { content: ""; font-family: FontAwesome; }
+.ui-menu .ui-menu-item:hover, .ui-menu .ui-menu-item:hover > .ui-menu-icon, .ui-menu .ui-state-active, .ui-menu .ui-state-active > .ui-menu-icon, .ui-menu .ui-state-focus, .ui-menu .ui-state-focus > .ui-menu-icon { text-decoration: none; background-color: rgb(79, 153, 198); color: rgb(255, 255, 255); margin: auto; font-weight: 400; }
+.ui-menu .ui-state-disabled, .ui-menu .ui-state-disabled .ui-menu-icon { color: rgb(153, 153, 153); cursor: default; }
+.ui-menu .ui-state-disabled.ui-state-active, .ui-menu .ui-state-disabled.ui-state-active .ui-menu-icon, .ui-menu .ui-state-disabled.ui-state-focus, .ui-menu .ui-state-disabled.ui-state-focus .ui-menu-icon, .ui-menu .ui-state-disabled:hover, .ui-menu .ui-state-disabled:hover .ui-menu-icon { background-color: rgb(255, 255, 255); color: rgb(153, 153, 153); }
+.ui-autocomplete { background-color: rgb(255, 255, 255); box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.ui-autocomplete-category { padding: 6px; position: relative; background-color: rgb(238, 244, 249); color: rgb(71, 143, 202); font-weight: bolder; border-style: solid; border-color: rgb(218, 230, 237); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 0px; }
+.ui-spinner-button { border-width: 0px !important; font-size: 10px; height: 16px; line-height: 16px; color: rgb(255, 255, 255) !important; text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25) !important; position: absolute; text-align: center; padding: 0px; }
+.ui-spinner-up { top: 0px; right: 5px; }
+.ui-spinner-down { bottom: 3px; right: 5px; }
+.ui-spinner-input { margin-top: 0px; padding: 5px; max-width: 100px; font-size: 14px; }
+.ui-tooltip { background-color: rgb(68, 68, 68); color: rgb(255, 255, 255); }
+.ui-progressbar { background-color: rgb(245, 245, 245); height: 22px; }
+.ui-progressbar .ui-progressbar-value { margin: 0px; }
+.ui-progressbar .ui-progressbar-value[class="progress-bar"] { background-color: rgb(42, 145, 216); }
+.ui-selectmenu-button { border: 1px solid rgb(170, 170, 170); }
+.ui-selectmenu-button[aria-expanded="true"] { border-color: rgb(68, 146, 201); }
+.ui-selectmenu-button span.ui-icon { text-indent: 0px; margin-top: -10px; }
+.ui-selectmenu-button .ui-icon::before { display: inline-block; color: rgb(136, 136, 136); font-size: 14px; }
+.ui-jqgrid .ui-jqgrid-view { z-index: auto; }
+.ui-jqgrid .ui-jqgrid-view, .ui-jqgrid .ui-paging-info, .ui-jqgrid .ui-pg-selbox, .ui-jqgrid .ui-pg-table { font-size: 13px; }
+.ui-jqgrid .ui-jqgrid-title { float: left; margin: 8px; }
+.ui-jqgrid .ui-jqgrid-title-rtl { float: right; margin: 8px; }
+.ui-jqgrid-view > .ui-jqgrid-titlebar { height: 40px; line-height: 24px; color: rgb(255, 255, 255); background: rgb(48, 126, 204) none repeat scroll 0% 0%; padding: 0px; font-size: 15px; }
+.ui-jqgrid tr.jqgrow.ui-row-rtl td:last-child { border-right: medium none; border-left: 1px solid rgb(225, 225, 225); }
+.ui-jqgrid .ui-jqgrid-hdiv { background-color: rgb(239, 243, 248); border-style: solid; border-color: rgb(211, 211, 211); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 1px 0px 0px 1px; line-height: 15px; font-weight: 700; color: rgb(119, 119, 119); text-shadow: none; }
+.ui-jqgrid .ui-jqgrid-htable thead { background-color: rgb(239, 243, 248); }
+.ui-jqgrid .ui-jqgrid-htable th span.ui-jqgrid-resize { height: 45px !important; }
+.ui-jqgrid .ui-jqgrid-htable th div { padding-top: 12px; padding-bottom: 12px; overflow: visible; }
+.ui-jqgrid-hdiv .ui-jqgrid-htable { border-top: 1px solid rgb(225, 225, 225); }
+.ui-jqgrid-titlebar { position: relative; top: 1px; z-index: 1; }
+.ui-jqgrid tr.jqgrow, .ui-jqgrid tr.ui-row-ltr, .ui-jqgrid tr.ui-row-rtl { border: medium none; }
+.ui-jqgrid tr.ui-row-ltr td, .ui-jqgrid tr.ui-row-rtl td { border-bottom: 1px solid rgb(225, 225, 225); padding: 6px 4px; border-color: rgb(225, 225, 225); }
+.ui-jqgrid tr.ui-state-highlight.ui-row-ltr td { border-right-color: rgb(199, 211, 169); }
+.ui-jqgrid tr.ui-state-highlight.ui-row-rtl td { border-left-color: rgb(199, 211, 169); }
+.ui-jqgrid-btable .ui-widget-content.ui-priority-secondary { background-image: none; background-color: rgb(249, 249, 249); opacity: 1; }
+.ui-jqgrid-btable .ui-widget-content.ui-state-hover { background-image: none; background-color: rgb(239, 244, 247); opacity: 1; }
+.ui-jqgrid-btable .ui-widget-content.ui-state-highlight { background-color: rgb(228, 239, 201); }
+.ui-jqgrid .ui-jqgrid-pager { line-height: 15px; height: 55px; padding-top: 10px !important; padding-bottom: 10px !important; background-color: rgb(239, 243, 248) !important; border-bottom: 1px solid rgb(225, 225, 225) !important; border-top: 1px solid rgb(225, 225, 225) !important; }
+.ui-jqgrid .ui-pg-input { font-size: inherit; width: 24px; height: 20px; line-height: 16px; box-sizing: content-box; text-align: center; padding-top: 1px; padding-bottom: 1px; }
+.ui-jqgrid .ui-pg-selbox { display: block; height: 24px; width: 60px; margin: 0px; padding: 1px; line-height: normal; }
+.ui-jqgrid .ui-pager-control { height: 50px; position: relative; padding-left: 9px; padding-right: 9px; }
+.ui-jqgrid .ui-jqgrid-toppager { height: auto !important; background-color: rgb(239, 243, 248); border-bottom: 1px solid rgb(225, 225, 225) !important; }
+.ui-jqgrid .jqgrow .editable { max-width: calc(92%) !important; }
+.ui-pg-table .navtable .ui-corner-all { border-radius: 0px; }
+.ui-jqgrid .ui-pg-button .ui-separator { margin-left: 4px; margin-right: 4px; border-color: rgb(201, 212, 219); }
+.ui-jqgrid .ui-jqgrid-btable { border-left: 1px solid rgb(225, 225, 225); }
+.ui-jqgrid .ui-jqgrid-bdiv { border-top: 1px solid rgb(225, 225, 225); overflow-x: hidden; }
+.ui-jqgrid .loading { position: absolute; top: 45%; left: 45%; width: auto; height: auto; z-index: 111; padding: 6px; margin: 5px; text-align: center; font-weight: 700; font-size: 12px; background-color: rgb(255, 255, 255); border: 2px solid rgb(142, 184, 209); color: rgb(226, 176, 24); }
+.ui-jqgrid .ui-search-toolbar { border-top: 1px solid rgb(225, 225, 225); }
+.ui-jqgrid .ui-jqgrid-labels { border-bottom: medium none; background: rgb(242, 242, 242) linear-gradient(to bottom, rgb(248, 248, 248) 0px, rgb(236, 236, 236) 100%) repeat-x scroll 0% 0%; padding: 0px !important; border-left: 1px solid rgb(225, 225, 225) !important; }
+.ui-jqgrid .ui-jqgrid-labels th { border-right: 1px solid rgb(225, 225, 225) !important; text-align: left !important; }
+.ui-jqgrid-labels th[id*="_cb"]:first-child > div { padding-top: 0px; text-align: center !important; }
+.ui-jqgrid-sortable { padding-left: 4px; font-size: 13px; color: rgb(119, 119, 119); font-weight: 700; }
+.ui-jqgrid-sortable:hover { color: rgb(84, 126, 168); }
+th[aria-selected="true"] { background-image: linear-gradient(to bottom, rgb(239, 243, 248) 0px, rgb(227, 231, 237) 100%); background-repeat: repeat-x; }
+th[aria-selected="true"] .ui-jqgrid-sortable { color: rgb(48, 126, 204); }
+.ui-jqgrid .ui-icon { text-indent: 0px; color: rgb(48, 126, 204); float: none; right: 2px; }
+.rtl .ui-jqgrid .ui-icon { right: auto; left: 2px; }
+.ui-jqgrid .ui-icon.ui-state-disabled { color: rgb(187, 187, 187); }
+.ui-jqgrid .ui-icon.ui-state-disabled:hover { padding: 0px; }
+.ui-grid-ico-sort::before { display: inline; font-size: 12px; }
+.ui-icon-asc::before { content: ""; }
+.ui-pg-table > tbody > tr > .ui-pg-button > .ui-icon { display: inline-block; padding: 0px; width: 24px; height: 24px; line-height: 22px; text-align: center; position: static; float: none; margin: 0px 2px !important; color: grey; border: 1px solid rgb(204, 204, 204); background-color: rgb(255, 255, 255); border-radius: 100%; }
+.ui-pg-table > tbody > tr > .ui-pg-button > .ui-icon:hover { color: rgb(105, 154, 181); border-color: rgb(105, 154, 181); }
+.ui-pg-table > tbody > tr > .ui-pg-button > .ui-icon::before { width: 20px; text-align: center; display: inline-block; }
+.ui-pg-table > tbody > tr > .ui-pg-button.ui-state-disabled .ui-icon { color: rgb(176, 176, 176); background-color: rgb(247, 247, 247); border-color: rgb(221, 221, 221); transform: scale(0.9); }
+.ui-jqgrid-btable input, .ui-jqgrid-btable select, .ui-jqgrid-btable textarea { padding: 2px; width: auto; max-width: 100%; margin-bottom: 0px; }
+.ui-jqgrid-btable select { padding: 1px; height: 25px; line-height: 25px; }
+.ui-jqgrid select.inline-edit-cell { padding: 1px; }
+.ui-pg-div .ui-icon { display: inline-block; width: 18px; float: none; position: static; text-align: center; opacity: 0.85; transition: all 0.12s ease 0s; margin: 0px 1px; vertical-align: middle; cursor: pointer; font-size: 17px; }
+.ui-pg-div .ui-icon:hover { transform: scale(1.2); opacity: 1; position: static; margin: 0px 1px; }
+.ui-pg-div .ui-icon::before { font-family: FontAwesome; display: inline; }
+.ui-jqgrid .ui-icon-pencil { color: rgb(71, 143, 202); }
+.ui-jqgrid .ui-icon-pencil::before { content: ""; }
+.ui-jqgrid .ui-icon-trash { color: rgb(221, 90, 67); }
+.ui-jqgrid .ui-icon-trash::before { content: ""; }
+.ui-jqgrid .ui-icon-disk { color: rgb(105, 170, 70); }
+.ui-jqgrid .ui-icon-disk::before { content: ""; }
+.ui-jqgrid .ui-icon-cancel { color: rgb(221, 90, 67); }
+.ui-jqgrid .ui-icon-cancel::before { content: ""; }
+.ui-jqdialog .ui-jqdialog-content, .ui-jqdialog-content { font-size: 13px; padding: 4px 0px 0px; }
+.ui-jqdialog .ui-jqdialog-content .formdata, .ui-jqdialog-content .formdata { font-size: 13px; padding: 6px 12px; }
+.ui-jqdialog .ui-jqdialog-content .form-view-data, .ui-jqdialog-content .form-view-data { vertical-align: middle; font-size: 13px; }
+.ui-jqdialog .ui-jqdialog-content[id*="alertcnt_"], .ui-jqdialog-content[id*="alertcnt_"] { padding: 8px 11px; }
+.ui-jqdialog-content .CaptionTD { font-size: 12px; text-align: right; color: rgb(102, 102, 102); }
+.ui-jqdialog-content .FormData { border-bottom: 1px dotted rgb(232, 232, 232); }
+.ui-jqdialog-content .FormData:last-child { border-bottom: medium none; }
+.ui-jqdialog-content .FormData > td { padding-top: 6px; padding-bottom: 6px; }
+.ui-jqdialog-content input.FormElement { width: auto; }
+.ui-jqdialog-content select.FormElement { padding: 1px; height: 25px; line-height: 25px; width: auto; }
+.EditTable, .ui-jqdialog-content td.EditButton { padding: 8px; }
+.EditTable { background-color: rgb(239, 243, 248); border-top: 1px solid rgb(214, 225, 234) !important; }
+.EditTable tr:first-child { display: none; }
+.EditTable .navButton .fm-button { float: none !important; width: auto !important; margin: 1px 1px 2px !important; background-color: transparent; border-radius: 100%; }
+.EditTable .navButton .fm-button:hover { background-color: transparent; }
+.EditTable .navButton .fm-button:focus { outline: 0px none; }
+.EditTable .navButton .fm-button .ace-icon { display: inline-block; color: rgb(153, 153, 153); border: 1px solid rgb(170, 170, 170); width: 26px; height: 26px; line-height: 26px; text-align: center; border-radius: 100%; background-color: rgb(255, 255, 255); }
+.EditTable .navButton .fm-button:hover .ace-icon { color: rgb(105, 154, 181); border-color: rgb(105, 154, 181); }
+.EditTable .navButton .fm-button.ui-state-disabled .ace-icon, .EditTable .navButton .fm-button.ui-state-disabled:hover .ace-icon { color: rgb(187, 187, 187); border-color: rgb(204, 204, 204); transform: scale(0.88); }
+.FormGrid .EditTable { background-color: rgb(255, 255, 255); border-top: medium none !important; padding: 0px; }
+.FormGrid .EditTable tr:first-child { display: none; }
+.ui-jqgrid .ui-jqgrid-view button, .ui-jqgrid .ui-jqgrid-view input, .ui-jqgrid .ui-jqgrid-view select, .ui-jqgrid .ui-jqgrid-view textarea { font-size: 13px; }
+.ui-jqdialog-content .searchFilter select { padding: 1px; height: 26px; line-height: 26px; width: auto; max-width: 95%; margin-bottom: 0px; }
+.ui-jqdialog-content .searchFilter .input-elm { margin-bottom: 0px; height: 18px; line-height: 18px; width: 95% !important; padding-left: 1px; padding-right: 1px; box-sizing: content-box; }
+.ui-jqdialog-content .searchFilter table { margin-left: 4px; }
+.ui-jqdialog-content .searchFilter tr td { padding: 5px 0px; }
+.ui-jqdialog-content .searchFilter .add-group, .ui-jqdialog-content .searchFilter .add-rule, .ui-jqdialog-content .searchFilter .delete-group { margin-left: 4px !important; font-size: 15px !important; }
+.ui-jqdialog-content .searchFilter .delete-rule { border: medium none; background-color: rgb(255, 255, 255); color: rgb(209, 91, 71); font-size: 20px; width: 22px; line-height: 10px; padding: 0px; text-shadow: none !important; display: inline-block; transition: all 0.1s ease 0s; opacity: 0.85; }
+.ui-jqdialog-content .searchFilter .delete-rule:hover { transform: scale(1.1); color: rgb(183, 70, 53); opacity: 1; }
+.ui-jqdialog-content .searchFilter .queryresult td.query { padding: 6px 11px; border: 1px solid rgb(225, 225, 225); background-color: rgb(238, 238, 238); }
+.ui-jqdialog-content .searchFilter .queryresult td.query:empty { display: none; }
+.ui-state-error { background-color: rgb(242, 222, 222); border: 1px solid rgb(235, 204, 209); color: rgb(169, 68, 66); margin: 4px 4px 8px; padding: 6px 10px; text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5); font-size: 13px; }
+.ui-jqdialog .ui-widget-header { background-image: linear-gradient(to bottom, rgb(255, 255, 255) 0px, rgb(238, 238, 238) 100%); background-repeat: repeat-x; border-image: none; color: rgb(102, 159, 199); min-height: 38px; position: relative; }
+.ui-jqdialog .ui-widget-header .ui-jqdialog-title { line-height: 38px; margin: 0px; padding: 0px 0px 0px 12px; text-align: left; }
+.widget-header .ui-jqdialog-title { padding-left: 0px !important; padding-right: 0px !important; }
+.ui-jqdialog .ui-widget-header .widget-header { border-bottom: medium none; }
+.ui-jqdialog .ui-jqdialog-titlebar { border-bottom: 1px solid rgb(221, 221, 221) !important; }
+.fm-button { margin: 0px 4px; height: auto; }
+.fm-button:not(.btn) { background-color: rgb(171, 186, 195); border-radius: 0px; box-shadow: none; color: rgb(255, 255, 255); cursor: pointer; display: inline-block; font-size: 13px; line-height: 28px; padding: 0px 12px 1px; margin: 0px 8px; position: relative; text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25); transition: all 0.15s ease 0s; vertical-align: middle; }
+.dd2-content[class*="btn-"], .dd2-handle.btn-yellow { text-shadow: none !important; }
+.fm-button.ui-state-default:hover { background-color: rgb(139, 154, 163); }
+.ui-jqgrid .ui-jqgrid-htable .ui-search-toolbar th { height: 30px; padding-top: 2px; white-space: normal; }
+.ui-jqgrid .ui-jqgrid-htable .ui-search-toolbar th div { padding-top: 0px; padding-bottom: 0px; height: 30px; line-height: 26px; }
+.ui-jqgrid .ui-jqgrid-titlebar-close { top: 10%; height: auto; padding: 0px; margin: 2px 8px 0px 0px; text-align: center; border-radius: 4px; }
+.ui-jqgrid .ui-jqgrid-titlebar-close:hover { background-color: rgba(255, 255, 255, 0.2); }
+.ui-jqgrid .ui-jqgrid-titlebar-close .ui-icon::before { display: inline-block; font-family: FontAwesome; content: ""; color: rgb(255, 255, 255); }
+.ui-jqgrid .ui-jqgrid-titlebar-close .ui-icon-circle-triangle-s::before { content: ""; }
+.ui-jqgrid .tree-wrap-ltr { margin: 0px 4px; float: none; display: inline; }
+.ui-jqgrid .tree-wrap-rtl { margin: 2px 4px 0px; }
+.ui-jqgrid .ui-subgrid { border-bottom: 1px solid rgb(225, 225, 225); background-color: rgb(246, 250, 255); }
+.ui-jqgrid .ui-subgrid .ui-jqgrid-btable { background-color: rgb(255, 255, 255); }
+.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv { background-color: transparent; margin-top: 4px; }
+.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable .ui-jqgrid-labels { border-bottom: 1px solid rgb(225, 225, 225); background: rgb(241, 241, 241) none repeat scroll 0% 0%; }
+.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th[aria-selected="true"] { background: rgb(229, 233, 239) none repeat scroll 0% 0%; }
+.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th .ui-jqgrid-sortable { font-size: 12px; }
+.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th div { padding-top: 8px; padding-bottom: 8px; }
+.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th span.ui-jqgrid-resize { height: 36px !important; }
+.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-bdiv { height: auto !important; max-height: 150px; margin-bottom: 4px; border-top-width: 0px; border-bottom: 1px solid rgb(225, 225, 225); }
+.ui-jqgrid .ui-sgcollapsed > a:hover { text-decoration: none; }
+.ui-jqgrid .ui-pg-button:hover, .ui-jqgrid .ui-state-disabled:hover { padding: 0px 1px; }
+.ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover > .ui-pg-div > .ui-icon, .ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover > .ui-separator { margin-left: 4px; margin-right: 4px; }
+@media only screen and (max-width: 767px) {
+ .ui-jqgrid .ui-jqgrid-pager { height: 90px; }
+ .ui-jqgrid .ui-jqgrid-pager > .ui-pager-control { height: 85px; padding-top: 10px !important; }
+ .ui-jqgrid .ui-jqgrid-pager > .ui-pager-control > .ui-pg-table > tbody > tr > td { vertical-align: top; }
+ .ui-jqgrid .ui-jqgrid-pager > .ui-pager-control > .ui-pg-table > tbody > tr > td#grid-pager_center { width: 0px !important; position: static; }
+ .ui-jqgrid .ui-jqgrid-pager > .ui-pager-control > .ui-pg-table > tbody > tr > td#grid-pager_center > .ui-pg-table { margin: 36px auto 0px; position: absolute; right: 0px; left: 0px; text-align: center; }
+ .ui-jqgrid .ui-jqgrid-pager .navtable { height: auto; }
+}
+.dd, .dd-list { display: block; padding: 0px; list-style: outside none none; }
+.dd, .dd-item > button, .dd-list { position: relative; }
+@media not all {
+ .ui-jqgrid .ui-jqgrid-pager > .ui-pager-control > .ui-pg-table > tbody > tr > td#grid-pager_center > .ui-pg-table { width: 300px; }
+}
+.dd { margin: 0px; max-width: 600px; line-height: 20px; }
+.dd-list { margin: 0px; }
+.dd-list .dd-list { padding-left: 30px; }
+.dd-collapsed .dd-list { display: none; }
+.dd-empty, .dd-item, .dd-placeholder { display: block; position: relative; margin: 0px; padding: 0px; min-height: 20px; line-height: 20px; }
+.dd-handle, .dd2-content { display: block; min-height: 38px; margin: 5px 0px; padding: 8px 12px; background: rgb(248, 250, 255) none repeat scroll 0% 0%; border: 1px solid rgb(218, 226, 234); color: rgb(124, 158, 178); text-decoration: none; font-weight: 700; box-sizing: border-box; }
+.dd-handle:hover, .dd2-content:hover { color: rgb(67, 142, 185); background: rgb(244, 246, 247) none repeat scroll 0% 0%; border-color: rgb(220, 226, 232); }
+.dd-handle[class*="btn-"], .dd2-content[class*="btn-"] { color: rgb(255, 255, 255); border: medium none; padding: 9px 12px; }
+.dd-handle[class*="btn-"]:hover, .dd2-content[class*="btn-"]:hover { opacity: 0.85; color: rgb(255, 255, 255); }
+.dd2-handle + .dd2-content, .dd2-handle + .dd2-content[class*="btn-"] { padding-left: 44px; }
+.dd-handle[class*="btn-"]:hover, .dd2-content[class*="btn-"] .dd2-handle[class*="btn-"]:hover + .dd2-content[class*="btn-"] { color: rgb(255, 255, 255); }
+.dd-item > button:hover ~ .dd-handle, .dd-item > button:hover ~ .dd2-content { color: rgb(67, 142, 185); background: rgb(244, 246, 247) none repeat scroll 0% 0%; border-color: rgb(220, 226, 232); }
+.dd-item > button:hover ~ .dd-handle[class*="btn-"], .dd-item > button:hover ~ .dd2-content[class*="btn-"] { opacity: 0.85; color: rgb(255, 255, 255); }
+.dd2-handle:hover ~ .dd2-content { color: rgb(67, 142, 185); background: rgb(244, 246, 247) none repeat scroll 0% 0%; border-color: rgb(220, 226, 232); }
+.dd2-handle:hover ~ .dd2-content[class*="btn-"] { opacity: 0.85; color: rgb(255, 255, 255); }
+.dd2-item.dd-item > button { margin-left: 34px; }
+.dd-item > button { display: block; z-index: 1; cursor: pointer; float: left; width: 25px; height: 20px; margin: 5px 1px 5px 5px; padding: 0px; text-indent: 100%; white-space: nowrap; overflow: hidden; border: 0px none; background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; font-size: 12px; line-height: 1; text-align: center; font-weight: 700; top: 4px; left: 1px; color: rgb(112, 112, 112); }
+.dd-item > button::before { font-family: FontAwesome; content: ""; display: block; position: absolute; width: 100%; text-align: center; text-indent: 0px; font-weight: 400; font-size: 14px; }
+.dd-item > button[data-action="collapse"]::before { content: ""; }
+.dd-item > button:hover { color: rgb(112, 112, 112); }
+.dd-item.dd-colored > button, .dd-item.dd-colored > button:hover { color: rgb(238, 238, 238); }
+.dd-empty, .dd-placeholder { margin: 5px 0px; padding: 0px; min-height: 30px; background: rgb(240, 249, 255) none repeat scroll 0% 0%; border: 2px dashed rgb(190, 210, 219); box-sizing: border-box; }
+.dd-empty { border-color: rgb(170, 170, 170); border-style: solid; background-color: rgb(229, 229, 229); }
+.dd-dragel { position: absolute; pointer-events: none; z-index: 999; opacity: 0.8; }
+.dd-dragel > li > .dd-handle { color: rgb(75, 146, 190); background: rgb(241, 245, 250) none repeat scroll 0% 0%; border-color: rgb(214, 225, 234) rgb(214, 225, 234) rgb(214, 225, 234) rgb(119, 119, 119); border-left: 2px solid rgb(119, 119, 119); position: relative; }
+.dd-dragel > li > .dd-handle[class*="btn-"] { color: rgb(255, 255, 255); }
+.dd-dragel > .dd-item > .dd-handle { margin-top: 0px; }
+.dd-list > li[class*="item-"] { border-width: 0px; padding: 0px; }
+.dd-list > li[class*="item-"] > .dd-handle { border-left-width: 2px; border-left-style: solid; border-left-color: inherit; }
+.dd-list > li > .dd-handle .sticker { position: absolute; right: 0px; top: 0px; }
+.dd-dragel > li > .dd2-handle, .dd2-handle { left: 0px; top: 0px; width: 36px; margin: 0px; text-align: center; padding: 0px !important; line-height: 38px; height: 38px; background: rgb(235, 237, 242) none repeat scroll 0% 0%; border: 1px solid rgb(222, 228, 234); cursor: pointer; overflow: hidden; position: absolute; z-index: 1; }
+.dd-dragel > li > .dd2-handle, .dd2-handle:hover { background: rgb(227, 232, 237) none repeat scroll 0% 0%; }
+.dd2-handle[class*="btn-"] { text-shadow: none !important; background: rgba(0, 0, 0, 0.1) none repeat scroll 0% 0% !important; border-right: 1px solid rgb(238, 238, 238); }
+.dd2-handle[class*="btn-"]:hover { background: rgba(0, 0, 0, 0.08) none repeat scroll 0% 0% !important; }
+.dd-dragel .dd2-handle[class*="btn-"] { border-color: transparent rgb(238, 238, 238) transparent transparent; }
+.dd2-handle.btn-yellow { background: rgba(0, 0, 0, 0.05) none repeat scroll 0% 0% !important; border-right: 1px solid rgb(255, 255, 255); }
+.dd2-handle.btn-yellow:hover { background: rgba(0, 0, 0, 0.08) none repeat scroll 0% 0% !important; }
+.dd-dragel .dd2-handle.btn-yellow { border-color: transparent rgb(255, 255, 255) transparent transparent; }
+.dd-item > .dd2-handle .drag-icon { display: none; }
+.dd-dragel > .dd-item > .dd2-handle .drag-icon { display: inline; }
+.dd-dragel > .dd-item > .dd2-handle .normal-icon { display: none; }
+.dropzone { border-radius: 0px; border: 1px solid rgba(0, 0, 0, 0.06); }
+.dropzone.well { background-color: rgb(245, 245, 245); border: 1px solid rgb(227, 227, 227); }
+.dropzone .dz-default.dz-message { background-image: none; font-size: 24px; text-align: center; line-height: 32px; left: 0px; width: 100%; margin-left: auto; }
+.dropzone .dz-default.dz-message span { display: inline; color: rgb(85, 85, 85); }
+.dropzone .dz-default.dz-message span .upload-icon { opacity: 0.7; margin-top: 8px; cursor: pointer; }
+.dropzone .dz-default.dz-message span .upload-icon:hover { opacity: 1; }
+.dropzone .dz-preview.dz-image-preview { background-color: transparent; }
+input.tt-hint, input.tt-query, input.typeahead { min-width: 175px; font-size: 16px; line-height: 24px; border: 1px solid rgb(204, 204, 204); border-radius: 0px; outline: 0px none; }
+.form-group input.tt-hint, input.tt-hint { background-color: rgb(255, 255, 255) !important; color: rgb(176, 176, 176) !important; }
+.tt-menu { text-align: left; position: absolute; left: 0px !important; right: 0px !important; min-width: 175px; margin-top: 2px; padding: 8px 0px; background-color: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 0px; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); }
+.btn-group > .btn.moveall:first-child, .btn-group > .btn.moveall:first-child + .btn.move, .btn-group > .btn.remove:first-child, .btn-group > .btn.remove:first-child + .btn.removeall, .tt-suggestion p { margin: 0px; }
+.tt-suggestion { padding: 3px 12px 4px; font-size: 16px; line-height: 24px; }
+.tt-suggestion.tt-cursor, .tt-suggestion.tt-selectable:hover { color: rgb(255, 255, 255); background-color: rgb(79, 153, 198); cursor: pointer; }
+input.typeahead.scrollable ~ .tt-menu { max-height: 200px; overflow-y: auto; }
+.bootstrap-duallistbox-container .clear1, .bootstrap-duallistbox-container .clear2, .bootstrap-duallistbox-container .info { font-size: 12px; }
+.btn.multiselect-clear-filter { padding-left: 6px; padding-right: 6px; line-height: 1.45; }
+.multiselect-container > li > a { padding: 0px; }
+.multiselect-container > li > a > label { padding: 7px 10px 7px 20px; }
+.cancel-off-png, .cancel-on-png, .star-half-png, .star-off-png, .star-on-png { font-size: 2em; font-family: FontAwesome; font-style: normal; font-variant: normal; font-weight: 400; line-height: 1; text-transform: none; color: rgb(119, 119, 119); }
+.ace-settings-box .ace-settings-item > label.lbl, .tags .tag { font-size: 13px; }
+.cancel-on-png { color: rgb(221, 90, 67); }
+.cancel-on-png::before { content: ""; }
+.cancel-off-png { color: rgb(224, 131, 116); }
+.cancel-off-png::before { content: ""; }
+.star-on-png { color: rgb(254, 185, 2); }
+.star-on-png::before { content: ""; }
+.star-off-png { color: rgb(119, 119, 119); }
+.star-off-png::before { content: ""; }
+.star-half-png { color: rgb(254, 185, 2); }
+.star-half-png::before { content: ""; }
+.icon-animated-bell { display: inline-block; animation: 2s ease 1s normal none 5 running ringing; transform-origin: 50% 0px 0px; }
+@keyframes ringing {
+0% { transform: rotate(-15deg); }
+2% { transform: rotate(15deg); }
+12%, 4% { transform: rotate(-18deg); }
+14%, 6% { transform: rotate(18deg); }
+8% { transform: rotate(-22deg); }
+10% { transform: rotate(22deg); }
+16% { transform: rotate(-12deg); }
+18% { transform: rotate(12deg); }
+20% { transform: rotate(0deg); }
+}
+@keyframes ringing {
+0% { transform: rotate(-15deg); }
+2% { transform: rotate(15deg); }
+12%, 4% { transform: rotate(-18deg); }
+14%, 6% { transform: rotate(18deg); }
+8% { transform: rotate(-22deg); }
+10% { transform: rotate(22deg); }
+16% { transform: rotate(-12deg); }
+18% { transform: rotate(12deg); }
+20% { transform: rotate(0deg); }
+}
+@keyframes ringing {
+0% { transform: rotate(-15deg); }
+2% { transform: rotate(15deg); }
+12%, 4% { transform: rotate(-18deg); }
+14%, 6% { transform: rotate(18deg); }
+8% { transform: rotate(-22deg); }
+10% { transform: rotate(22deg); }
+16% { transform: rotate(-12deg); }
+18% { transform: rotate(12deg); }
+20% { transform: rotate(0deg); }
+}
+.icon-animated-vertical { display: inline-block; animation: 2s ease 2s normal none 5 running vertical; }
+@keyframes vertical {
+0%, 16%, 8% { transform: translate(0px, -3px); }
+12%, 20%, 4% { transform: translate(0px, 3px); }
+22% { transform: translate(0px, 0px); }
+}
+@keyframes vertical {
+0%, 16%, 8% { transform: translate(0px, -3px); }
+12%, 20%, 4% { transform: translate(0px, 3px); }
+22% { transform: translate(0px, 0px); }
+}
+@keyframes vertical {
+0%, 16%, 8% { transform: translate(0px, -3px); }
+12%, 20%, 4% { transform: translate(0px, 3px); }
+22% { transform: translate(0px, 0px); }
+}
+.icon-animated-hand-pointer { display: inline-block; animation: 2s ease 2s normal none 4 running hand-pointer; }
+@keyframes hand-pointer {
+0%, 12%, 24%, 36% { transform: translate(0px, 0px); }
+18%, 30%, 6% { transform: translate(5px, 0px); }
+}
+.icon-animated-wrench { display: inline-block; animation: 2.5s ease 0s normal none 4 running wrenching; transform-origin: 90% 35% 0px; }
+@keyframes wrenching {
+0% { transform: rotate(-12deg); }
+8% { transform: rotate(12deg); }
+10%, 28%, 30%, 48%, 50%, 68% { transform: rotate(24deg); }
+18%, 20%, 38%, 40%, 58%, 60% { transform: rotate(-24deg); }
+75% { transform: rotate(0deg); }
+}
+@keyframes wrenching {
+0% { transform: rotate(-12deg); }
+8% { transform: rotate(12deg); }
+10%, 28%, 30%, 48%, 50%, 68% { transform: rotate(24deg); }
+18%, 20%, 38%, 40%, 58%, 60% { transform: rotate(-24deg); }
+75% { transform: rotate(0deg); }
+}
+@keyframes wrenching {
+0% { transform: rotate(-12deg); }
+8% { transform: rotate(12deg); }
+10%, 28%, 30%, 48%, 50%, 68% { transform: rotate(24deg); }
+18%, 20%, 38%, 40%, 58%, 60% { transform: rotate(-24deg); }
+75% { transform: rotate(0deg); }
+}
+@keyframes blinking {
+0%, 80% { opacity: 1; }
+40% { opacity: 0; }
+}
+@keyframes blinking {
+0%, 80% { opacity: 1; }
+40% { opacity: 0; }
+}
+@keyframes blinking {
+0%, 80% { opacity: 1; }
+40% { opacity: 0; }
+}
+@keyframes pulsating {
+0%, 10%, 20%, 30%, 40% { transform: scale(1); }
+25%, 5% { transform: scale(0.75); }
+15%, 35% { transform: scale(1.25); }
+}
+@keyframes pulsating {
+0%, 10%, 20%, 30%, 40% { transform: scale(1); }
+25%, 5% { transform: scale(0.75); }
+15%, 35% { transform: scale(1.25); }
+}
+@keyframes pulsating {
+0%, 10%, 20%, 30%, 40% { transform: scale(1); }
+25%, 5% { transform: scale(0.75); }
+15%, 35% { transform: scale(1.25); }
+}
+.btn-scroll-up { border-width: 0px; position: fixed; right: 2px; z-index: 99; transition-duration: 0.3s; opacity: 0; bottom: -24px; visibility: hidden; }
+.btn-scroll-up.display { opacity: 0.7; bottom: 2px; visibility: visible; }
+.btn-scroll-up:hover { opacity: 1; }
+.btn-scroll-up:focus { outline: 0px none; }
+@media (min-width: 768px) {
+ .main-container.container > .btn-scroll-up { right: auto; margin-left: 714px; }
+}
+@media (min-width: 992px) {
+ .main-container.container > .btn-scroll-up { right: auto; margin-left: 934px; }
+}
+@media (min-width: 1200px) {
+ .main-container.container > .btn-scroll-up { right: auto; margin-left: 1134px; }
+}
+.ace-settings-container { position: absolute; right: 0px; top: auto; z-index: 12; }
+.btn.btn-app.ace-settings-btn { float: left; display: block; text-align: center; border-radius: 6px 0px 0px 6px; opacity: 0.55; vertical-align: top; margin: 0px; }
+.btn.btn-app.ace-settings-btn.open, .btn.btn-app.ace-settings-btn:hover { opacity: 1; }
+.btn.btn-app.ace-settings-btn.btn-xs { width: 42px; }
+.ace-settings-box { display: block; float: left; max-width: 0px; max-height: 0px; overflow: hidden; padding: 0px; transform: translate(0px, 0px); background-color: rgb(255, 255, 255); border: 0px solid rgb(255, 179, 75); transition: max-width 0.25s linear 0s, max-height 0s linear 0.25s, padding 0s linear 0.25s, border-width 0s linear 0.25s; }
+.ace-settings-box.open { max-width: 320px; max-height: 1000px; padding: 0px 14px; border-width: 2px; transition-delay: 0s; }
+.ace-settings-box.open .ace-settings-item { z-index: auto; min-width: 140px; }
+.ace-settings-box .ace-settings-item { margin: 6px 0px; color: rgb(68, 68, 68); max-height: 24px; position: relative; z-index: -1; white-space: nowrap; }
+@media (max-width: 480px) {
+ .ace-settings-container { text-align: right; }
+ .ace-settings-box { float: none !important; text-align: left; }
+ .btn.ace-settings-btn { float: none !important; display: inline-block; }
+}
+@media (max-width: 320px) {
+ .ace-settings-box > .clearfix > .pull-left, .ace-settings-box > .clearfix > .pull-right { float: none !important; }
+}
+.grid2, .grid3, .grid4 { box-sizing: border-box; display: block; margin: 0px 1%; padding: 0px 2%; float: left; border-left: 1px solid rgb(227, 227, 227); }
+.grid2:first-child, .grid3:first-child, .grid4:first-child { border-left: medium none; }
+.grid2 { width: 48%; }
+.grid3 { width: 31.33%; }
+.grid4 { width: 23%; padding: 0px 1%; }
+.draggable-placeholder { border: 2px dashed rgb(217, 217, 217) !important; background-color: rgb(247, 247, 247) !important; }
+.easy-pie-chart, .easyPieChart { position: relative; text-align: center; }
+.easy-pie-chart canvas, .easyPieChart canvas { position: absolute; top: 0px; left: 0px; }
+.knob-container { direction: ltr; text-align: left; }
+.tags { display: inline-block; padding: 4px 6px; color: rgb(119, 119, 119); vertical-align: middle; background-color: rgb(255, 255, 255); border: 1px solid rgb(213, 213, 213); width: 206px; }
+.tags:hover { border-color: rgb(181, 181, 181); }
+.tags-hover, .tags-hover:hover { border-color: rgb(245, 153, 66); outline: 0px none; }
+.tags[class*="span"] { float: none; margin-left: 0px; }
+.tags input[type="text"], .tags input[type="text"]:focus { border: medium none; display: inline; outline: 0px none; margin: 0px; padding: 0px; line-height: 18px; box-shadow: none; width: 100%; }
+.tags .tag { display: inline-block; position: relative; font-weight: 400; vertical-align: baseline; white-space: nowrap; background-color: rgb(145, 184, 208); color: rgb(255, 255, 255); text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.15); padding: 4px 22px 5px 9px; margin-bottom: 3px; margin-right: 3px; transition: all 0.2s ease 0s; }
+.tags .tag:empty { display: none; }
+.tags .tag-important { background-color: rgb(209, 91, 71); }
+.tags .tag-warning { background-color: rgb(255, 183, 82); }
+.tags .tag-success { background-color: rgb(135, 184, 127); }
+.tags .tag-info { background-color: rgb(111, 179, 224); }
+.tags .tag-inverse { background-color: rgb(85, 85, 85); }
+.tags .tag .close { font-size: 15px; line-height: 20px; opacity: 1; color: rgb(255, 255, 255); text-shadow: none; float: none; position: absolute; right: 0px; top: 0px; bottom: 0px; width: 18px; text-align: center; }
+.tags .tag .close:hover { background-color: rgba(0, 0, 0, 0.2); }
+.page-content > .row .col-lg-12, .page-content > .row .col-md-12, .page-content > .row .col-sm-12, .page-content > .row .col-xs-12 { float: left; max-width: 100%; }
+.col-xs-reset { width: auto; padding-left: 0px; padding-right: 0px; float: none !important; }
+@media (min-width: 768px) {
+ .col-sm-reset { width: auto; padding-left: 0px; padding-right: 0px; float: none !important; }
+}
+@media (min-width: 992px) {
+ .col-md-reset { width: auto; padding-left: 0px; padding-right: 0px; float: none !important; }
+}
+@media (min-width: 1200px) {
+ .col-lg-reset { width: auto; padding-left: 0px; padding-right: 0px; float: none !important; }
+}
+.jqstooltip, .legendColorBox div { box-sizing: content-box; }
+.legendLabel { box-sizing: content-box; height: 22px; padding-left: 2px; font-size: 10px; }
+.navbar-fixed-top + .main-container { padding-top: 45px; }
+@media (max-width: 479px) {
+ .navbar-fixed-top + .main-container { padding-top: 90px; }
+ .navbar-fixed-top.navbar-collapse + .main-container { padding-top: 45px; }
+}
+@media only screen and (max-width: 360px) {
+ .grid2, .grid3, .grid4 { float: none; display: block; width: 96%; border-left-width: 0px; position: relative; margin-bottom: 11px; border-bottom: 1px solid rgb(227, 227, 227); padding-bottom: 4px; }
+ .grid2 > [class*="pull-"], .grid3 > [class*="pull-"], .grid4 > [class*="pull-"] { float: none !important; display: inline-block; position: absolute; right: 11px; top: 0px; margin-top: 0px; }
+ .grid2:last-child, .grid3:last-child, .grid4:last-child { border-bottom-width: 0px; }
+}
+@media only screen and (max-width: 480px) {
+ .hidden-480 { display: none !important; }
+}
+@media only screen and (max-width: 320px) {
+ .hidden-320 { display: none !important; }
+}
+.no-skin .navbar .navbar-toggle { background-color: rgb(117, 179, 215); }
+.no-skin .navbar .navbar-toggle:focus { background-color: rgb(117, 179, 215); border-color: transparent; }
+.no-skin .navbar .navbar-toggle:hover { background-color: rgb(97, 168, 209); border-color: rgba(255, 255, 255, 0.1); }
+.no-skin .navbar .navbar-toggle.display, .no-skin .navbar .navbar-toggle[data-toggle="collapse"]:not(.collapsed) { background-color: rgb(77, 157, 204); box-shadow: 1px 1px 2px 0px rgba(0, 0, 0, 0.25) inset; border-color: rgba(255, 255, 255, 0.35); }
+.no-skin .sidebar { background-color: rgb(242, 242, 242); border-style: solid; border-color: rgb(204, 204, 204); border-width: 0px 1px 0px 0px; }
+.no-skin .nav-list .open > a, .no-skin .nav-list .open > a:focus, .no-skin .nav-list .open > a:hover { background-color: rgb(250, 250, 250); }
+.no-skin .nav-list > li { border-color: rgb(229, 229, 229); }
+.no-skin .nav-list > li > a { background-color: rgb(248, 248, 248); color: rgb(88, 88, 88); }
+.no-skin .nav-list > li > a:focus { background-color: rgb(248, 248, 248); color: rgb(25, 99, 170); }
+.no-skin .nav-list > li:hover > a { background-color: rgb(255, 255, 255); color: rgb(38, 108, 173); }
+.no-skin .nav-list > li.open > a { background-color: rgb(250, 250, 250); color: rgb(25, 99, 170); }
+.no-skin .nav-list > li.active > a { font-weight: 700; color: rgb(43, 125, 188); }
+.no-skin .nav-list > li.active > a, .no-skin .nav-list > li.active > a:focus, .no-skin .nav-list > li.active > a:hover { background-color: rgb(255, 255, 255); }
+.no-skin .nav-list > li .submenu { background-color: rgb(255, 255, 255); border-color: rgb(229, 229, 229); }
+.no-skin .nav-list > li .submenu > li > a { border-top-color: rgb(228, 228, 228); background-color: rgb(255, 255, 255); color: rgb(97, 97, 97); }
+.no-skin .nav-list > li .submenu > li > a:hover { color: rgb(75, 136, 183); background-color: rgb(241, 245, 249); }
+.no-skin .nav-list > li .submenu > li.active > a { color: rgb(43, 125, 188); }
+.no-skin .nav-list > li .submenu > li.active > a > .menu-icon { color: rgb(200, 97, 57); }
+.no-skin .nav-list > li .submenu > li.active.open > a > .menu-icon { color: inherit; }
+@media only screen and (min-width: 992px) {
+ .no-skin .nav-list > li .submenu > li.active.hover > a.dropdown-toggle > .menu-icon { color: inherit; }
+}
+.no-skin .nav-list > li .submenu > li.active:not(.open) > a { background-color: rgb(245, 247, 250); }
+.no-skin .nav-list > li .submenu > li.active:not(.open) > a:hover { background-color: rgb(241, 245, 249); }
+.no-skin .nav-list > li > .submenu .open > a, .no-skin .nav-list > li > .submenu .open > a:focus, .no-skin .nav-list > li > .submenu .open > a:hover { border-color: rgb(228, 228, 228); }
+.no-skin .nav-list > li > .submenu li > .submenu > li a { color: rgb(117, 117, 117); }
+.no-skin .nav-list > li > .submenu li > .submenu > li a:hover { color: rgb(75, 136, 183); background-color: rgb(241, 245, 249); }
+.no-skin .nav-list > li > .submenu li.open > a, .no-skin .nav-list > li > .submenu li > .submenu li.active > a, .no-skin .nav-list > li > .submenu li > .submenu li.open > a { color: rgb(75, 136, 183); }
+.no-skin .nav-list > li > .submenu::before, .no-skin .nav-list > li > .submenu > li::before { border-color: rgb(157, 189, 214); }
+.no-skin .nav-list > li.active > .submenu::before, .no-skin .nav-list > li.active > .submenu > li::before { border-color: rgb(142, 179, 208); }
+.no-skin .sidebar-toggle { background-color: rgb(243, 243, 243); border-color: rgb(224, 224, 224); }
+.no-skin .sidebar-toggle > .ace-icon { border-color: rgb(187, 187, 187); color: rgb(170, 170, 170); background-color: rgb(255, 255, 255); }
+.no-skin .sidebar-shortcuts { background-color: rgb(250, 250, 250); }
+.no-skin .sidebar-fixed .sidebar-shortcuts { border-color: rgb(221, 221, 221); }
+.no-skin .sidebar-shortcuts-mini { background-color: rgb(255, 255, 255); }
+.no-skin .nav-list li > .arrow::before { border-right-color: rgb(184, 184, 184); border-width: 10px 10px 10px 0px; left: -10px; }
+.no-skin .nav-list li > .arrow::after { border-right-color: rgb(255, 255, 255); border-width: 10px 10px 10px 0px; left: -9px; }
+.no-skin .nav-list > li.pull_up > .arrow::after { border-right-color: rgb(255, 255, 255) !important; }
+.no-skin .nav-list li.active > a::after { border-right-color: rgb(43, 125, 188); }
+.no-skin .nav-list > li.active::after { display: block; content: ""; position: absolute; right: -2px; top: -1px; bottom: 0px; z-index: 1; border-style: solid; border-color: rgb(43, 125, 188); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; border-width: 0px 2px 0px 0px; }
+.no-skin .sidebar-scroll .nav-list > li.active::after { right: 0px; }
+.no-skin .sidebar.menu-min .nav-list > li > a > .menu-text { background-color: rgb(245, 245, 245); box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.1); border-color: rgb(204, 204, 204); }
+.no-skin .sidebar.menu-min .nav-list > li > a.dropdown-toggle > .menu-text { box-shadow: 2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+.no-skin .sidebar.menu-min .nav-list > li.active > .submenu { border-left-color: rgb(131, 182, 209); }
+.no-skin .sidebar.menu-min .nav-list > li > .submenu { background-color: rgb(255, 255, 255); border-width: 1px; border-style: solid; border-color: rgb(230, 230, 230) rgb(204, 204, 204) rgb(204, 204, 204); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; box-shadow: 2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+.no-skin .sidebar.menu-min .nav-list > li > .arrow::after { border-right-color: rgb(245, 245, 245); border-width: 8px 8px 8px 0px; left: -8px; }
+.no-skin .sidebar.menu-min .nav-list > li > .arrow::before { border-width: 8px 8px 8px 0px; left: -9px; }
+.no-skin .sidebar.menu-min .nav-list > li.active > .arrow::before { border-right-color: rgb(90, 158, 194); }
+.no-skin .sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(131, 182, 209); }
+.no-skin .sidebar.menu-min .sidebar-shortcuts-large { background-color: rgb(255, 255, 255); box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.1); border-color: rgb(204, 204, 204); }
+.no-skin .sidebar.menu-min .sidebar-toggle > .ace-icon { border-color: rgb(177, 177, 177); }
+@media (max-width: 991px) {
+ .no-skin .sidebar.responsive-min .nav-list > li > a > .menu-text { background-color: rgb(245, 245, 245); box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.1); border-color: rgb(204, 204, 204); }
+ .no-skin .sidebar.responsive-min .nav-list > li > a.dropdown-toggle > .menu-text { box-shadow: 2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+ .no-skin .sidebar.responsive-min .nav-list > li.active > .submenu { border-left-color: rgb(131, 182, 209); }
+ .no-skin .sidebar.responsive-min .nav-list > li > .submenu { background-color: rgb(255, 255, 255); border-width: 1px; border-style: solid; border-color: rgb(230, 230, 230) rgb(204, 204, 204) rgb(204, 204, 204); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; box-shadow: 2px 2px 2px 0px rgba(0, 0, 0, 0.1); }
+ .no-skin .sidebar.responsive-min .nav-list > li > .arrow::after { border-right-color: rgb(245, 245, 245); border-width: 8px 8px 8px 0px; left: -8px; }
+ .no-skin .sidebar.responsive-min .nav-list > li > .arrow::before { border-width: 8px 8px 8px 0px; left: -9px; }
+ .no-skin .sidebar.responsive-min .nav-list > li.active > .arrow::before { border-right-color: rgb(90, 158, 194); }
+ .no-skin .sidebar.responsive-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(131, 182, 209); }
+ .no-skin .sidebar.responsive-min .sidebar-shortcuts-large { background-color: rgb(255, 255, 255); box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.1); border-color: rgb(204, 204, 204); }
+ .no-skin .sidebar.responsive-min .sidebar-toggle > .ace-icon { border-color: rgb(177, 177, 177); }
+}
+@media only screen and (min-width: 992px) {
+ .no-skin .nav-list li.hover > .submenu { box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.1); border-color: rgb(204, 204, 204); }
+ .no-skin .nav-list li.hover > .submenu > li.active > a { background-color: rgb(245, 245, 245); }
+ .no-skin .nav-list li.hover > .submenu > li:hover > a { background-color: rgb(238, 243, 247); color: rgb(46, 125, 180); }
+}
+@media only screen and (min-width: 992px) and (max-width: 991px) {
+ .no-skin .sidebar.navbar-collapse .nav-list li li.hover.active.open > a, .no-skin .sidebar.navbar-collapse .nav-list li li.hover:hover > a { background-color: rgb(255, 255, 255); }
+ .no-skin .sidebar.navbar-collapse .nav-list li li.hover.open.active > a:hover, .no-skin .sidebar.navbar-collapse .nav-list li li.hover.open > a:hover, .no-skin .sidebar.navbar-collapse .nav-list li li.hover > a:hover { background-color: rgb(241, 245, 249); }
+ .no-skin .sidebar.navbar-collapse .nav-list > li .submenu > li.active.hover > a.dropdown-toggle > .menu-icon { color: rgb(200, 97, 57); }
+ .no-skin .sidebar.navbar-collapse .nav-list > li .submenu > li.active.open.hover > a.dropdown-toggle > .menu-icon { color: inherit; }
+}
+@media only screen and (min-width: 992px) {
+ .no-skin .sidebar.navbar-collapse .nav-list > li.open.hover:not(:hover):not(:focus):not(.active) > a { color: rgb(88, 88, 88); }
+ .no-skin .sidebar.navbar-collapse .nav-list > li.open.hover:not(:hover):not(:focus):not(.active) > a > .arrow { color: inherit; }
+ .no-skin .sidebar.navbar-collapse .nav-list > li.open.hover:hover > a { background-color: rgb(255, 255, 255); }
+ .no-skin .sidebar.navbar-collapse .nav-list > li > .submenu li.open.hover:not(:hover):not(:focus):not(.active) > a { color: rgb(97, 97, 97); }
+ .no-skin .sidebar.navbar-collapse .nav-list > li > .submenu li.open.hover:not(:hover):not(:focus):not(.active) > a > .arrow { color: inherit; }
+}
+@media only screen and (min-width: 992px) and (max-width: 991px) {
+ .no-skin .sidebar.navbar-collapse .nav-list li.hover > .submenu { border-top-color: rgb(229, 229, 229); background-color: rgb(255, 255, 255); }
+ .no-skin .nav-list li.hover > .submenu > li.active:not(.open) > a { background-color: rgb(245, 247, 250); }
+ .no-skin .nav-list li.hover > .submenu > li.active:not(.open) > a:hover { background-color: rgb(241, 245, 249); }
+}
+@media only screen and (min-width: 992px) {
+ .no-skin .sidebar.h-sidebar { background-color: rgb(248, 248, 248); }
+ .no-skin .sidebar.h-sidebar::before { background-color: rgb(228, 228, 228); box-shadow: 0px -1px 1px 0px rgba(0, 0, 0, 0.05) inset; }
+ .no-skin .sidebar.h-sidebar .nav-list > li:hover, .no-skin .sidebar.h-sidebar .nav-list > li:hover + li { border-left-color: rgb(206, 221, 229); }
+ .no-skin .sidebar.h-sidebar .nav-list > li:last-child:hover { border-right-color: rgb(206, 221, 229); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.active, .no-skin .sidebar.h-sidebar .nav-list > li.active + li, .no-skin .sidebar.h-sidebar .nav-list > li:hover + li.active { border-left-color: rgb(121, 176, 206); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.active:last-child { border-right-color: rgb(121, 176, 206); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.active::before { background-color: rgb(43, 125, 188); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.active > a::after { border-width: 0px 0px 2px; border-color: transparent transparent rgb(255, 255, 255); left: 0px; right: 0px; top: auto; bottom: -2px; }
+ .no-skin .sidebar.h-sidebar .sidebar-shortcuts-large { background-color: rgb(255, 255, 255); border-color: rgb(204, 204, 204); box-shadow: 2px 1px 2px 0px rgba(0, 0, 0, 0.1); }
+ .no-skin .sidebar.h-sidebar .sidebar-shortcuts-large::after { border-bottom-color: rgb(255, 255, 255); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.hover > .submenu { border-color: rgb(204, 204, 204); }
+ .no-skin .sidebar.h-sidebar.menu-min .nav-list > li.hover > .submenu { border-top-color: rgb(230, 230, 230); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.hover > .arrow::after { border-color: transparent transparent rgb(255, 255, 255); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.hover > .arrow::before { border-color: transparent transparent rgb(184, 184, 184); }
+ .no-skin .sidebar.h-sidebar.menu-min .nav-list > li.hover > .arrow::after { border-bottom-color: rgb(245, 245, 245); }
+ .no-skin .sidebar.h-sidebar.menu-min .nav-list > li.active > a > .menu-text { border-left-color: rgb(204, 204, 204); }
+}
+@media only screen and (max-width: 991px) {
+ body { overflow-x: hidden; }
+ .no-skin .sidebar.responsive .nav-list > li.active.open > a::after, .no-skin .sidebar.responsive-max .nav-list > li.active.open > a::after { display: block; }
+ .no-skin .sidebar.responsive .nav-list li li.active > a::after, .no-skin .sidebar.responsive-max .nav-list li li.active > a::after { display: none; }
+ .no-skin .sidebar.responsive .nav-list > li.active::after, .no-skin .sidebar.responsive-max .nav-list > li.active::after { height: 41px; }
+ .no-skin .sidebar { border-width: 0px 1px 1px 0px; border-top-color: rgb(214, 214, 214); }
+ .no-skin .menu-toggler + .sidebar.responsive { border-top-width: 1px; }
+ .no-skin .sidebar.responsive-min { border-width: 0px 1px 0px 0px; }
+ .no-skin .sidebar.navbar-collapse { border-top-width: 0px; border-right-width: 0px; border-left-width: 0px; border-bottom-width: 1px !important; border-bottom-color: rgb(204, 204, 204); box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.1) !important; }
+ .no-skin .sidebar.navbar-collapse.menu-min .nav-list > li > .submenu { background-color: rgb(255, 255, 255); }
+}
+.no-skin .sidebar-scroll .sidebar-shortcuts { border-bottom-color: rgb(221, 221, 221); }
+.no-skin .sidebar-scroll .sidebar-toggle { border-top-color: rgb(221, 221, 221); }
+.no-skin .main-container .menu-toggler { background-color: rgb(68, 68, 68); }
+.no-skin .main-container .menu-toggler::before { border-top-color: rgb(135, 184, 127); border-bottom-color: rgb(111, 179, 224); }
+.no-skin .main-container .menu-toggler::after { border-top-color: rgb(255, 162, 77); border-bottom-color: rgb(209, 91, 71); }
+.no-skin .main-container .menu-toggler > .toggler-text { border-top-color: rgb(68, 68, 68); }
+.no-skin .nav-list > li.disabled::before { display: none !important; }
+.no-skin .nav-list > li.disabled > a { background-color: rgb(235, 235, 235) !important; color: rgb(101, 101, 101) !important; }
+.no-skin .nav-list li .submenu > li.disabled > a, .no-skin .nav-list li.disabled .submenu > li > a { background-color: rgb(242, 242, 242) !important; color: rgb(122, 122, 122) !important; cursor: not-allowed !important; }
+.nav-list li li.highlight.active > a::after, .nav-list li li.highlight.active > a::before, .nav-list li.highlight li.active > a::after, .nav-list li.highlight li.active > a::before, .no-skin .nav-list li .submenu > li.disabled > a > .menu-icon, .no-skin .nav-list li.disabled .submenu > li > a > .menu-icon { display: none; }
+.nav-list > li.highlight.active > a::after, .nav-list > li.highlight.active > a::before { display: block; }
+.no-skin .nav-list > li.highlight.active, .no-skin .nav-list > li.highlight:hover { border-color: rgb(200, 216, 226); }
+.no-skin .nav-list > li.highlight.active + li, .no-skin .nav-list > li.highlight:hover + li { border-top-color: rgb(200, 216, 226); }
+.no-skin .nav-list > li.highlight.active > a, .no-skin .nav-list > li.highlight:hover > a { background-color: rgb(255, 255, 255); }
+.no-skin .nav-list > li.highlight.active::after { display: none; }
+.no-skin .nav-list > li.highlight.active::before { display: block; background-color: rgb(79, 144, 194); }
+.no-skin .nav-list > li.highlight.active > a { background-color: rgb(242, 246, 249) !important; }
+.no-skin .nav-list > li.highlight.active > a::after, .no-skin .nav-list > li.highlight.active > a::before { display: block; content: ""; position: absolute; top: -1px; right: -9px; bottom: auto; z-index: 1; border-style: solid; border-width: 20px 0px 21px 10px; border-color: transparent; }
+.no-skin .nav-list > li.highlight.active > a::before { border-left-color: rgb(160, 188, 205); right: -10px; }
+.no-skin .nav-list > li.highlight.active > a::after { border-left-color: rgb(242, 246, 249); }
+.no-skin .nav-list li li.highlight.active > a { background-color: rgb(242, 246, 249); }
+.no-skin .nav-list li li.highlight.active.open > a { background-color: rgb(255, 255, 255); }
+.no-skin .nav-list li li.highlight.active.open > a:hover { background-color: rgb(241, 245, 249); }
+@media (min-width: 992px) {
+ .no-skin .sidebar.h-sidebar .nav-list > li.highlight.active > a::after { display: block; content: ""; position: absolute; top: auto; right: auto; bottom: -2px; left: 50%; margin-left: -7px; border-color: transparent transparent rgb(255, 255, 255); border-width: 8px 7px; }
+ .no-skin .sidebar.h-sidebar .nav-list > li.highlight.active > a::before { content: ""; position: absolute; display: block; top: auto; right: auto; bottom: -1px; left: 50%; margin-left: -7px; border-width: 8px; border-color: transparent transparent rgb(116, 173, 215); }
+ .no-skin .sidebar.h-sidebar .nav-list > li.highlight.active.hover-show > a::after, .no-skin .sidebar.h-sidebar .nav-list > li.highlight.active.hover-show > a::before, .no-skin .sidebar.h-sidebar .nav-list > li.highlight.active:hover > a::after, .no-skin .sidebar.h-sidebar .nav-list > li.highlight.active:hover > a::before, .sidebar.compact .nav-list li.highlight.active > a::after, .sidebar.compact .nav-list li.highlight.active > a::before { display: none; }
+ .sidebar.compact.menu-min .nav-list li.highlight.active > a::after, .sidebar.compact.menu-min .nav-list li.highlight.active > a::before { display: block; }
+ .sidebar.h-sidebar .nav-list li.highlight.active > a::after, .sidebar.h-sidebar .nav-list li.highlight.active > a::before { display: block; border-width: 8px !important; border-left-color: transparent !important; border-right-color: transparent !important; }
+ .sidebar.h-sidebar .nav-list > li.highlight.active:hover > a::after, .sidebar.h-sidebar .nav-list > li.highlight.active:hover > a::before { display: none !important; }
+}
+.sidebar-scroll .nav-list > li.active.highlight > a::after, .sidebar-scroll .nav-list > li.active.highlight > a::before { display: none !important; }
+.onpage-help-backdrop { position: absolute; z-index: 99990; top: 0px; bottom: 0px; left: 0px; right: 0px; background-color: rgba(0, 0, 0, 0.05); }
+.onpage-help-section { display: block; position: absolute; z-index: 100000; background-color: rgba(255, 255, 255, 0.3); border: 1px dashed rgb(139, 188, 211); border-radius: 4px; transition: background-color 0.2s ease 0s, border-color 0.2s ease 0s; text-align: center; vertical-align: middle; outline: 0px none !important; }
+.onpage-help-section > .ie-hover-fix { display: block; position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; background-color: rgb(255, 255, 255); }
+.onpage-help-section:active, .onpage-help-section:focus { background-color: rgba(201, 216, 234, 0.2); border-color: rgb(119, 172, 196); }
+.onpage-help-section:hover { background-color: rgba(201, 216, 234, 0.4); border-color: rgb(119, 172, 196); border-style: solid; }
+.onpage-help-section > .help-icon-1 { font-size: 18px; display: inline-block; position: absolute; z-index: 1; top: 50%; left: 50%; transform: translate(-50%, -50%); opacity: 0; color: rgb(255, 255, 255); text-shadow: 0px 0px 2px rgb(0, 0, 0); background-color: rgb(133, 184, 219); border: 2px solid rgb(255, 255, 255); border-radius: 100%; box-shadow: 0px 0px 2px 1px rgba(0, 0, 0, 0.4); width: 48px; height: 48px; line-height: 46px; transition: opacity 0.2s ease 0s; }
+.onpage-help-section:active > .help-icon-1, .onpage-help-section:focus > .help-icon-1 { opacity: 0.5; }
+.onpage-help-section:hover > .help-icon-1 { opacity: 1; }
+.onpage-help-section.help-section-small > .help-icon-1 { font-size: 18px; width: 28px; height: 28px; line-height: 26px; border-radius: 12px; }
+.onpage-help-section.help-section-smaller > .help-icon-1 { font-size: 14px; width: 20px; height: 20px; line-height: 17px; border-radius: 8px; }
+.onpage-help-section > .help-icon-2 { position: absolute; z-index: 2; left: -4px; top: -4px; width: 18px; height: 18px; line-height: 16px; display: block; font-size: 16px; color: orange; background-color: rgb(255, 255, 255); border: 1px solid orange; border-radius: 4px; opacity: 1; transition: all 0.2s ease 0s; }
+.onpage-help-section:hover > .help-icon-2 { color: rgb(89, 163, 78); border-color: rgb(89, 163, 78); transform: scale(1.25); }
+.onpage-help-modal { z-index: 100010; }
+.onpage-help-modal + .modal-backdrop { z-index: 100009; }
+.onpage-help-modal-buttons button { border-radius: 100%; border-width: 2px !important; }
+.onpage-help-modal-buttons button.disabled { transform: scale(0.9); }
+.onpage-help-content { max-width: 800px; margin: 0px auto; }
+.code-modal.onpage-help-modal .modal-dialog { margin-top: 6px; margin-bottom: 6px; }
+.code-modal.onpage-help-modal .modal-header { padding-top: 6px; padding-bottom: 6px; }
+.code-modal.onpage-help-modal .modal-body { padding: 10px 12px; }
+.onpage-help-modal pre { border-width: 0px; box-shadow: none; border-radius: 0px; margin-top: 8px; }
+.onpage-help-modal .modal-title code { font-size: 13px; }
+.onpage-help-modal .modal-body { font-size: 14px; }
+@media print {
+ .main-content .nav-search, .navbar, .sidebar { display: none !important; }
+ .footer, .footer .footer-inner, .footer .footer-inner .footer-content { width: 100%; }
+ .main-content { margin-left: 0px !important; margin-right: 0px !important; }
+ .main-content .breadcrumbs { float: right; border-width: 0px !important; }
+ .main-content .breadcrumbs .breadcrumb > li + li::before { content: "/"; }
+ .main-content .breadcrumbs .breadcrumb .home-icon { display: none; }
+ .ace-settings-container, .btn-scroll-up, .label[class*="arrowed"]::after, .label[class*="arrowed"]::before { display: none !important; }
+ .footer { height: auto; position: relative; }
+ .btn, .btn.btn-app { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; border-width: 1px !important; border-radius: 0px !important; color: rgb(85, 85, 85) !important; }
+ .label { border: 1px solid rgb(102, 102, 102) !important; }
+}
diff --git a/at-admin/static/index/ace.min.js b/at-admin/static/index/ace.min.js
new file mode 100644
index 0000000..2dd2fe8
--- /dev/null
+++ b/at-admin/static/index/ace.min.js
@@ -0,0 +1,5 @@
+/*!
+ * Ace v1.4.0
+ */
+if("undefined"==typeof jQuery)throw new Error("Ace's JavaScript requires jQuery");!function(a){"ace"in window||(window.ace={}),"helper"in window.ace||(window.ace.helper={}),"vars"in window.ace||(window.ace.vars={}),window.ace.vars.icon=" ace-icon ",window.ace.vars[".icon"]=".ace-icon",ace.vars.touch="ontouchstart"in window;var b=navigator.userAgent;ace.vars.webkit=!!b.match(/AppleWebKit/i),ace.vars.safari=!!b.match(/Safari/i)&&!b.match(/Chrome/i),ace.vars.android=ace.vars.safari&&!!b.match(/Android/i),ace.vars.ios_safari=!!b.match(/OS ([4-9])(_\d)+ like Mac OS X/i)&&!b.match(/CriOS/i),ace.vars.ie=window.navigator.msPointerEnabled||document.all&&document.querySelector,ace.vars.old_ie=document.all&&!document.addEventListener,ace.vars.very_old_ie=document.all&&!document.querySelector,ace.vars.firefox="MozAppearance"in document.documentElement.style,ace.vars.non_auto_fixed=ace.vars.android||ace.vars.ios_safari,ace.click_event=ace.vars.touch&&jQuery.fn.tap?"tap":"click"}(),function(a,b){a.unCamelCase=function(a){return a.replace(/([a-z])([A-Z])/g,function(a,b,c){return b+"-"+c.toLowerCase()})},a.strToVal=function(a){var b=a.match(/^(?:(true)|(false)|(null)|(\-?[\d]+(?:\.[\d]+)?)|(\[.*\]|\{.*\}))$/i),c=a;if(b)if(b[1])c=!0;else if(b[2])c=!1;else if(b[3])c=null;else if(b[4])c=parseFloat(a);else if(b[5])try{c=JSON.parse(a)}catch(d){}return c},a.getAttrSettings=function(b,c,d){if(b){var e=c instanceof Array?1:2,d=d?d.replace(/([^\-])$/,"$1-"):"";d="data-"+d;var f={};for(var g in c)if(c.hasOwnProperty(g)){var h,i=1==e?c[g]:g,j=a.unCamelCase(i.replace(/[^A-Za-z0-9]{1,}/g,"-")).toLowerCase();if(!(h=b.getAttribute(d+j)))continue;f[i]=a.strToVal(h)}return f}},a.scrollTop=function(){return document.scrollTop||document.documentElement.scrollTop||document.body.scrollTop},a.winHeight=function(){return window.innerHeight||document.documentElement.clientHeight},a.redraw=function(a,b){if(a){var c=a.style.display;a.style.display="none",a.offsetHeight,b!==!0?a.style.display=c:setTimeout(function(){a.style.display=c},10)}}}(ace.helper),jQuery(function(a){try{ace.demo.init()}catch(b){}}),function(a,b){ace.demo={functions:{},init:function(a){var a=!!a&&!0;if("undefined"==typeof requirejs||a)for(var b in ace.demo.functions)ace.demo.functions.hasOwnProperty(b)&&ace.demo.functions[b]()}},ace.demo.functions.basics=function(){ace.vars.non_auto_fixed&&a("body").addClass("mob-safari"),ace.vars.transition=ace.vars.animation||!!a.support.transition},ace.demo.functions.enableSidebar=function(){var b=a(".sidebar");a.fn.ace_sidebar&&b.ace_sidebar(),a.fn.ace_sidebar_scroll&&b.ace_sidebar_scroll({include_toggle:ace.vars.safari||ace.vars.ios_safari}),a.fn.ace_sidebar_hover&&b.ace_sidebar_hover({sub_hover_delay:750,sub_scroll_style:"no-track scroll-thin scroll-margin scroll-visible"})},ace.demo.functions.enableDemoAjax=function(){if(a.fn.ace_ajax){window.Pace&&(window.paceOptions={ajax:!0,document:!0,eventLag:!1});var b={close_active:!0,close_mobile_menu:"#sidebar",close_dropdowns:!0,default_url:"page/index",content_url:function(a){if(!a.match(/^page\//))return!1;var b=document.location.pathname;return b.match(/(\/ajax\/)(index\.html)?/)?b.replace(/(\/ajax\/)(index\.html)?/,"/ajax/content/"+a.replace(/^page\//,"")+".html"):b+"?"+a.replace(/\//,"=")}};b.loading_overlay="body",a("[data-ajax-content=true]").ace_ajax(b),a(window).on("error.ace_ajax",function(){a("[data-ajax-content=true]").each(function(){var b=a(this);b.ace_ajax("working")&&(window.Pace&&Pace.running&&Pace.stop(),b.ace_ajax("stopLoading",!0))})})}},ace.demo.functions.handleScrollbars=function(){var b=!!a.fn.ace_scroll;b&&a(".dropdown-content").ace_scroll({reset:!1,mouseWheelLock:!0}),b&&!ace.vars.old_ie&&(a(window).on("resize.reset_scroll",function(){a(".ace-scroll:not(.scroll-disabled)").not(":hidden").ace_scroll("reset")}),b&&a(document).on("settings.ace.reset_scroll",function(b,c){"sidebar_collapsed"==c&&a(".ace-scroll:not(.scroll-disabled)").not(":hidden").ace_scroll("reset")}))},ace.demo.functions.dropdownAutoPos=function(){a(document).on("click.dropdown.pos",'.dropdown-toggle[data-position="auto"]',function(){var b=a(this).offset(),c=a(this.parentNode);parseInt(b.top+a(this).height())+50>ace.helper.scrollTop()+ace.helper.winHeight()-c.find(".dropdown-menu").eq(0).height()?c.addClass("dropup"):c.removeClass("dropup")})},ace.demo.functions.navbarHelpers=function(){a('.ace-nav [class*="icon-animated-"]').closest("a").one("click",function(){var b=a(this).find('[class*="icon-animated-"]').eq(0),c=b.attr("class").match(/icon\-animated\-([\d\w]+)/);b.removeClass(c[0])}),a(document).on("click",".dropdown-navbar .nav-tabs",function(b){b.stopPropagation();var c;b.target;(c=a(b.target).closest("[data-toggle=tab]"))&&c.length>0&&(c.tab("show"),b.preventDefault(),a(window).triggerHandler("resize.navbar.dropdown"))})},ace.demo.functions.sidebarTooltips=function(){a(".sidebar .nav-list .badge[title],.sidebar .nav-list .badge[title]").each(function(){var b=a(this).attr("class").match(/tooltip\-(?:\w+)/);b=b?b[0]:"tooltip-error",a(this).tooltip({placement:function(b,c){var d=a(c).offset();return parseInt(d.left)
'})})},ace.demo.functions.someBrowserFix=function(){if(ace.vars.webkit){var b=a(".ace-nav").get(0);b&&a(window).on("resize.webkit_fix",function(){ace.helper.redraw(b)})}ace.vars.ios_safari&&a(document).on("ace.settings.ios_fix",function(b,c,d){"navbar_fixed"==c&&(a(document).off("focus.ios_fix blur.ios_fix","input,textarea,.wysiwyg-editor"),1==d&&a(document).on("focus.ios_fix","input,textarea,.wysiwyg-editor",function(){a(window).on("scroll.ios_fix",function(){var b=a("#navbar").get(0);b&&ace.helper.redraw(b)})}).on("blur.ios_fix","input,textarea,.wysiwyg-editor",function(){a(window).off("scroll.ios_fix")}))}).triggerHandler("ace.settings.ios_fix",["navbar_fixed","fixed"==a("#navbar").css("position")])},ace.demo.functions.bsCollapseToggle=function(){a(document).on("hide.bs.collapse show.bs.collapse",function(b){var c=b.target.getAttribute("id"),d=a('a[href*="#'+c+'"]');0==d.length&&(d=a('a[data-target*="#'+c+'"]')),0!=d.length&&d.find(ace.vars[".icon"]).each(function(){var c,d=a(this),e=null,f=null;return(e=d.attr("data-icon-show"))?f=d.attr("data-icon-hide"):(c=d.attr("class").match(/fa\-(.*)\-(up|down)/))&&(e="fa-"+c[1]+"-down",f="fa-"+c[1]+"-up"),e?("show"==b.type?d.removeClass(e).addClass(f):d.removeClass(f).addClass(e),!1):void 0})})},ace.demo.functions.smallDeviceDropdowns=function(){function b(){var b=a(this).find("> .dropdown-menu");if("fixed"==b.css("position")){var d=parseInt(a(window).width()),e=d>320?60:d>240?40:30,f=parseInt(d)-e,g=parseInt(a(window).height())-30,h=parseInt(Math.min(f,320));b.css("width",h);var i=!1,j=0,k=b.find(".tab-pane.active .dropdown-content.ace-scroll");0==k.length?k=b.find(".dropdown-content.ace-scroll"):i=!0;var l=k.closest(".dropdown-menu"),m=b[0].scrollHeight;if(1==k.length){var n=k.find(".scroll-content")[0];n&&(m=n.scrollHeight),j+=l.find(".dropdown-header").outerHeight(),j+=l.find(".dropdown-footer").outerHeight();var o=l.closest(".tab-content");0!=o.length&&(j+=o.siblings(".nav-tabs").eq(0).height())}var p=parseInt(Math.min(g,480,m+j)),q=parseInt(Math.abs((f+e-h)/2)),r=parseInt(Math.abs((g+30-p)/2)),s=parseInt(b.css("z-index"))||0;if(b.css({height:p,left:q,right:"auto",top:r-(i?3:1)}),1==k.length&&(ace.vars.touch?k.ace_scroll("disable").css("max-height",p-j).addClass("overflow-scroll"):k.ace_scroll("update",{size:p-j}).ace_scroll("enable").ace_scroll("reset")),b.css("height",p+(i?7:2)),b.hasClass("user-menu")){b.css("height","");var t=a(this).find(".user-info");1==t.length&&"fixed"==t.css("position")?t.css({left:q,right:"auto",top:r,width:h-2,"max-width":h-2,"z-index":s+1}):t.css({left:"",right:"",top:"",width:"","max-width":"","z-index":""})}a(this).closest(".navbar.navbar-fixed-top").css("z-index",s)}else 0!=b.length&&c.call(this,b)}function c(b){if(b=b||a(this).find("> .dropdown-menu"),b.length>0&&(b.css({width:"",height:"",left:"",right:"",top:""}).find(".dropdown-content").each(function(){ace.vars.touch&&a(this).css("max-height","").removeClass("overflow-scroll");var b=parseInt(a(this).attr("data-size")||0)||a.fn.ace_scroll.defaults.size;a(this).ace_scroll("update",{size:b}).ace_scroll("enable").ace_scroll("reset")}),b.hasClass("user-menu"))){a(this).find(".user-info").css({left:"",right:"",top:"",width:"","max-width":"","z-index":""})}a(this).closest(".navbar").css("z-index","")}ace.vars.old_ie||a(document).on("shown.bs.dropdown.navbar",".ace-nav > li.dropdown-modal",function(c){b.call(this);var d=this;a(window).on("resize.navbar.dropdown",function(){b.call(d)})}).on("hidden.bs.dropdown.navbar",".ace-nav > li.dropdown-modal",function(b){a(window).off("resize.navbar.dropdown"),c.call(this)})}}(jQuery),function(a,b){var c=a(".btn-scroll-up");if(c.length>0){var d=!1;a(window).on("scroll.scroll_btn",function(){var a=ace.helper.scrollTop(),b=ace.helper.winHeight(),e=document.body.scrollHeight;a>parseInt(b/4)||a>0&&e>=b&&b+a>=e-1?d||(c.addClass("display"),d=!0):d&&(c.removeClass("display"),d=!1)}).triggerHandler("scroll.scroll_btn"),c.on(ace.click_event,function(){var b=Math.min(500,Math.max(100,parseInt(ace.helper.scrollTop()/3)));return a("html,body").animate({scrollTop:0},b),!1})}}(window.jQuery),function(a,b){function c(b,c){function e(b){var c="",d=a(".breadcrumb");if(d.length>0&&d.is(":visible")){d.find("> li:not(:first-child)").remove();var e=0;b.parents(".nav li").each(function(){var b=a(this).find("> a"),f=b.clone();f.find("i,.fa,.glyphicon,.ace-icon,.menu-icon,.badge,.label").remove();var g=f.text();f.remove();var h=b.attr("href");if(0==e){var i=a(' ').appendTo(d);i.text(g),c=g}else{var i=a(" ").insertAfter(d.find("> li:first-child"));i.find("a").attr("href",h).text(g)}e++})}return c}function f(b){var c=g.find(".ajax-append-title");if(c.length>0)document.title=c.text(),c.remove();else if(b.length>0){var d=a.trim(String(document.title).replace(/^(.*)[\-]/,""));d&&(d=" - "+d),b=a.trim(b)+d}}var g=a(b),h=this;g.attr("data-ajax-content","true");var i=ace.helper.getAttrSettings(b,a.fn.ace_ajax.defaults);this.settings=a.extend({},a.fn.ace_ajax.defaults,c,i);var j=!1,k=a();this.force_reload=!1,this.loadUrl=function(a,b,c){var d=!1;a=a.replace(/^(\#\!)?\#/,""),this.force_reload=b===!1,"function"==typeof this.settings.content_url&&(d=this.settings.content_url(a)),"string"==typeof d&&this.getUrl(d,a,c)},this.loadAddr=function(a,b,c){this.force_reload=c===!1,this.getUrl(a,b,!1)},this.reload=function(){var b=a.trim(window.location.hash);!b&&this.settings.default_url&&(b=this.settings.default_url),this.loadUrl(b,!1)},this.post=function(b,c,d,e){var b=b||a.trim(location.href.replace(location.hash,""));if(b){var c=c||{},d=d||!1;this.getUrl(b,null,!1,"POST",c,d,e)}},this.getUrl=function(b,c,d,i,l,m,n){if(!j){var o,i=i||"GET",m="GET"==i||"POST"==i&&1==m,l=l||null;if(g.trigger(o=a.Event("ajaxloadstart"),{url:b,hash:c,method:i,data:l}),!o.isDefaultPrevented()){h.startLoading();var p="GET"==i?{url:b,cache:!this.force_reload}:{url:b,method:"POST",data:l};"POST"==i&&"object"==typeof n&&(p=a.extend({},p,n)),a.ajax(p).error(function(){g.trigger("ajaxloaderror",{url:b,hash:c,method:i,data:l}),h.stopLoading(!0)}).done(function(j){if(g.trigger("ajaxloaddone",{url:b,hash:c,method:i,data:l}),"POST"==i){var n;g.trigger(n=a.Event("ajaxpostdone",{url:b,data:l,result:j})),n.isDefaultPrevented()&&(m=!1)}var o=null,p="";if("function"==typeof h.settings.update_active)o=h.settings.update_active.call(null,c,b,i,m);else if(h.settings.update_active===!0&&c&&(o=a('a[data-url="'+c+'"]'),o.length>0)){var q=o.closest(".nav");if(q.length>0){q.find(".active").each(function(){var b="active";(a(this).hasClass("hover")||h.settings.close_active)&&(b+=" open"),a(this).removeClass(b),h.settings.close_active&&a(this).find(" > .submenu").css("display","")});o.closest("li").addClass("active").parents(".nav li").addClass("active open");q.closest(".sidebar[data-sidebar-scroll=true]").each(function(){var b=a(this);b.ace_sidebar_scroll("reset"),1==d&&b.ace_sidebar_scroll("scroll_to_active")})}}"function"==typeof h.settings.update_breadcrumbs?p=h.settings.update_breadcrumbs.call(null,c,b,o,i,m):h.settings.update_breadcrumbs===!0&&null!=o&&o.length>0&&(p=e(o)),k.addClass("content-loaded").detach(),m&&(j=String(j).replace(/<(title|link)([\s\>])/gi,'/gi,"
"),g.empty().html(j)),a(h.settings.loading_overlay||g).append(k),m&&setTimeout(function(){a("head").find("link.ace-ajax-stylesheet").remove();for(var b=["link.ace-main-stylesheet","link#main-ace-style",'link[href*="/ace.min.css"]','link[href*="/ace.css"]'],c=[],d=0;d0));d++);g.find(".ajax-append-link").each(function(b){var d=a(this);if(d.attr("href")){var e=jQuery(" ",{type:"text/css",rel:"stylesheet","class":"ace-ajax-stylesheet"});c.length>0?e.insertBefore(c):e.appendTo("head"),e.attr("href",d.attr("href"))}d.remove()})},10),"function"==typeof h.settings.update_title?h.settings.update_title.call(null,c,b,p,i,m):h.settings.update_title===!0&&"GET"==i&&f(p),!d&&m&&a("html,body").animate({scrollTop:0},250),g.trigger("ajaxloadcomplete",{url:b,hash:c,method:i,data:l});var r=/\.(?:\s*)ace(?:_a|A)jax(?:\s*)\((?:\s*)(?:\'|\")loadScripts(?:\'|\")/;j.match(r)?h.stopLoading():h.stopLoading(!0)})}}};var l=!1,m=null;this.startLoading=function(){j||(j=!0,this.settings.loading_overlay||"static"!=g.css("position")||(g.css("position","relative"),l=!0),k.remove(),k=a(' '+this.settings.loading_text+"
"),"body"==this.settings.loading_overlay?a("body").append(k.addClass("ajax-overlay-body")):this.settings.loading_overlay?a(this.settings.loading_overlay).append(k):g.append(k),this.settings.max_load_wait!==!1&&(m=setTimeout(function(){if(m=null,j){var b;g.trigger(b=a.Event("ajaxloadlong")),b.isDefaultPrevented()||h.stopLoading(!0)}},1e3*this.settings.max_load_wait)))},this.stopLoading=function(a){a===!0?(j=!1,k.remove(),l&&(g.css("position",""),l=!1),null!=m&&(clearTimeout(m),m=null)):(k.addClass("almost-loaded"),g.one("ajaxscriptsloaded.inner_call",function(){h.stopLoading(!0)}))},this.working=function(){return j},this.loadScripts=function(b,c){var b=b||[];a.ajaxPrefilter("script",function(a){a.cache=!0}),setTimeout(function(){function e(){"function"==typeof c&&c(),a('.btn-group[data-toggle="buttons"] > .btn').button(),g.trigger("ajaxscriptsloaded")}function f(a){a+=1,a=i&&j?e():f(c)}):f(c)}for(var i=0,k=0,l=0;l0?h():e()},10)},a(window).off("hashchange.ace_ajax").on("hashchange.ace_ajax",function(b,c){var d=a.trim(window.location.hash);if(d&&0!=d.length){if(h.settings.close_mobile_menu)try{a(h.settings.close_mobile_menu).ace_sidebar("mobileHide")}catch(b){}h.settings.close_dropdowns&&a(".dropdown.open .dropdown-toggle").dropdown("toggle"),h.loadUrl(d,null,c)}}).trigger("hashchange.ace_ajax",[!0]);var n=a.trim(window.location.hash);!n&&this.settings.default_url&&(window.location.hash=this.settings.default_url)}var d={};a.fn.aceAjax=a.fn.ace_ajax=function(d,e,f,g,h){var i,j=this.each(function(){var j=a(this),k=j.data("ace_ajax"),l="object"==typeof d&&d;k||j.data("ace_ajax",k=new c(this,l)),"string"==typeof d&&"function"==typeof k[d]&&(i=h!==b?k[d](e,f,g,h):g!==b?k[d](e,f,g):f!==b?k[d](e,f):k[d](e))});return i===b?j:i},a.fn.aceAjax.defaults=a.fn.ace_ajax.defaults={content_url:!1,default_url:!1,loading_icon:"fa fa-spin fa-spinner fa-2x orange",loading_text:"",loading_overlay:null,update_breadcrumbs:!0,update_title:!0,update_active:!0,close_active:!1,max_load_wait:!1,close_mobile_menu:!1,close_dropdowns:!1}}(window.jQuery),function(a,b){if(ace.vars.touch){var c="touchstart MSPointerDown pointerdown",d="touchend touchcancel MSPointerUp MSPointerCancel pointerup pointercancel",e="touchmove MSPointerMove MSPointerHover pointermove";a.event.special.ace_drag={setup:function(){var f=0,g=a(this);g.on(c,function(c){function h(a){if(k){var b=a.originalEvent.touches?a.originalEvent.touches[0]:a;if(i={coords:[b.pageX,b.pageY]},k&&i&&(m=0,n=0,l=Math.abs(n=k.coords[1]-i.coords[1])>f&&Math.abs(m=k.coords[0]-i.coords[0])<=Math.abs(n)?n>0?"up":"down":Math.abs(m=k.coords[0]-i.coords[0])>f&&Math.abs(n)<=Math.abs(m)?m>0?"left":"right":!1,l!==!1)){var c={cancel:!1};k.origin.trigger({type:"ace_drag",direction:l,dx:m,dy:n,retval:c}),0==c.cancel&&a.preventDefault()}k.coords[0]=i.coords[0],k.coords[1]=i.coords[1]}}var i,j=c.originalEvent.touches?c.originalEvent.touches[0]:c,k={coords:[j.pageX,j.pageY],origin:a(c.target)},l=!1,m=0,n=0;g.on(e,h).one(d,function(a){g.off(e,h),k=i=b})})}}}}(window.jQuery),function(a,b){function c(b,c){function e(){this.mobile_view=this.mobile_style<4&&this.is_mobile_view(),this.collapsible=!this.mobile_view&&this.is_collapsible(),this.minimized=!this.collapsible&&this.$sidebar.hasClass(k)||3==this.mobile_style&&this.mobile_view&&this.$sidebar.hasClass(l),this.horizontal=!(this.mobile_view||this.collapsible)&&this.$sidebar.hasClass(n)}var f=this;this.$sidebar=a(b),this.$sidebar.attr("data-sidebar","true"),this.$sidebar.attr("id")||this.$sidebar.attr("id","id-sidebar-"+ ++d);var g=ace.helper.getAttrSettings(b,a.fn.ace_sidebar.defaults,"sidebar-");this.settings=a.extend({},a.fn.ace_sidebar.defaults,c,g),this.minimized=!1,this.collapsible=!1,this.horizontal=!1,this.mobile_view=!1,this.vars=function(){return{minimized:this.minimized,collapsible:this.collapsible,horizontal:this.horizontal,mobile_view:this.mobile_view}},this.get=function(a){return this.hasOwnProperty(a)?this[a]:void 0},this.set=function(a,b){this.hasOwnProperty(a)&&(this[a]=b)},this.ref=function(){return this};var h=function(b,c){var d,e,f=a(this).find(ace.vars[".icon"]);if(f.length>0){d=f.attr("data-icon1"),e=f.attr("data-icon2"),"undefined"!=typeof b?b?f.removeClass(d).addClass(e):f.removeClass(e).addClass(d):f.toggleClass(d).toggleClass(e);try{c!==!1&&ace.settings.saveState(f.get(0))}catch(g){}}},i=function(){var b=f.$sidebar.find(".sidebar-collapse");return 0==b.length&&(b=a('.sidebar-collapse[data-target="#'+(f.$sidebar.attr("id")||"")+'"]')),b=0!=b.length?b[0]:null};this.toggleMenu=function(c,d){if(this.collapsible)return!1;this.minimized=!this.minimized;var d=!(c===!1||d===!1);this.minimized?this.$sidebar.addClass("menu-min"):this.$sidebar.removeClass("menu-min");try{d&&ace.settings.saveState(b,"class","menu-min",this.minimized)}catch(e){}return c||(c=i()),c&&h.call(c,this.minimized,d),ace.vars.old_ie&&ace.helper.redraw(b),a(document).trigger("settings.ace",["sidebar_collapsed",this.minimized,b,d]),this.minimized?this.$sidebar.trigger(a.Event("collapse.ace.sidebar")):this.$sidebar.trigger(a.Event("expand.ace.sidebar")),!0},this.collapse=function(a,b){this.collapsible||(this.minimized=!1,this.toggleMenu(a,b))},this.expand=function(a,b){this.collapsible||(this.minimized=!0,this.toggleMenu(a,b))},this.showResponsive=function(){this.$sidebar.removeClass(l).removeClass(m)},this.toggleResponsive=function(b,c){if(this.mobile_view&&3==this.mobile_style){if(this.$sidebar.hasClass("menu-min")){this.$sidebar.removeClass("menu-min");var d=i();d&&h.call(d)}var c="boolean"==typeof c?c:"boolean"==typeof b?b:this.$sidebar.hasClass(l);if(c?this.$sidebar.addClass(m).removeClass(l):this.$sidebar.removeClass(m).addClass(l),this.minimized=!c,b&&"object"==typeof b||(b=this.$sidebar.find(".sidebar-expand"),0==b.length&&(b=a('.sidebar-expand[data-target="#'+(this.$sidebar.attr("id")||"")+'"]')),b=0!=b.length?b[0]:null),b){var e,g,j=a(b).find(ace.vars[".icon"]);j.length>0&&(e=j.attr("data-icon1"),g=j.attr("data-icon2"),c?j.removeClass(e).addClass(g):j.removeClass(g).addClass(e))}c?f.$sidebar.trigger(a.Event("mobileShow.ace.sidebar")):f.$sidebar.trigger(a.Event("mobileHide.ace.sidebar")),a(document).triggerHandler("settings.ace",["sidebar_collapsed",this.minimized])}},this.is_collapsible=function(){var b;return this.$sidebar.hasClass("navbar-collapse")&&null!=(b=a('.navbar-toggle[data-target="#'+(this.$sidebar.attr("id")||"")+'"]').get(0))&&b.scrollHeight>0},this.is_mobile_view=function(){var b;return null!=(b=a('.menu-toggler[data-target="#'+(this.$sidebar.attr("id")||"")+'"]').get(0))&&b.scrollHeight>0};var j=!1;this.show=function(b,c,d){if(d=d!==!1,d&&j)return!1;var e,f=a(b);if(f.trigger(e=a.Event("show.ace.submenu")),e.isDefaultPrevented())return!1;d&&(j=!0),c="undefined"!=typeof c?c:this.settings.duration,f.css({height:0,overflow:"hidden",display:"block"}).removeClass("nav-hide").addClass("nav-show").parent().addClass("open"),b.scrollTop=0;var g=function(b,c){b&&b.stopPropagation(),f.css({"transition-property":"","transition-duration":"",overflow:"",height:""}),c!==!1&&f.trigger(a.Event("shown.ace.submenu")),d&&(j=!1)},h=b.scrollHeight;return 0!=c&&0!=h&&a.support.transition.end?(f.css({height:h,"transition-property":"height","transition-duration":c/1e3+"s"}).one(a.support.transition.end,g),ace.vars.android&&setTimeout(function(){g(null,!1),ace.helper.redraw(b)},c+20)):g(),!0},this.hide=function(b,c,d){if(d=d!==!1,d&&j)return!1;var e,f=a(b);if(f.trigger(e=a.Event("hide.ace.submenu")),e.isDefaultPrevented())return!1;d&&(j=!0),c="undefined"!=typeof c?c:this.settings.duration;var g=b.scrollHeight;f.css({height:g,overflow:"hidden",display:"block"}).parent().removeClass("open"),b.offsetHeight;var h=function(b,c){b&&b.stopPropagation(),f.css({display:"none",overflow:"",height:"","transition-property":"","transition-duration":""}).removeClass("nav-show").addClass("nav-hide"),c!==!1&&f.trigger(a.Event("hidden.ace.submenu")),d&&(j=!1)};return 0!=c&&0!=g&&a.support.transition.end?(f.css({height:0,"transition-property":"height","transition-duration":c/1e3+"s"}).one(a.support.transition.end,h),ace.vars.android&&setTimeout(function(){h(null,!1),ace.helper.redraw(b)},c+20)):h(),!0},this.toggle=function(a,b){if(b=b||f.settings.duration,0==a.scrollHeight){if(this.show(a,b))return 1}else if(this.hide(a,b))return-1;return 0},this.mobileToggle=function(a){this.mobile_view?1==this.mobile_style||2==this.mobile_style?this.toggleMobile("object"==typeof a?a:null,"boolean"==typeof a?a:null):3==this.mobile_style&&this.toggleResponsive("object"==typeof a?a:null,"boolean"==typeof a?a:null):this.collapsible&&this.toggleCollapsible("object"==typeof a?a:null,"boolean"==typeof a?a:null)},this.mobileShow=function(){this.mobileToggle(!0)},this.mobileHide=function(){this.mobileToggle(!1)},this.toggleMobile=function(b,c){if(1==this.mobile_style||2==this.mobile_style){var c="boolean"==typeof c?c:"boolean"==typeof b?b:!this.$sidebar.hasClass("display");b&&"object"==typeof b||(b=a('.menu-toggler[data-target="#'+(this.$sidebar.attr("id")||"")+'"]'),b=0!=b.length?b[0]:null),c?(this.$sidebar.addClass("display"),b&&a(b).addClass("display")):(this.$sidebar.removeClass("display"),b&&a(b).removeClass("display")),c?f.$sidebar.trigger(a.Event("mobileShow.ace.sidebar")):f.$sidebar.trigger(a.Event("mobileHide.ace.sidebar"))}},this.toggleCollapsible=function(b,c){if(4==this.mobile_style){var c="boolean"==typeof c?c:"boolean"==typeof b?b:!this.$sidebar.hasClass("in");c?this.$sidebar.collapse("show"):(this.$sidebar.removeClass("display"),this.$sidebar.collapse("hide")),c?f.$sidebar.trigger(a.Event("mobileShow.ace.sidebar")):f.$sidebar.trigger(a.Event("mobileHide.ace.sidebar"))}};var k="menu-min",l="responsive-min",m="responsive-max",n="h-sidebar",o=function(){this.mobile_style=1,this.$sidebar.hasClass("responsive")&&!a('.menu-toggler[data-target="#'+this.$sidebar.attr("id")+'"]').hasClass("navbar-toggle")?this.mobile_style=2:this.$sidebar.hasClass(l)?this.mobile_style=3:this.$sidebar.hasClass("navbar-collapse")&&(this.mobile_style=4)};o.call(f),a(window).on("resize.sidebar.vars",function(){e.call(f)}).triggerHandler("resize.sidebar.vars"),this.$sidebar.on(ace.click_event+".ace.submenu",".nav-list",function(b){var c=this,d=a(b.target).closest("a");if(d&&0!=d.length){var e=f.minimized&&!f.collapsible;if(d.hasClass("dropdown-toggle")){b.preventDefault();var g=d.siblings(".submenu").get(0);if(!g)return!1;var h=a(g),i=0,j=g.parentNode.parentNode;if(e&&j==c||h.parent().hasClass("hover")&&"absolute"==h.css("position")&&!f.collapsible)return!1;var k=0==g.scrollHeight;return k&&f.settings.hide_open_subs&&a(j).find("> .open > .submenu").each(function(){this==g||a(this.parentNode).hasClass("active")||(i-=this.scrollHeight,f.hide(this,f.settings.duration,!1))}),k?(f.show(g,f.settings.duration),0!=i&&(i+=g.scrollHeight)):(f.hide(g,f.settings.duration),i-=g.scrollHeight),0!=i&&("true"!=f.$sidebar.attr("data-sidebar-scroll")||f.minimized||f.$sidebar.ace_sidebar_scroll("prehide",i)),!1}if("tap"==ace.click_event&&e&&d.get(0).parentNode.parentNode==c){var l=d.find(".menu-text").get(0);if(null!=l&&b.target!=l&&!a.contains(l,b.target))return b.preventDefault(),!1}if(ace.vars.ios_safari&&"false"!==d.attr("data-link"))return document.location=d.attr("href"),b.preventDefault(),!1}})}var d=0;a(document).on(ace.click_event+".ace.menu",".menu-toggler",function(b){var c=a(this),d=a(c.attr("data-target"));if(0!=d.length){b.preventDefault(),d.ace_sidebar("mobileToggle",this);var e=ace.click_event+".ace.autohide",f="true"===d.attr("data-auto-hide");return c.hasClass("display")?(f&&a(document).on(e,function(b){return d.get(0)==b.target||a.contains(d.get(0),b.target)?void b.stopPropagation():(d.ace_sidebar("mobileToggle",this,!1),void a(document).off(e))}),"true"==d.attr("data-sidebar-scroll")&&d.ace_sidebar_scroll("reset")):f&&a(document).off(e),!1}}).on(ace.click_event+".ace.menu",".sidebar-collapse",function(b){var c=a(this).attr("data-target"),d=null;c&&(d=a(c)),null!=d&&0!=d.length||(d=a(this).closest(".sidebar")),0!=d.length&&(b.preventDefault(),d.ace_sidebar("toggleMenu",this))}).on(ace.click_event+".ace.menu",".sidebar-expand",function(b){var c=a(this).attr("data-target"),d=null;if(c&&(d=a(c)),null!=d&&0!=d.length||(d=a(this).closest(".sidebar")),0!=d.length){var e=this;b.preventDefault(),d.ace_sidebar("toggleResponsive",this);var f=ace.click_event+".ace.autohide";"true"===d.attr("data-auto-hide")&&(d.hasClass(responsive_max_class)?a(document).on(f,function(b){return d.get(0)==b.target||a.contains(d.get(0),b.target)?void b.stopPropagation():(d.ace_sidebar("toggleResponsive",e),void a(document).off(f))}):a(document).off(f))}}),a.fn.ace_sidebar=function(d,e,f){var g,h=this.each(function(){var h=a(this),i=h.data("ace_sidebar"),j="object"==typeof d&&d;i||h.data("ace_sidebar",i=new c(this,j)),"string"==typeof d&&"function"==typeof i[d]&&(g=e instanceof Array?i[d].apply(i,e):f!==b?i[d](e,f):i[d](e))});return g===b?h:g},a.fn.ace_sidebar.defaults={duration:300,hide_open_subs:!0}}(window.jQuery),function(a,b){function c(b,c){var f,g,h,i,j=this,k=a(window),l=a(b);if(f=l.find(".nav-list"),g=f.get(0)){var m=ace.helper.getAttrSettings(b,a.fn.ace_sidebar_scroll.defaults);this.settings=a.extend({},a.fn.ace_sidebar_scroll.defaults,c,m);var n=j.settings.scroll_to_active,o=l.ace_sidebar("ref");l.attr("data-sidebar-scroll","true");var p=null,q=null,r=null,s=null,t=null,u=null;this.is_scrolling=!1;var v=!1;this.sidebar_fixed=e(b,"fixed");var w,x,y=function(){var a=f.parent().offset();return j.sidebar_fixed&&(a.top-=ace.helper.scrollTop()),k.innerHeight()-a.top-(j.settings.include_toggle?0:h.outerHeight())+1},z=function(){return g.clientHeight},A=function(b){if(!v&&j.sidebar_fixed&&(f=l.find(".nav-list"),h=l.find(".sidebar-toggle").eq(0),i=l.find(".sidebar-shortcuts").eq(0),g=f.get(0))){f.wrap('
'),f.after(""),f.wrap('
'),j.settings.include_toggle||h.css({"z-index":1}),j.settings.include_shortcuts||i.css({"z-index":99}),p=f.parent().next().ace_scroll({size:y(),mouseWheelLock:!0,hoverReset:!1,dragEvent:!0,styleClass:j.settings.scroll_style,touchDrag:!1}).closest(".ace-scroll").addClass("nav-scroll"),u=p.data("ace_scroll"),q=p.find(".scroll-content").eq(0),r=q.find(" > div").eq(0),t=a(u.get_track()),s=t.find(".scroll-bar").eq(0),j.settings.include_shortcuts&&0!=i.length&&(f.parent().prepend(i).wrapInner("
"),f=f.parent()),j.settings.include_toggle&&0!=h.length&&(f.append(h),f.closest(".nav-wrap").addClass("nav-wrap-t")),f.css({position:"relative"}),1==j.settings.scroll_outside&&p.addClass("scrollout"),g=f.get(0),g.style.top=0,q.on("scroll.nav",function(){g.style.top=-1*this.scrollTop+"px"}),f.on(a.event.special.mousewheel?"mousewheel.ace_scroll":"mousewheel.ace_scroll DOMMouseScroll.ace_scroll",function(a){return j.is_scrolling&&u.is_active()?p.trigger(a):!j.settings.lock_anyway}),f.on("mouseenter.ace_scroll",function(){t.addClass("scroll-hover")}).on("mouseleave.ace_scroll",function(){t.removeClass("scroll-hover")});var c=q.get(0);if(f.on("ace_drag.nav",function(b){if(!j.is_scrolling||!u.is_active())return void(b.retval.cancel=!0);if(0!=a(b.target).closest(".can-scroll").length)return void(b.retval.cancel=!0);if("up"==b.direction||"down"==b.direction){u.move_bar(!0);var d=b.dy;d=parseInt(Math.min(w,d)),Math.abs(d)>2&&(d=2*d),0!=d&&(c.scrollTop=c.scrollTop+d,g.style.top=-1*c.scrollTop+"px")}}),j.settings.smooth_scroll&&f.on("touchstart.nav MSPointerDown.nav pointerdown.nav",function(a){f.css("transition-property","none"),s.css("transition-property","none")}).on("touchend.nav touchcancel.nav MSPointerUp.nav MSPointerCancel.nav pointerup.nav pointercancel.nav",function(a){f.css("transition-property","top"),s.css("transition-property","top")}),d&&!j.settings.include_toggle){var e=h.get(0);e&&q.on("scroll.safari",function(){ace.helper.redraw(e)})}if(v=!0,1==b&&(j.reset(),n&&j.scroll_to_active(),n=!1),"number"==typeof j.settings.smooth_scroll&&j.settings.smooth_scroll>0&&(f.css({"transition-property":"top","transition-duration":(j.settings.smooth_scroll/1e3).toFixed(2)+"s"}),s.css({"transition-property":"top","transition-duration":(j.settings.smooth_scroll/1500).toFixed(2)+"s"}),p.on("drag.start",function(a){a.stopPropagation(),f.css("transition-property","none")}).on("drag.end",function(a){a.stopPropagation(),f.css("transition-property","top")})),ace.vars.android){var k=ace.helper.scrollTop();2>k&&(window.scrollTo(k,0),setTimeout(function(){j.reset()},20));var m,o=ace.helper.winHeight();a(window).on("scroll.ace_scroll",function(){j.is_scrolling&&u.is_active()&&(m=ace.helper.winHeight(),m!=o&&(o=m,j.reset()))})}}};this.scroll_to_active=function(){if(u&&u.is_active())try{var a,b=o.vars(),c=l.find(".nav-list");b.minimized&&!b.collapsible?a=c.find("> .active"):(a=f.find("> .active.hover"),0==a.length&&(a=f.find(".active:not(.open)")));var d=a.outerHeight();c=c.get(0);for(var e=a.get(0);e!=c;)d+=e.offsetTop,e=e.parentNode;var h=d-p.height();h>0&&(g.style.top=-h+"px",q.scrollTop(h))}catch(i){}},this.reset=function(a){if(a===!0&&(this.sidebar_fixed=e(b,"fixed")),!this.sidebar_fixed)return void this.disable();v||A();var c=o.vars(),d=!c.collapsible&&!c.horizontal&&(w=y())<(x=g.clientHeight);this.is_scrolling=!0,d&&(r.css({height:x,width:8}),p.prev().css({"max-height":w}),u.update({size:w}),u.enable(),u.reset()),d&&u.is_active()?l.addClass("sidebar-scroll"):this.is_scrolling&&this.disable()},this.disable=function(){this.is_scrolling=!1,p&&(p.css({height:"","max-height":""}),r.css({height:"",width:""}),p.prev().css({"max-height":""}),u.disable()),parseInt(g.style.top)<0&&j.settings.smooth_scroll&&a.support.transition.end?f.one(a.support.transition.end,function(){l.removeClass("sidebar-scroll"),f.off(".trans")}):l.removeClass("sidebar-scroll"),g.style.top=0},
+this.prehide=function(a){if(this.is_scrolling&&!o.get("minimized"))if(z()+aa){var b=q.scrollTop()+a;if(0>b)return;g.style.top=-1*b+"px"}},this._reset=function(a){a===!0&&(this.sidebar_fixed=e(b,"fixed")),ace.vars.webkit?setTimeout(function(){j.reset()},0):this.reset()},this.set_hover=function(){t&&t.addClass("scroll-hover")},this.get=function(a){return this.hasOwnProperty(a)?this[a]:void 0},this.set=function(a,b){this.hasOwnProperty(a)&&(this[a]=b)},this.ref=function(){return this},this.updateStyle=function(a){null!=u&&u.update({styleClass:a})},l.on("hidden.ace.submenu.sidebar_scroll shown.ace.submenu.sidebar_scroll",".submenu",function(a){a.stopPropagation(),o.get("minimized")||(j._reset(),"shown"==a.type&&j.set_hover())}),A(!0)}}var d=ace.vars.safari&&navigator.userAgent.match(/version\/[1-5]/i),e="getComputedStyle"in window?function(a,b){return a.offsetHeight,window.getComputedStyle(a).position==b}:function(b,c){return b.offsetHeight,a(b).css("position")==c};a(document).on("settings.ace.sidebar_scroll",function(b,c,d){a(".sidebar[data-sidebar-scroll=true]").each(function(){var b=a(this),d=b.ace_sidebar_scroll("ref");if("sidebar_collapsed"==c&&e(this,"fixed"))"true"==b.attr("data-sidebar-hover")&&b.ace_sidebar_hover("reset"),d._reset();else if("sidebar_fixed"===c||"navbar_fixed"===c){var f=d.get("is_scrolling"),g=e(this,"fixed");d.set("sidebar_fixed",g),g&&!f?d._reset():g||d.disable()}})}),a(window).on("resize.ace.sidebar_scroll",function(){a(".sidebar[data-sidebar-scroll=true]").each(function(){var b=a(this);"true"==b.attr("data-sidebar-hover")&&b.ace_sidebar_hover("reset");var c=a(this).ace_sidebar_scroll("ref"),d=e(this,"fixed");c.set("sidebar_fixed",d),c._reset()})}),a.fn.ace_sidebar_scroll||(a.fn.ace_sidebar_scroll=function(d,e){var f,g=this.each(function(){var b=a(this),g=b.data("ace_sidebar_scroll"),h="object"==typeof d&&d;g||b.data("ace_sidebar_scroll",g=new c(this,h)),"string"==typeof d&&"function"==typeof g[d]&&(f=g[d](e))});return f===b?g:f},a.fn.ace_sidebar_scroll.defaults={scroll_to_active:!0,include_shortcuts:!0,include_toggle:!1,smooth_scroll:150,scroll_outside:!1,scroll_style:"",lock_anyway:!1})}(window.jQuery),function(a,b){function c(b,c){function h(b){var c=b,d=a(c),e=null,f=!1;this.show=function(){null!=e&&clearTimeout(e),e=null,d.addClass("hover-show hover-shown"),f=!0;for(var a=0;a .submenu").get(0);a&&j(a,"hide")},this.hideDelay=function(a){null!=e&&clearTimeout(e),d.removeClass("hover-shown"),e=setTimeout(function(){f=!1,d.removeClass("hover-show hover-flip"),e=null;var b=d.find("> .submenu").get(0);b&&j(b,"hide"),"function"==typeof a&&a.call(this)},m.settings.sub_hover_delay)},this.is_visible=function(){return f}}function i(b){var c=a(b).data("subHide");return c||a(b).data("subHide",c=new h(b)),c}function j(b,c){var d=a(b).data("ace_scroll");return d?"string"==typeof c?(d[c](),!0):d:!1}function k(c){var d=a(this),f=a(c);c.style.top="",c.style.bottom="";var g=null;q.minimized&&(g=d.find(".menu-text").get(0))&&(g.style.marginTop="");var h=ace.helper.scrollTop(),i=0,k=h;w&&(i=b.offsetTop,k+=i+1);var m=d.offset();m.top=parseInt(m.top);var n,o=0;c.style.maxHeight="";var r=c.scrollHeight,n=d.height();g&&(o=n,m.top+=o);var t=parseInt(m.top+r),v=0,y=u.height(),z=parseInt(m.top-k-o),A=y,B=q.horizontal,C=!1;B&&this.parentNode==p&&(v=0,m.top+=d.height(),C=!0),!C&&(v=t-(y+h))>=0&&(v=z>v?v:z,0==v&&(v=20),z-v>10&&(v+=parseInt(Math.min(25,z-v))),m.top+(n-o)>t-v&&(v-=m.top+(n-o)-(t-v)),v>0&&(c.style.top=-v+"px",g&&(g.style.marginTop=-v+"px"))),0>v&&(v=0);var D=v>0&&v>n-20;if(D?d.addClass("pull_up"):d.removeClass("pull_up"),B)if(d.parent().parent().hasClass("hover-flip"))d.addClass("hover-flip");else{var E=f.offset(),F=f.width(),G=u.width();E.left+F>G&&d.addClass("hover-flip")}var H=d.hasClass("hover")&&!q.mobile_view;if(!(H&&f.find("> li > .submenu").length>0)){var I=A-(m.top-h)+v,J=v-I;if(J>0&&n>J&&(I+=parseInt(Math.max(n,n-J))),I-=5,!(90>I)){var K=!1;if(e)f.addClass("sub-scroll").css("max-height",I+"px");else{if(K=j(c),0==K){f.ace_scroll({observeContent:!0,detached:!0,updatePos:!1,reset:!0,mouseWheelLock:!0,styleClass:l.settings.sub_scroll_style}),K=j(c);var L=K.get_track();L&&f.after(L)}K.update({size:I})}if(x=I,!e&&K){I>14&&r-I>4?(K.enable(),K.reset()):K.disable();var L=K.get_track();if(L){L.style.top=-(v-o-1)+"px";var m=f.position(),M=m.left;M+=s?2:f.outerWidth()-K.track_size(),L.style.left=parseInt(M)+"px",C&&(L.style.left=parseInt(M-2)+"px",L.style.top=parseInt(m.top)+(g?o-2:0)+"px")}}ace.vars.safari&&ace.helper.redraw(c)}}}var l=this,m=this,n=ace.helper.getAttrSettings(b,a.fn.ace_sidebar_hover.defaults);this.settings=a.extend({},a.fn.ace_sidebar_hover.defaults,c,n);var o=a(b),p=o.find(".nav-list").get(0);o.attr("data-sidebar-hover","true"),g.push(o);var q={},r=ace.vars.old_ie,s=!1,t=l.settings.sub_hover_delay||!1;d&&t&&(l.settings.sub_hover_delay=parseInt(Math.max(l.settings.sub_hover_delay,2500)));var u=a(window),v=a(".navbar").eq(0),w="fixed"==v.css("position");this.update_vars=function(){w="fixed"==v.css("position")},l.dirty=!1,this.reset=function(){0!=l.dirty&&(l.dirty=!1,o.find(".submenu").each(function(){var b=a(this),c=b.parent();b.css({top:"",bottom:"","max-height":""}),b.hasClass("ace-scroll")?b.ace_scroll("disable"):b.removeClass("sub-scroll"),f(this,"absolute")?b.addClass("can-scroll"):b.removeClass("can-scroll"),c.removeClass("pull_up").find(".menu-text:first").css("margin-top","")}),o.find(".hover-show").removeClass("hover-show hover-shown hover-flip"))},this.updateStyle=function(a){sub_scroll_style=a,o.find(".submenu.ace-scroll").ace_scroll("update",{styleClass:a})},this.changeDir=function(a){s="right"===a};var x=-1;e||o.on("hide.ace.submenu.sidebar_hover",".submenu",function(b){if(!(1>x)){b.stopPropagation();var c=a(this).closest(".ace-scroll.can-scroll");0!=c.length&&f(c[0],"absolute")&&c[0].scrollHeight-this.scrollHeightx)){var c=a(this).closest(".ace-scroll.can-scroll");if(0!=c.length&&f(c[0],"absolute")){var d=c[0].scrollHeight;x>14&&d-x>4?c.ace_scroll("enable").ace_scroll("reset"):c.ace_scroll("disable")}}});var y=-1,z=d?"touchstart.sub_hover":"mouseenter.sub_hover",A=d?"touchend.sub_hover touchcancel.sub_hover":"mouseleave.sub_hover";o.on(z,".nav-list li, .sidebar-shortcuts",function(b){if(q=o.ace_sidebar("vars"),!q.collapsible){var c=a(this),e=!1,g=c.hasClass("hover"),h=c.find("> .submenu").get(0);if(!(h||this.parentNode==p||g||(e=c.hasClass("sidebar-shortcuts"))))return void(h&&a(h).removeClass("can-scroll"));var j=h,m=!1;if(j||this.parentNode!=p||(j=c.find("> a > .menu-text").get(0)),!j&&e&&(j=c.find(".sidebar-shortcuts-large").get(0)),!(j&&(m=f(j,"absolute"))||g))return void(h&&a(h).removeClass("can-scroll"));var n=t?i(this):null;if(h)if(m){l.dirty=!0;var s=ace.helper.scrollTop();if(t&&!n.is_visible()||!d&&s!=y||r)if(a(h).addClass("can-scroll"),r||d){var u=this;setTimeout(function(){k.call(u,h)},0)}else k.call(this,h);y=s}else a(h).removeClass("can-scroll");t&&n.show()}}).on(A,".nav-list li, .sidebar-shortcuts",function(b){q=o.ace_sidebar("vars"),q.collapsible||a(this).hasClass("hover-show")&&t&&i(this).hideDelay()})}if(!ace.vars.very_old_ie){var d=ace.vars.touch,e=ace.vars.old_ie||d,f="getComputedStyle"in window?function(a,b){return a.offsetHeight,window.getComputedStyle(a).position==b}:function(b,c){return b.offsetHeight,a(b).css("position")==c};a(window).on("resize.sidebar.ace_hover",function(){a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("update_vars").ace_sidebar_hover("reset")}),a(document).on("settings.ace.ace_hover",function(b,c,d){"sidebar_collapsed"==c?a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("reset"):"navbar_fixed"==c&&a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("update_vars")});var g=[];a.fn.ace_sidebar_hover=function(d,e){var f,g=this.each(function(){var b=a(this),g=b.data("ace_sidebar_hover"),h="object"==typeof d&&d;g||b.data("ace_sidebar_hover",g=new c(this,h)),"string"==typeof d&&"function"==typeof g[d]&&(f=g[d](e))});return f===b?g:f},a.fn.ace_sidebar_hover.defaults={sub_hover_delay:750,sub_scroll_style:"no-track scroll-thin"}}}(window.jQuery),function(a,b){function c(b,c){var d=b.find(".widget-main").eq(0);a(window).off("resize.widget.scroll");var e=ace.vars.old_ie||ace.vars.touch;if(c){var f=d.data("ace_scroll");f&&d.data("save_scroll",{size:f.size,lock:f.lock,lock_anyway:f.lock_anyway});var g=b.height()-b.find(".widget-header").height()-10;g=parseInt(g),d.css("min-height",g),e?(f&&d.ace_scroll("disable"),d.css("max-height",g).addClass("overflow-scroll")):(f?d.ace_scroll("update",{size:g,mouseWheelLock:!0,lockAnyway:!0}):d.ace_scroll({size:g,mouseWheelLock:!0,lockAnyway:!0}),d.ace_scroll("enable").ace_scroll("reset")),a(window).on("resize.widget.scroll",function(){var a=b.height()-b.find(".widget-header").height()-10;a=parseInt(a),d.css("min-height",a),e?d.css("max-height",a).addClass("overflow-scroll"):d.ace_scroll("update",{size:a}).ace_scroll("reset")})}else{d.css("min-height","");var h=d.data("save_scroll");h&&d.ace_scroll("update",{size:h.size,mouseWheelLock:h.lock,lockAnyway:h.lock_anyway}).ace_scroll("enable").ace_scroll("reset"),e?d.css("max-height","").removeClass("overflow-scroll"):h||d.ace_scroll("disable")}}var d=function(b,d){this.$box=a(b);this.reload=function(){var a=this.$box,b=!1;"static"==a.css("position")&&(b=!0,a.addClass("position-relative")),a.append('
'),a.one("reloaded.ace.widget",function(){a.find(".widget-box-overlay").remove(),b&&a.removeClass("position-relative")})},this.closeFast=function(){this.close(0)},this.close=function(a){var b=this.$box,a="undefined"==typeof a?300:a;b.fadeOut(a,function(){b.trigger("closed.ace.widget"),b.remove()})},this.toggleFast=function(){this.toggle(null,null,0,0)},this.toggle=function(a,b,c,d){var e=this.$box,f=e.find(".widget-body").eq(0),g=null,h=a||(e.hasClass("collapsed")?"show":"hide"),i="show"==h?"shown":"hidden";if(b||(b=e.find("> .widget-header a[data-action=collapse]").eq(0),0==b.length&&(b=null)),b){g=b.find(ace.vars[".icon"]).eq(0);var j,k=null,l=null;(k=g.attr("data-icon-show"))?l=g.attr("data-icon-hide"):(j=g.attr("class").match(/fa\-(.*)\-(up|down)/))&&(k="fa-"+j[1]+"-down",l="fa-"+j[1]+"-up")}var c="undefined"==typeof c?250:c,d="undefined"==typeof d?200:d;"show"==h?(g&&g.removeClass(k).addClass(l),f.hide(),e.removeClass("collapsed"),f.slideDown(c,function(){e.trigger(i+".ace.widget")})):(g&&g.removeClass(l).addClass(k),f.slideUp(d,function(){e.addClass("collapsed"),e.trigger(i+".ace.widget")})),e.trigger("toggled.ace.widget",[h])},this.hide=function(){this.toggle("hide")},this.show=function(){this.toggle("show")},this.hideFast=function(){this.toggle("hide",null,0,0)},this.showFast=function(){this.toggle("show",null,0,0)},this.fullscreen=function(a){var b=this.$box.find("> .widget-header a[data-action=fullscreen]").find(ace.vars[".icon"]).eq(0),d=null,e=null;(d=b.attr("data-icon1"))?e=b.attr("data-icon2"):(d="fa-expand",e="fa-compress");var f=this.$box.hasClass("fullscreen"),g=a!==!0&&a!==!1;a===!0||g&&!f?(b.removeClass(d).addClass(e),this.$box.addClass("fullscreen"),c(this.$box,!0)):(a===!1||g&&f)&&(b.addClass(d).removeClass(e),this.$box.removeClass("fullscreen"),c(this.$box,!1)),this.$box.trigger("fullscreened.ace.widget")}};a.fn.widget_box=function(c,e){var f,g=this.each(function(){var b=a(this),g=b.data("widget_box"),h="object"==typeof c&&c;g||b.data("widget_box",g=new d(this,h)),"string"==typeof c&&(f=g[c](e))});return f===b?g:f},a(document).on(ace.click_event+".ace.widget",".widget-header a[data-action]",function(b){b.preventDefault();var c=a(this),e=c.closest(".widget-box");if(0!=e.length&&!e.hasClass("ui-sortable-helper")){var f=e.data("widget_box");f||e.data("widget_box",f=new d(e.get(0)));var g=c.data("action");if("collapse"==g){var h,i=e.hasClass("collapsed")?"show":"hide";if(e.trigger(h=a.Event(i+".ace.widget")),h.isDefaultPrevented())return;e.trigger(h=a.Event("toggle.ace.widget"),[i]),f.toggle(i,c)}else if("close"==g){var h;if(e.trigger(h=a.Event("close.ace.widget")),h.isDefaultPrevented())return;f.close()}else if("reload"==g){c.blur();var h;if(e.trigger(h=a.Event("reload.ace.widget")),h.isDefaultPrevented())return;f.reload()}else if("fullscreen"==g){var h;if(e.trigger(h=a.Event("fullscreen.ace.widget")),h.isDefaultPrevented())return;f.fullscreen()}else"settings"==g&&e.trigger("setting.ace.widget")}})}(window.jQuery),function(a,b){a("#ace-settings-btn").on(ace.click_event,function(b){b.preventDefault(),a(this).toggleClass("open"),a("#ace-settings-box").toggleClass("open")}),a("#ace-settings-navbar").on("click",function(){ace.settingFunction.navbar_fixed(null,this.checked)}),a("#ace-settings-sidebar").on("click",function(){ace.settingFunction.sidebar_fixed(null,this.checked)}),a("#ace-settings-breadcrumbs").on("click",function(){ace.settingFunction.breadcrumbs_fixed(null,this.checked)}),a("#ace-settings-add-container").on("click",function(){ace.settingFunction.main_container_fixed(null,this.checked)}),a("#ace-settings-compact").on("click",function(){if(this.checked){a("#sidebar").addClass("compact");var b=a("#ace-settings-hover");b.length>0&&b.removeAttr("checked").trigger("click")}else a("#sidebar").removeClass("compact"),a("#sidebar[data-sidebar-scroll=true]").ace_sidebar_scroll("reset");ace.vars.old_ie&&ace.helper.redraw(a("#sidebar")[0],!0)}),a("#ace-settings-highlight").on("click",function(){this.checked?a("#sidebar .nav-list > li").addClass("highlight"):a("#sidebar .nav-list > li").removeClass("highlight"),ace.vars.old_ie&&ace.helper.redraw(a("#sidebar")[0])}),a("#ace-settings-hover").on("click",function(){if(!a("#sidebar").hasClass("h-sidebar")){if(this.checked)a("#sidebar li").addClass("hover").filter(".open").removeClass("open").find("> .submenu").css("display","none");else{a("#sidebar li.hover").removeClass("hover");var b=a("#ace-settings-compact");b.length>0&&b.get(0).checked&&b.trigger("click")}a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("reset"),a(".sidebar[data-sidebar-scroll=true]").ace_sidebar_scroll("reset"),ace.vars.old_ie&&ace.helper.redraw(a("#sidebar")[0])}});a(document).on("settings.ace",function(b,c,d,e,f){var g="";switch(c){case"navbar_fixed":g="ace-settings-navbar";break;case"sidebar_fixed":g="ace-settings-sidebar";break;case"breadcrumbs_fixed":g="ace-settings-breadcrumbs";break;case"main_container_fixed":g="ace-settings-add-container"}if(g&&(g=document.getElementById(g))){a(g).prop("checked",d);try{1==f&&ace.settings.saveState(g,"checked")}catch(h){}}}),ace.settingFunction={navbar_fixed:function(b,c,d,e){if(ace.vars.very_old_ie)return!1;var b=b||"#navbar";if("string"==typeof b&&(b=a(b).get(0)),!b)return!1;var f,c=c||!1,d="undefined"!=typeof d?d:!0;if(a(document).trigger(f=a.Event("presettings.ace"),["navbar_fixed",c,b,d]),f.isDefaultPrevented())return!1;if(e!==!1&&!c){var g=a("#sidebar");g.hasClass("sidebar-fixed")&&ace.settingFunction.sidebar_fixed(g.get(0),!1,d)}c?a(b).addClass("navbar-fixed-top"):a(b).removeClass("navbar-fixed-top"),d&&ace.settings.saveState(b,"class","navbar-fixed-top",c),a(document).trigger("settings.ace",["navbar_fixed",c,b,d])},sidebar_fixed:function(b,c,d,e){if(ace.vars.very_old_ie)return!1;var b=b||"#sidebar";if("string"==typeof b&&(b=a(b).get(0)),!b)return!1;var f,c=c||!1,d="undefined"!=typeof d?d:!0;if(a(document).trigger(f=a.Event("presettings.ace"),["sidebar_fixed",c,b,d]),f.isDefaultPrevented())return!1;e!==!1&&(c?ace.settingFunction.navbar_fixed(null,!0,d):ace.settingFunction.breadcrumbs_fixed(null,!1,d));var g=a("#menu-toggler");c?(a(b).addClass("sidebar-fixed"),g.addClass("fixed")):(a(b).removeClass("sidebar-fixed"),g.removeClass("fixed")),d&&(ace.settings.saveState(b,"class","sidebar-fixed",c),0!=g.length&&ace.settings.saveState(g[0],"class","fixed",c)),a(document).trigger("settings.ace",["sidebar_fixed",c,b,d])},breadcrumbs_fixed:function(b,c,d,e){if(ace.vars.very_old_ie)return!1;var b=b||"#breadcrumbs";if("string"==typeof b&&(b=a(b).get(0)),!b)return!1;var f,c=c||!1,d="undefined"!=typeof d?d:!0;return a(document).trigger(f=a.Event("presettings.ace"),["breadcrumbs_fixed",c,b,d]),f.isDefaultPrevented()?!1:(c&&e!==!1&&ace.settingFunction.sidebar_fixed(null,!0,d),c?a(b).addClass("breadcrumbs-fixed"):a(b).removeClass("breadcrumbs-fixed"),d&&ace.settings.saveState(b,"class","breadcrumbs-fixed",c),void a(document).trigger("settings.ace",["breadcrumbs_fixed",c,b,d]))},main_container_fixed:function(b,c,d){if(ace.vars.very_old_ie)return!1;var c=c||!1,d="undefined"!=typeof d?d:!0,b=b||"#main-container";if("string"==typeof b&&(b=a(b).get(0)),!b)return!1;var e;if(a(document).trigger(e=a.Event("presettings.ace"),["main_container_fixed",c,b,d]),e.isDefaultPrevented())return!1;var f=a("#navbar-container");c?(a(b).addClass("container"),a(f).addClass("container")):(a(b).removeClass("container"),a(f).removeClass("container")),d&&(ace.settings.saveState(b,"class","container",c),0!=f.length&&ace.settings.saveState(f[0],"class","container",c)),navigator.userAgent.match(/webkit/i)&&(a("#sidebar").toggleClass("menu-min"),setTimeout(function(){a("#sidebar").toggleClass("menu-min")},10)),a(document).trigger("settings.ace",["main_container_fixed",c,b,d])}}}(jQuery),function(a,b){a("#ace-settings-rtl").removeAttr("checked").on("click",function(){c()});var c=function(){function b(b){function c(a,b){e.find("."+a).removeClass(a).addClass("tmp-rtl-"+a).end().find("."+b).removeClass(b).addClass(a).end().find(".tmp-rtl-"+a).removeClass("tmp-rtl-"+a).addClass(b)}var d=a(document.body);b||d.toggleClass("rtl"),b=b||document.body;var e=a(b);e.find(".dropdown-menu:not(.datepicker-dropdown,.colorpicker)").toggleClass("dropdown-menu-right").end().find(".pull-right:not(.dropdown-menu,blockquote,.profile-skills .pull-right)").removeClass("pull-right").addClass("tmp-rtl-pull-right").end().find(".pull-left:not(.dropdown-submenu,.profile-skills .pull-left)").removeClass("pull-left").addClass("pull-right").end().find(".tmp-rtl-pull-right").removeClass("tmp-rtl-pull-right").addClass("pull-left").end().find(".chosen-select").toggleClass("chosen-rtl").next().toggleClass("chosen-rtl"),c("align-left","align-right"),c("no-padding-left","no-padding-right"),c("arrowed","arrowed-right"),c("arrowed-in","arrowed-in-right"),c("tabs-left","tabs-right"),c("messagebar-item-left","messagebar-item-right"),a(".modal.aside-vc").ace_aside("flip").ace_aside("insideContainer"),e.find(".fa").each(function(){if(!(this.className.match(/ui-icon/)||a(this).closest(".fc-button").length>0))for(var b=this.attributes.length,c=0;b>c;c++){var d=this.attributes[c].value;d.match(/fa\-(?:[\w\-]+)\-left/)?this.attributes[c].value=d.replace(/fa\-([\w\-]+)\-(left)/i,"fa-$1-right"):d.match(/fa\-(?:[\w\-]+)\-right/)&&(this.attributes[c].value=d.replace(/fa\-([\w\-]+)\-(right)/i,"fa-$1-left"))}});var f=d.hasClass("rtl");f?(e.find(".scroll-hz").addClass("make-ltr").find(".scroll-content").wrapInner('
'),a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("changeDir","right")):(e.find(".scroll-hz").removeClass("make-ltr").find(".make-rtl").children().unwrap(),a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("changeDir","left")),a.fn.ace_scroll&&e.find(".scroll-hz").ace_scroll("reset");try{var g=a("#piechart-placeholder");if(g.length>0){var h=d.hasClass("rtl")?"nw":"ne";g.data("draw").call(g.get(0),g,g.data("chart"),h)}}catch(i){}ace.helper.redraw(b,!0)}b(),a(".page-content-area[data-ajax-content=true]").on("ajaxscriptsloaded.rtl",function(){a("body").hasClass("rtl")&&b(this)})}}(jQuery),function(a,b){try{a("#skin-colorpicker").ace_colorpicker({auto_pos:!1})}catch(c){}a("#skin-colorpicker").on("change",function(){function b(b){var c=a(document.body);c.removeClass("no-skin skin-1 skin-2 skin-3"),c.addClass(b),ace.data.set("skin",b);var d=["red","blue","green",""];a(".ace-nav > li.grey").removeClass("dark"),a(".ace-nav > li").removeClass("no-border margin-1"),a(".ace-nav > li:not(:last-child)").removeClass("light-pink").find("> a > "+ace.vars[".icon"]).removeClass("pink").end().eq(0).find(".badge").removeClass("badge-warning"),a(".sidebar-shortcuts .btn").removeClass("btn-pink btn-white").find(ace.vars[".icon"]).removeClass("white"),a(".ace-nav > li.grey").removeClass("red").find(".badge").removeClass("badge-yellow"),a(".sidebar-shortcuts .btn").removeClass("btn-primary btn-white");var e=0;a(".sidebar-shortcuts .btn").each(function(){a(this).find(ace.vars[".icon"]).removeClass(d[e++])});var f=["btn-success","btn-info","btn-warning","btn-danger"];if("no-skin"==b){var e=0;a(".sidebar-shortcuts .btn").each(function(){a(this).attr("class","btn "+f[e++%4])}),a(".sidebar[data-sidebar-scroll=true]").ace_sidebar_scroll("updateStyle",""),a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("updateStyle","no-track scroll-thin")}else if("skin-1"==b){a(".ace-nav > li.grey").addClass("dark");var e=0;a(".sidebar-shortcuts").find(".btn").each(function(){a(this).attr("class","btn "+f[e++%4])}),a(".sidebar[data-sidebar-scroll=true]").ace_sidebar_scroll("updateStyle","scroll-white no-track"),a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("updateStyle","no-track scroll-thin scroll-white")}else if("skin-2"==b)a(".ace-nav > li").addClass("no-border margin-1"),a(".ace-nav > li:not(:last-child)").addClass("light-pink").find("> a > "+ace.vars[".icon"]).addClass("pink").end().eq(0).find(".badge").addClass("badge-warning"),a(".sidebar-shortcuts .btn").attr("class","btn btn-white btn-pink").find(ace.vars[".icon"]).addClass("white"),a(".sidebar[data-sidebar-scroll=true]").ace_sidebar_scroll("updateStyle","scroll-white no-track"),a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("updateStyle","no-track scroll-thin scroll-white");else if("skin-3"==b){c.addClass("no-skin"),a(".ace-nav > li.grey").addClass("red").find(".badge").addClass("badge-yellow");var e=0;a(".sidebar-shortcuts .btn").each(function(){a(this).attr("class","btn btn-primary btn-white"),a(this).find(ace.vars[".icon"]).addClass(d[e++])}),a(".sidebar[data-sidebar-scroll=true]").ace_sidebar_scroll("updateStyle","scroll-dark no-track"),a(".sidebar[data-sidebar-hover=true]").ace_sidebar_hover("updateStyle","no-track scroll-thin")}a(".sidebar[data-sidebar-scroll=true]").ace_sidebar_scroll("reset"),ace.vars.old_ie&&ace.helper.redraw(document.body,!0)}var c=a(this).find("option:selected").data("skin");b(c)})}(jQuery),function(a,b){a(document).on("reload.ace.widget",".widget-box",function(b){var c=a(this);setTimeout(function(){c.trigger("reloaded.ace.widget")},parseInt(1e3*Math.random()+1e3))})}(window.jQuery),function(a,b){ace.vars.US_STATES=["Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Dakota","North Carolina","Ohio","Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming"];try{a("#nav-search-input").bs_typeahead({source:ace.vars.US_STATES,updater:function(b){return a("#nav-search-input").focus(),b}})}catch(c){}}(window.jQuery);
\ No newline at end of file
diff --git a/at-admin/static/index/bootstrap.min.css b/at-admin/static/index/bootstrap.min.css
new file mode 100644
index 0000000..20f85b2
--- /dev/null
+++ b/at-admin/static/index/bootstrap.min.css
@@ -0,0 +1,1497 @@
+/* Code tidied up by ScrapBook */
+.label, sub, sup { vertical-align: baseline; }
+hr, img { border: 0px none; }
+body, figure { margin: 0px; }
+.navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse, .pre-scrollable { max-height: 340px; }
+html { font-family: sans-serif; }
+article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; }
+audio, canvas, progress, video { display: inline-block; vertical-align: baseline; }
+audio:not([controls]) { display: none; height: 0px; }
+[hidden], template { display: none; }
+a { background-color: transparent; }
+a:active, a:hover { outline: 0px none; }
+b, optgroup, strong { font-weight: 700; }
+dfn { font-style: italic; }
+h1 { margin: 0.67em 0px; }
+mark { background: rgb(255, 255, 0) none repeat scroll 0% 0%; color: rgb(0, 0, 0); }
+sub, sup { font-size: 75%; line-height: 0; position: relative; }
+sup { top: -0.5em; }
+sub { bottom: -0.25em; }
+img { vertical-align: middle; }
+svg:not(:root) { overflow: hidden; }
+hr { box-sizing: content-box; height: 0px; }
+pre, textarea { overflow: auto; }
+code, kbd, pre, samp { font-size: 1em; }
+button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0px; }
+.glyphicon, address { font-style: normal; }
+button { overflow: visible; }
+button, select { text-transform: none; }
+button, html input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; }
+button[disabled], html input[disabled] { cursor: default; }
+button::-moz-focus-inner, input::-moz-focus-inner { border: 0px none; padding: 0px; }
+input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0px; }
+table { border-collapse: collapse; border-spacing: 0px; }
+td, th { padding: 0px; }
+@media print {
+ blockquote, img, pre, tr { page-break-inside: avoid; }
+ *, *::after, *::before { background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px !important; color: rgb(0, 0, 0) !important; box-shadow: none !important; text-shadow: none !important; }
+ a, a:visited { text-decoration: underline; }
+ a[href]::after { content: " (" attr(href) ")"; }
+ abbr[title]::after { content: " (" attr(title) ")"; }
+ a[href^="javascript:"]::after, a[href^="#"]::after { content: ""; }
+ blockquote, pre { border: 1px solid rgb(153, 153, 153); }
+ thead { display: table-header-group; }
+ img { max-width: 100% !important; }
+ h2, h3, p { }
+ h2, h3 { page-break-after: avoid; }
+ .navbar { display: none; }
+ .btn > .caret, .dropup > .btn > .caret { border-top-color: rgb(0, 0, 0) !important; }
+ .label { border: 1px solid rgb(0, 0, 0); }
+ .table { border-collapse: collapse !important; }
+ .table td, .table th { background-color: rgb(255, 255, 255) !important; }
+ .table-bordered td, .table-bordered th { border: 1px solid rgb(221, 221, 221) !important; }
+}
+.btn, .btn-danger.active, .btn-danger:active, .btn-default.active, .btn-default:active, .btn-info.active, .btn-info:active, .btn-primary.active, .btn-primary:active, .btn-warning.active, .btn-warning:active, .btn.active, .btn:active, .dropdown-menu > .disabled > a:focus, .dropdown-menu > .disabled > a:hover, .form-control, .navbar-toggle, .open > .dropdown-toggle.btn-danger, .open > .dropdown-toggle.btn-default, .open > .dropdown-toggle.btn-info, .open > .dropdown-toggle.btn-primary, .open > .dropdown-toggle.btn-warning { background-image: none; }
+.img-thumbnail, body { background-color: rgb(255, 255, 255); }
+@font-face {
+ font-family: "Glyphicons Halflings";
+ src: url("glyphicons-halflings-regular.eot") format("embedded-opentype"), url("glyphicons-halflings-regular.woff2") format("woff2"), url("glyphicons-halflings-regular.woff") format("woff"), url("glyphicons-halflings-regular.ttf") format("truetype"), url("glyphicons-halflings-regular.svg") format("svg");
+}
+.glyphicon { position: relative; top: 1px; display: inline-block; font-family: "Glyphicons Halflings"; font-weight: 400; line-height: 1; }
+.glyphicon-asterisk::before { content: "*"; }
+.glyphicon-plus::before { content: "+"; }
+.glyphicon-eur::before, .glyphicon-euro::before { content: "€"; }
+.glyphicon-minus::before { content: "−"; }
+.glyphicon-cloud::before { content: "☁"; }
+.glyphicon-envelope::before { content: "✉"; }
+.glyphicon-pencil::before { content: "✏"; }
+.glyphicon-glass::before { content: ""; }
+.glyphicon-music::before { content: ""; }
+.glyphicon-search::before { content: ""; }
+.glyphicon-heart::before { content: ""; }
+.glyphicon-star::before { content: ""; }
+.glyphicon-star-empty::before { content: ""; }
+.glyphicon-user::before { content: ""; }
+.glyphicon-film::before { content: ""; }
+.glyphicon-th-large::before { content: ""; }
+.glyphicon-th::before { content: ""; }
+.glyphicon-th-list::before { content: ""; }
+.glyphicon-ok::before { content: ""; }
+.glyphicon-remove::before { content: ""; }
+.glyphicon-zoom-in::before { content: ""; }
+.glyphicon-zoom-out::before { content: ""; }
+.glyphicon-off::before { content: ""; }
+.glyphicon-signal::before { content: ""; }
+.glyphicon-cog::before { content: ""; }
+.glyphicon-trash::before { content: ""; }
+.glyphicon-home::before { content: ""; }
+.glyphicon-file::before { content: ""; }
+.glyphicon-time::before { content: ""; }
+.glyphicon-road::before { content: ""; }
+.glyphicon-download-alt::before { content: ""; }
+.glyphicon-download::before { content: ""; }
+.glyphicon-upload::before { content: ""; }
+.glyphicon-inbox::before { content: ""; }
+.glyphicon-play-circle::before { content: ""; }
+.glyphicon-repeat::before { content: ""; }
+.glyphicon-refresh::before { content: ""; }
+.glyphicon-list-alt::before { content: ""; }
+.glyphicon-lock::before { content: ""; }
+.glyphicon-flag::before { content: ""; }
+.glyphicon-headphones::before { content: ""; }
+.glyphicon-volume-off::before { content: ""; }
+.glyphicon-volume-down::before { content: ""; }
+.glyphicon-volume-up::before { content: ""; }
+.glyphicon-qrcode::before { content: ""; }
+.glyphicon-barcode::before { content: ""; }
+.glyphicon-tag::before { content: ""; }
+.glyphicon-tags::before { content: ""; }
+.glyphicon-book::before { content: ""; }
+.glyphicon-bookmark::before { content: ""; }
+.glyphicon-print::before { content: ""; }
+.glyphicon-camera::before { content: ""; }
+.glyphicon-font::before { content: ""; }
+.glyphicon-bold::before { content: ""; }
+.glyphicon-italic::before { content: ""; }
+.glyphicon-text-height::before { content: ""; }
+.glyphicon-text-width::before { content: ""; }
+.glyphicon-align-left::before { content: ""; }
+.glyphicon-align-center::before { content: ""; }
+.glyphicon-align-right::before { content: ""; }
+.glyphicon-align-justify::before { content: ""; }
+.glyphicon-list::before { content: ""; }
+.glyphicon-indent-left::before { content: ""; }
+.glyphicon-indent-right::before { content: ""; }
+.glyphicon-facetime-video::before { content: ""; }
+.glyphicon-picture::before { content: ""; }
+.glyphicon-map-marker::before { content: ""; }
+.glyphicon-adjust::before { content: ""; }
+.glyphicon-tint::before { content: ""; }
+.glyphicon-edit::before { content: ""; }
+.glyphicon-share::before { content: ""; }
+.glyphicon-check::before { content: ""; }
+.glyphicon-move::before { content: ""; }
+.glyphicon-step-backward::before { content: ""; }
+.glyphicon-fast-backward::before { content: ""; }
+.glyphicon-backward::before { content: ""; }
+.glyphicon-play::before { content: ""; }
+.glyphicon-pause::before { content: ""; }
+.glyphicon-stop::before { content: ""; }
+.glyphicon-forward::before { content: ""; }
+.glyphicon-fast-forward::before { content: ""; }
+.glyphicon-step-forward::before { content: ""; }
+.glyphicon-eject::before { content: ""; }
+.glyphicon-chevron-left::before { content: ""; }
+.glyphicon-chevron-right::before { content: ""; }
+.glyphicon-plus-sign::before { content: ""; }
+.glyphicon-minus-sign::before { content: ""; }
+.glyphicon-remove-sign::before { content: ""; }
+.glyphicon-ok-sign::before { content: ""; }
+.glyphicon-question-sign::before { content: ""; }
+.glyphicon-info-sign::before { content: ""; }
+.glyphicon-screenshot::before { content: ""; }
+.glyphicon-remove-circle::before { content: ""; }
+.glyphicon-ok-circle::before { content: ""; }
+.glyphicon-ban-circle::before { content: ""; }
+.glyphicon-arrow-left::before { content: ""; }
+.glyphicon-arrow-right::before { content: ""; }
+.glyphicon-arrow-up::before { content: ""; }
+.glyphicon-arrow-down::before { content: ""; }
+.glyphicon-share-alt::before { content: ""; }
+.glyphicon-resize-full::before { content: ""; }
+.glyphicon-resize-small::before { content: ""; }
+.glyphicon-exclamation-sign::before { content: ""; }
+.glyphicon-gift::before { content: ""; }
+.glyphicon-leaf::before { content: ""; }
+.glyphicon-fire::before { content: ""; }
+.glyphicon-eye-open::before { content: ""; }
+.glyphicon-eye-close::before { content: ""; }
+.glyphicon-warning-sign::before { content: ""; }
+.glyphicon-plane::before { content: ""; }
+.glyphicon-calendar::before { content: ""; }
+.glyphicon-random::before { content: ""; }
+.glyphicon-comment::before { content: ""; }
+.glyphicon-magnet::before { content: ""; }
+.glyphicon-chevron-up::before { content: ""; }
+.glyphicon-chevron-down::before { content: ""; }
+.glyphicon-retweet::before { content: ""; }
+.glyphicon-shopping-cart::before { content: ""; }
+.glyphicon-folder-close::before { content: ""; }
+.glyphicon-folder-open::before { content: ""; }
+.glyphicon-resize-vertical::before { content: ""; }
+.glyphicon-resize-horizontal::before { content: ""; }
+.glyphicon-hdd::before { content: ""; }
+.glyphicon-bullhorn::before { content: ""; }
+.glyphicon-bell::before { content: ""; }
+.glyphicon-certificate::before { content: ""; }
+.glyphicon-thumbs-up::before { content: ""; }
+.glyphicon-thumbs-down::before { content: ""; }
+.glyphicon-hand-right::before { content: ""; }
+.glyphicon-hand-left::before { content: ""; }
+.glyphicon-hand-up::before { content: ""; }
+.glyphicon-hand-down::before { content: ""; }
+.glyphicon-circle-arrow-right::before { content: ""; }
+.glyphicon-circle-arrow-left::before { content: ""; }
+.glyphicon-circle-arrow-up::before { content: ""; }
+.glyphicon-circle-arrow-down::before { content: ""; }
+.glyphicon-globe::before { content: ""; }
+.glyphicon-wrench::before { content: ""; }
+.glyphicon-tasks::before { content: ""; }
+.glyphicon-filter::before { content: ""; }
+.glyphicon-briefcase::before { content: ""; }
+.glyphicon-fullscreen::before { content: ""; }
+.glyphicon-dashboard::before { content: ""; }
+.glyphicon-paperclip::before { content: ""; }
+.glyphicon-heart-empty::before { content: ""; }
+.glyphicon-link::before { content: ""; }
+.glyphicon-phone::before { content: ""; }
+.glyphicon-pushpin::before { content: ""; }
+.glyphicon-usd::before { content: ""; }
+.glyphicon-gbp::before { content: ""; }
+.glyphicon-sort::before { content: ""; }
+.glyphicon-sort-by-alphabet::before { content: ""; }
+.glyphicon-sort-by-alphabet-alt::before { content: ""; }
+.glyphicon-sort-by-order::before { content: ""; }
+.glyphicon-sort-by-order-alt::before { content: ""; }
+.glyphicon-sort-by-attributes::before { content: ""; }
+.glyphicon-sort-by-attributes-alt::before { content: ""; }
+.glyphicon-unchecked::before { content: ""; }
+.glyphicon-expand::before { content: ""; }
+.glyphicon-collapse-down::before { content: ""; }
+.glyphicon-collapse-up::before { content: ""; }
+.glyphicon-log-in::before { content: ""; }
+.glyphicon-flash::before { content: ""; }
+.glyphicon-log-out::before { content: ""; }
+.glyphicon-new-window::before { content: ""; }
+.glyphicon-record::before { content: ""; }
+.glyphicon-save::before { content: ""; }
+.glyphicon-open::before { content: ""; }
+.glyphicon-saved::before { content: ""; }
+.glyphicon-import::before { content: ""; }
+.glyphicon-export::before { content: ""; }
+.glyphicon-send::before { content: ""; }
+.glyphicon-floppy-disk::before { content: ""; }
+.glyphicon-floppy-saved::before { content: ""; }
+.glyphicon-floppy-remove::before { content: ""; }
+.glyphicon-floppy-save::before { content: ""; }
+.glyphicon-floppy-open::before { content: ""; }
+.glyphicon-credit-card::before { content: ""; }
+.glyphicon-transfer::before { content: ""; }
+.glyphicon-cutlery::before { content: ""; }
+.glyphicon-header::before { content: ""; }
+.glyphicon-compressed::before { content: ""; }
+.glyphicon-earphone::before { content: ""; }
+.glyphicon-phone-alt::before { content: ""; }
+.glyphicon-tower::before { content: ""; }
+.glyphicon-stats::before { content: ""; }
+.glyphicon-sd-video::before { content: ""; }
+.glyphicon-hd-video::before { content: ""; }
+.glyphicon-subtitles::before { content: ""; }
+.glyphicon-sound-stereo::before { content: ""; }
+.glyphicon-sound-dolby::before { content: ""; }
+.glyphicon-sound-5-1::before { content: ""; }
+.glyphicon-sound-6-1::before { content: ""; }
+.glyphicon-sound-7-1::before { content: ""; }
+.glyphicon-copyright-mark::before { content: ""; }
+.glyphicon-registration-mark::before { content: ""; }
+.glyphicon-cloud-download::before { content: ""; }
+.glyphicon-cloud-upload::before { content: ""; }
+.glyphicon-tree-conifer::before { content: ""; }
+.glyphicon-tree-deciduous::before { content: ""; }
+.glyphicon-cd::before { content: ""; }
+.glyphicon-save-file::before { content: ""; }
+.glyphicon-open-file::before { content: ""; }
+.glyphicon-level-up::before { content: ""; }
+.glyphicon-copy::before { content: ""; }
+.glyphicon-paste::before { content: ""; }
+.glyphicon-alert::before { content: ""; }
+.glyphicon-equalizer::before { content: ""; }
+.glyphicon-king::before { content: ""; }
+.glyphicon-queen::before { content: ""; }
+.glyphicon-pawn::before { content: ""; }
+.glyphicon-bishop::before { content: ""; }
+.glyphicon-knight::before { content: ""; }
+.glyphicon-baby-formula::before { content: ""; }
+.glyphicon-tent::before { content: "⛺"; }
+.glyphicon-blackboard::before { content: ""; }
+.glyphicon-bed::before { content: ""; }
+.glyphicon-apple::before { content: ""; }
+.glyphicon-erase::before { content: ""; }
+.glyphicon-hourglass::before { content: "⌛"; }
+.glyphicon-lamp::before { content: ""; }
+.glyphicon-duplicate::before { content: ""; }
+.glyphicon-piggy-bank::before { content: ""; }
+.glyphicon-scissors::before { content: ""; }
+.glyphicon-bitcoin::before, .glyphicon-btc::before, .glyphicon-xbt::before { content: ""; }
+.glyphicon-jpy::before, .glyphicon-yen::before { content: "¥"; }
+.glyphicon-rub::before, .glyphicon-ruble::before { content: "₽"; }
+.glyphicon-scale::before { content: ""; }
+.glyphicon-ice-lolly::before { content: ""; }
+.glyphicon-ice-lolly-tasted::before { content: ""; }
+.glyphicon-education::before { content: ""; }
+.glyphicon-option-horizontal::before { content: ""; }
+.glyphicon-option-vertical::before { content: ""; }
+.glyphicon-menu-hamburger::before { content: ""; }
+.glyphicon-modal-window::before { content: ""; }
+.glyphicon-oil::before { content: ""; }
+.glyphicon-grain::before { content: ""; }
+.glyphicon-sunglasses::before { content: ""; }
+.glyphicon-text-size::before { content: ""; }
+.glyphicon-text-color::before { content: ""; }
+.glyphicon-text-background::before { content: ""; }
+.glyphicon-object-align-top::before { content: ""; }
+.glyphicon-object-align-bottom::before { content: ""; }
+.glyphicon-object-align-horizontal::before { content: ""; }
+.glyphicon-object-align-left::before { content: ""; }
+.glyphicon-object-align-vertical::before { content: ""; }
+.glyphicon-object-align-right::before { content: ""; }
+.glyphicon-triangle-right::before { content: ""; }
+.glyphicon-triangle-left::before { content: ""; }
+.glyphicon-triangle-bottom::before { content: ""; }
+.glyphicon-triangle-top::before { content: ""; }
+.glyphicon-console::before { content: ""; }
+.glyphicon-superscript::before { content: ""; }
+.glyphicon-subscript::before { content: ""; }
+.glyphicon-menu-left::before { content: ""; }
+.glyphicon-menu-right::before { content: ""; }
+.glyphicon-menu-down::before { content: ""; }
+.glyphicon-menu-up::before { content: ""; }
+*, *::after, *::before { box-sizing: border-box; }
+html { font-size: 10px; }
+body { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 14px; line-height: 1.42857; color: rgb(51, 51, 51); }
+button, input, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; }
+a { color: rgb(51, 122, 183); text-decoration: none; }
+a:focus, a:hover { color: rgb(35, 82, 124); text-decoration: underline; }
+a:focus { outline: thin dotted; outline-offset: -2px; }
+.carousel-inner > .item > a > img, .carousel-inner > .item > img, .img-responsive, .thumbnail a > img, .thumbnail > img { display: block; max-width: 100%; height: auto; }
+.img-rounded { border-radius: 6px; }
+.img-thumbnail { padding: 4px; line-height: 1.42857; border: 1px solid rgb(221, 221, 221); border-radius: 4px; transition: all 0.2s ease-in-out 0s; display: inline-block; max-width: 100%; height: auto; }
+.img-circle { border-radius: 50%; }
+hr { margin-top: 20px; margin-bottom: 20px; border-top: 1px solid rgb(238, 238, 238); }
+.sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); border: 0px none; }
+.sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0px; overflow: visible; clip: auto; }
+[role="button"] { cursor: pointer; }
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; }
+.h1 .small, .h1 small, .h2 .small, .h2 small, .h3 .small, .h3 small, .h4 .small, .h4 small, .h5 .small, .h5 small, .h6 .small, .h6 small, h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small, h4 .small, h4 small, h5 .small, h5 small, h6 .small, h6 small { font-weight: 400; line-height: 1; color: rgb(119, 119, 119); }
+.h1, .h2, .h3, h1, h2, h3 { margin-top: 20px; margin-bottom: 10px; }
+.h1 .small, .h1 small, .h2 .small, .h2 small, .h3 .small, .h3 small, h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small { font-size: 65%; }
+.h4, .h5, .h6, h4, h5, h6 { margin-top: 10px; margin-bottom: 10px; }
+.h4 .small, .h4 small, .h5 .small, .h5 small, .h6 .small, .h6 small, h4 .small, h4 small, h5 .small, h5 small, h6 .small, h6 small { font-size: 75%; }
+.h1, h1 { font-size: 36px; }
+.h2, h2 { font-size: 30px; }
+.h3, h3 { font-size: 24px; }
+.h4, h4 { font-size: 18px; }
+.h5, h5 { font-size: 14px; }
+.h6, h6 { font-size: 12px; }
+p { margin: 0px 0px 10px; }
+.lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; }
+dt, kbd kbd, label { font-weight: 700; }
+address, blockquote .small, blockquote footer, blockquote small, dd, dt, pre { line-height: 1.42857; }
+@media (min-width: 768px) {
+ .lead { font-size: 21px; }
+}
+.small, small { font-size: 85%; }
+.mark, mark { background-color: rgb(252, 248, 227); padding: 0.2em; }
+.list-inline, .list-unstyled { padding-left: 0px; list-style: outside none none; }
+.text-left { text-align: left; }
+.text-right { text-align: right; }
+.text-center { text-align: center; }
+.text-justify { text-align: justify; }
+.text-nowrap { white-space: nowrap; }
+.text-lowercase { text-transform: lowercase; }
+.text-uppercase { text-transform: uppercase; }
+.text-capitalize { text-transform: capitalize; }
+.text-muted { color: rgb(119, 119, 119); }
+.text-primary { color: rgb(51, 122, 183); }
+a.text-primary:focus, a.text-primary:hover { color: rgb(40, 96, 144); }
+.text-success { color: rgb(60, 118, 61); }
+a.text-success:focus, a.text-success:hover { color: rgb(43, 84, 44); }
+.text-info { color: rgb(49, 112, 143); }
+a.text-info:focus, a.text-info:hover { color: rgb(36, 82, 105); }
+.text-warning { color: rgb(138, 109, 59); }
+a.text-warning:focus, a.text-warning:hover { color: rgb(102, 81, 44); }
+.text-danger { color: rgb(169, 68, 66); }
+a.text-danger:focus, a.text-danger:hover { color: rgb(132, 53, 52); }
+.bg-primary { color: rgb(255, 255, 255); background-color: rgb(51, 122, 183); }
+a.bg-primary:focus, a.bg-primary:hover { background-color: rgb(40, 96, 144); }
+.bg-success { background-color: rgb(223, 240, 216); }
+a.bg-success:focus, a.bg-success:hover { background-color: rgb(193, 226, 179); }
+.bg-info { background-color: rgb(217, 237, 247); }
+a.bg-info:focus, a.bg-info:hover { background-color: rgb(175, 217, 238); }
+.bg-warning { background-color: rgb(252, 248, 227); }
+a.bg-warning:focus, a.bg-warning:hover { background-color: rgb(247, 236, 181); }
+.bg-danger { background-color: rgb(242, 222, 222); }
+a.bg-danger:focus, a.bg-danger:hover { background-color: rgb(228, 185, 185); }
+pre code, table { background-color: transparent; }
+.page-header { padding-bottom: 9px; margin: 40px 0px 20px; border-bottom: 1px solid rgb(238, 238, 238); }
+dl, ol, ul { margin-top: 0px; }
+address, dl { margin-bottom: 20px; }
+ol, ul { margin-bottom: 10px; }
+ol ol, ol ul, ul ol, ul ul { margin-bottom: 0px; }
+.list-inline { margin-left: -5px; }
+.list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; }
+dd { margin-left: 0px; }
+@media (min-width: 992px) {
+ .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+ .dl-horizontal dd { margin-left: 180px; }
+}
+abbr[data-original-title], abbr[title] { cursor: help; border-bottom: 1px dotted rgb(119, 119, 119); }
+.initialism { font-size: 90%; text-transform: uppercase; }
+blockquote { padding: 10px 20px; margin: 0px 0px 20px; font-size: 17.5px; border-left: 5px solid rgb(238, 238, 238); }
+blockquote ol:last-child, blockquote p:last-child, blockquote ul:last-child { margin-bottom: 0px; }
+blockquote .small, blockquote footer, blockquote small { display: block; font-size: 80%; color: rgb(119, 119, 119); }
+legend, pre { display: block; color: rgb(51, 51, 51); }
+blockquote .small::before, blockquote footer::before, blockquote small::before { content: "— "; }
+.blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0px; border-right: 5px solid rgb(238, 238, 238); border-left: 0px none; text-align: right; }
+code, kbd { padding: 2px 4px; font-size: 90%; }
+caption, th { text-align: left; }
+.blockquote-reverse .small::before, .blockquote-reverse footer::before, .blockquote-reverse small::before, blockquote.pull-right .small::before, blockquote.pull-right footer::before, blockquote.pull-right small::before { content: ""; }
+.blockquote-reverse .small::after, .blockquote-reverse footer::after, .blockquote-reverse small::after, blockquote.pull-right .small::after, blockquote.pull-right footer::after, blockquote.pull-right small::after { content: " —"; }
+code, kbd, pre, samp { font-family: Menlo,Monaco,Consolas,"Courier New",monospace; }
+code { color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px; }
+kbd { color: rgb(255, 255, 255); background-color: rgb(51, 51, 51); border-radius: 3px; box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25) inset; }
+kbd kbd { padding: 0px; font-size: 100%; box-shadow: none; }
+pre { padding: 9.5px; margin: 0px 0px 10px; font-size: 13px; word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; }
+.container, .container-fluid { margin-right: auto; margin-left: auto; }
+pre code { padding: 0px; font-size: inherit; color: inherit; white-space: pre-wrap; border-radius: 0px; }
+.container, .container-fluid { padding-left: 12px; padding-right: 12px; }
+.pre-scrollable { overflow-y: scroll; }
+@media (min-width: 768px) {
+ .container { width: 744px; }
+}
+@media (min-width: 992px) {
+ .container { width: 964px; }
+}
+@media (min-width: 1200px) {
+ .container { width: 1164px; }
+}
+.row { margin-left: -12px; margin-right: -12px; }
+.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { position: relative; min-height: 1px; padding-left: 12px; padding-right: 12px; }
+.col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { float: left; }
+.col-xs-12 { width: 100%; }
+.col-xs-11 { width: 91.666%; }
+.col-xs-10 { width: 83.333%; }
+.col-xs-9 { width: 75%; }
+.col-xs-8 { width: 66.666%; }
+.col-xs-7 { width: 58.333%; }
+.col-xs-6 { width: 50%; }
+.col-xs-5 { width: 41.666%; }
+.col-xs-4 { width: 33.333%; }
+.col-xs-3 { width: 25%; }
+.col-xs-2 { width: 16.666%; }
+.col-xs-1 { width: 8.333%; }
+.col-xs-pull-12 { right: 100%; }
+.col-xs-pull-11 { right: 91.666%; }
+.col-xs-pull-10 { right: 83.333%; }
+.col-xs-pull-9 { right: 75%; }
+.col-xs-pull-8 { right: 66.666%; }
+.col-xs-pull-7 { right: 58.333%; }
+.col-xs-pull-6 { right: 50%; }
+.col-xs-pull-5 { right: 41.666%; }
+.col-xs-pull-4 { right: 33.333%; }
+.col-xs-pull-3 { right: 25%; }
+.col-xs-pull-2 { right: 16.666%; }
+.col-xs-pull-1 { right: 8.333%; }
+.col-xs-pull-0 { right: auto; }
+.col-xs-push-12 { left: 100%; }
+.col-xs-push-11 { left: 91.666%; }
+.col-xs-push-10 { left: 83.333%; }
+.col-xs-push-9 { left: 75%; }
+.col-xs-push-8 { left: 66.666%; }
+.col-xs-push-7 { left: 58.333%; }
+.col-xs-push-6 { left: 50%; }
+.col-xs-push-5 { left: 41.666%; }
+.col-xs-push-4 { left: 33.333%; }
+.col-xs-push-3 { left: 25%; }
+.col-xs-push-2 { left: 16.666%; }
+.col-xs-push-1 { left: 8.333%; }
+.col-xs-push-0 { left: auto; }
+.col-xs-offset-12 { margin-left: 100%; }
+.col-xs-offset-11 { margin-left: 91.666%; }
+.col-xs-offset-10 { margin-left: 83.333%; }
+.col-xs-offset-9 { margin-left: 75%; }
+.col-xs-offset-8 { margin-left: 66.666%; }
+.col-xs-offset-7 { margin-left: 58.333%; }
+.col-xs-offset-6 { margin-left: 50%; }
+.col-xs-offset-5 { margin-left: 41.666%; }
+.col-xs-offset-4 { margin-left: 33.333%; }
+.col-xs-offset-3 { margin-left: 25%; }
+.col-xs-offset-2 { margin-left: 16.666%; }
+.col-xs-offset-1 { margin-left: 8.333%; }
+.col-xs-offset-0 { margin-left: 0px; }
+@media (min-width: 768px) {
+ .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9 { float: left; }
+ .col-sm-12 { width: 100%; }
+ .col-sm-11 { width: 91.666%; }
+ .col-sm-10 { width: 83.333%; }
+ .col-sm-9 { width: 75%; }
+ .col-sm-8 { width: 66.666%; }
+ .col-sm-7 { width: 58.333%; }
+ .col-sm-6 { width: 50%; }
+ .col-sm-5 { width: 41.666%; }
+ .col-sm-4 { width: 33.333%; }
+ .col-sm-3 { width: 25%; }
+ .col-sm-2 { width: 16.666%; }
+ .col-sm-1 { width: 8.333%; }
+ .col-sm-pull-12 { right: 100%; }
+ .col-sm-pull-11 { right: 91.666%; }
+ .col-sm-pull-10 { right: 83.333%; }
+ .col-sm-pull-9 { right: 75%; }
+ .col-sm-pull-8 { right: 66.666%; }
+ .col-sm-pull-7 { right: 58.333%; }
+ .col-sm-pull-6 { right: 50%; }
+ .col-sm-pull-5 { right: 41.666%; }
+ .col-sm-pull-4 { right: 33.333%; }
+ .col-sm-pull-3 { right: 25%; }
+ .col-sm-pull-2 { right: 16.666%; }
+ .col-sm-pull-1 { right: 8.333%; }
+ .col-sm-pull-0 { right: auto; }
+ .col-sm-push-12 { left: 100%; }
+ .col-sm-push-11 { left: 91.666%; }
+ .col-sm-push-10 { left: 83.333%; }
+ .col-sm-push-9 { left: 75%; }
+ .col-sm-push-8 { left: 66.666%; }
+ .col-sm-push-7 { left: 58.333%; }
+ .col-sm-push-6 { left: 50%; }
+ .col-sm-push-5 { left: 41.666%; }
+ .col-sm-push-4 { left: 33.333%; }
+ .col-sm-push-3 { left: 25%; }
+ .col-sm-push-2 { left: 16.666%; }
+ .col-sm-push-1 { left: 8.333%; }
+ .col-sm-push-0 { left: auto; }
+ .col-sm-offset-12 { margin-left: 100%; }
+ .col-sm-offset-11 { margin-left: 91.666%; }
+ .col-sm-offset-10 { margin-left: 83.333%; }
+ .col-sm-offset-9 { margin-left: 75%; }
+ .col-sm-offset-8 { margin-left: 66.666%; }
+ .col-sm-offset-7 { margin-left: 58.333%; }
+ .col-sm-offset-6 { margin-left: 50%; }
+ .col-sm-offset-5 { margin-left: 41.666%; }
+ .col-sm-offset-4 { margin-left: 33.333%; }
+ .col-sm-offset-3 { margin-left: 25%; }
+ .col-sm-offset-2 { margin-left: 16.666%; }
+ .col-sm-offset-1 { margin-left: 8.333%; }
+ .col-sm-offset-0 { margin-left: 0px; }
+}
+@media (min-width: 992px) {
+ .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9 { float: left; }
+ .col-md-12 { width: 100%; }
+ .col-md-11 { width: 91.666%; }
+ .col-md-10 { width: 83.333%; }
+ .col-md-9 { width: 75%; }
+ .col-md-8 { width: 66.666%; }
+ .col-md-7 { width: 58.333%; }
+ .col-md-6 { width: 50%; }
+ .col-md-5 { width: 41.666%; }
+ .col-md-4 { width: 33.333%; }
+ .col-md-3 { width: 25%; }
+ .col-md-2 { width: 16.666%; }
+ .col-md-1 { width: 8.333%; }
+ .col-md-pull-12 { right: 100%; }
+ .col-md-pull-11 { right: 91.666%; }
+ .col-md-pull-10 { right: 83.333%; }
+ .col-md-pull-9 { right: 75%; }
+ .col-md-pull-8 { right: 66.666%; }
+ .col-md-pull-7 { right: 58.333%; }
+ .col-md-pull-6 { right: 50%; }
+ .col-md-pull-5 { right: 41.666%; }
+ .col-md-pull-4 { right: 33.333%; }
+ .col-md-pull-3 { right: 25%; }
+ .col-md-pull-2 { right: 16.666%; }
+ .col-md-pull-1 { right: 8.333%; }
+ .col-md-pull-0 { right: auto; }
+ .col-md-push-12 { left: 100%; }
+ .col-md-push-11 { left: 91.666%; }
+ .col-md-push-10 { left: 83.333%; }
+ .col-md-push-9 { left: 75%; }
+ .col-md-push-8 { left: 66.666%; }
+ .col-md-push-7 { left: 58.333%; }
+ .col-md-push-6 { left: 50%; }
+ .col-md-push-5 { left: 41.666%; }
+ .col-md-push-4 { left: 33.333%; }
+ .col-md-push-3 { left: 25%; }
+ .col-md-push-2 { left: 16.666%; }
+ .col-md-push-1 { left: 8.333%; }
+ .col-md-push-0 { left: auto; }
+ .col-md-offset-12 { margin-left: 100%; }
+ .col-md-offset-11 { margin-left: 91.666%; }
+ .col-md-offset-10 { margin-left: 83.333%; }
+ .col-md-offset-9 { margin-left: 75%; }
+ .col-md-offset-8 { margin-left: 66.666%; }
+ .col-md-offset-7 { margin-left: 58.333%; }
+ .col-md-offset-6 { margin-left: 50%; }
+ .col-md-offset-5 { margin-left: 41.666%; }
+ .col-md-offset-4 { margin-left: 33.333%; }
+ .col-md-offset-3 { margin-left: 25%; }
+ .col-md-offset-2 { margin-left: 16.666%; }
+ .col-md-offset-1 { margin-left: 8.333%; }
+ .col-md-offset-0 { margin-left: 0px; }
+}
+@media (min-width: 1200px) {
+ .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9 { float: left; }
+ .col-lg-12 { width: 100%; }
+ .col-lg-11 { width: 91.666%; }
+ .col-lg-10 { width: 83.333%; }
+ .col-lg-9 { width: 75%; }
+ .col-lg-8 { width: 66.666%; }
+ .col-lg-7 { width: 58.333%; }
+ .col-lg-6 { width: 50%; }
+ .col-lg-5 { width: 41.666%; }
+ .col-lg-4 { width: 33.333%; }
+ .col-lg-3 { width: 25%; }
+ .col-lg-2 { width: 16.666%; }
+ .col-lg-1 { width: 8.333%; }
+ .col-lg-pull-12 { right: 100%; }
+ .col-lg-pull-11 { right: 91.666%; }
+ .col-lg-pull-10 { right: 83.333%; }
+ .col-lg-pull-9 { right: 75%; }
+ .col-lg-pull-8 { right: 66.666%; }
+ .col-lg-pull-7 { right: 58.333%; }
+ .col-lg-pull-6 { right: 50%; }
+ .col-lg-pull-5 { right: 41.666%; }
+ .col-lg-pull-4 { right: 33.333%; }
+ .col-lg-pull-3 { right: 25%; }
+ .col-lg-pull-2 { right: 16.666%; }
+ .col-lg-pull-1 { right: 8.333%; }
+ .col-lg-pull-0 { right: auto; }
+ .col-lg-push-12 { left: 100%; }
+ .col-lg-push-11 { left: 91.666%; }
+ .col-lg-push-10 { left: 83.333%; }
+ .col-lg-push-9 { left: 75%; }
+ .col-lg-push-8 { left: 66.666%; }
+ .col-lg-push-7 { left: 58.333%; }
+ .col-lg-push-6 { left: 50%; }
+ .col-lg-push-5 { left: 41.666%; }
+ .col-lg-push-4 { left: 33.333%; }
+ .col-lg-push-3 { left: 25%; }
+ .col-lg-push-2 { left: 16.666%; }
+ .col-lg-push-1 { left: 8.333%; }
+ .col-lg-push-0 { left: auto; }
+ .col-lg-offset-12 { margin-left: 100%; }
+ .col-lg-offset-11 { margin-left: 91.666%; }
+ .col-lg-offset-10 { margin-left: 83.333%; }
+ .col-lg-offset-9 { margin-left: 75%; }
+ .col-lg-offset-8 { margin-left: 66.666%; }
+ .col-lg-offset-7 { margin-left: 58.333%; }
+ .col-lg-offset-6 { margin-left: 50%; }
+ .col-lg-offset-5 { margin-left: 41.666%; }
+ .col-lg-offset-4 { margin-left: 33.333%; }
+ .col-lg-offset-3 { margin-left: 25%; }
+ .col-lg-offset-2 { margin-left: 16.666%; }
+ .col-lg-offset-1 { margin-left: 8.333%; }
+ .col-lg-offset-0 { margin-left: 0px; }
+}
+caption { padding-top: 8px; padding-bottom: 8px; color: rgb(119, 119, 119); }
+.table { width: 100%; max-width: 100%; margin-bottom: 20px; }
+.table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th { padding: 8px; line-height: 1.42857; vertical-align: top; border-top: 1px solid rgb(221, 221, 221); }
+.table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid rgb(221, 221, 221); }
+.table > caption + thead > tr:first-child > td, .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > td, .table > thead:first-child > tr:first-child > th { border-top: 0px none; }
+.table > tbody + tbody { border-top: 2px solid rgb(221, 221, 221); }
+.table .table { background-color: rgb(255, 255, 255); }
+.table-condensed > tbody > tr > td, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > td, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > thead > tr > th { padding: 5px; }
+.table-bordered, .table-bordered > tbody > tr > td, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > td, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > thead > tr > th { border: 1px solid rgb(221, 221, 221); }
+.table-bordered > thead > tr > td, .table-bordered > thead > tr > th { border-bottom-width: 2px; }
+.table-striped > tbody > tr:nth-of-type(2n+1) { background-color: rgb(249, 249, 249); }
+.table-hover > tbody > tr:hover, .table > tbody > tr.active > td, .table > tbody > tr.active > th, .table > tbody > tr > td.active, .table > tbody > tr > th.active, .table > tfoot > tr.active > td, .table > tfoot > tr.active > th, .table > tfoot > tr > td.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, .table > thead > tr > td.active, .table > thead > tr > th.active { background-color: rgb(245, 245, 245); }
+table col[class*="col-"] { position: static; float: none; display: table-column; }
+table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; }
+.btn-group > .btn-group, .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group, .dropdown-menu { float: left; }
+.table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr.active:hover > th, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover { background-color: rgb(232, 232, 232); }
+.table > tbody > tr.success > td, .table > tbody > tr.success > th, .table > tbody > tr > td.success, .table > tbody > tr > th.success, .table > tfoot > tr.success > td, .table > tfoot > tr.success > th, .table > tfoot > tr > td.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, .table > thead > tr > td.success, .table > thead > tr > th.success { background-color: rgb(223, 240, 216); }
+.table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr.success:hover > th, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover { background-color: rgb(208, 233, 198); }
+.table > tbody > tr.info > td, .table > tbody > tr.info > th, .table > tbody > tr > td.info, .table > tbody > tr > th.info, .table > tfoot > tr.info > td, .table > tfoot > tr.info > th, .table > tfoot > tr > td.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, .table > thead > tr > td.info, .table > thead > tr > th.info { background-color: rgb(217, 237, 247); }
+.table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr.info:hover > th, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover { background-color: rgb(196, 227, 243); }
+.table > tbody > tr.warning > td, .table > tbody > tr.warning > th, .table > tbody > tr > td.warning, .table > tbody > tr > th.warning, .table > tfoot > tr.warning > td, .table > tfoot > tr.warning > th, .table > tfoot > tr > td.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, .table > thead > tr > td.warning, .table > thead > tr > th.warning { background-color: rgb(252, 248, 227); }
+.table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr.warning:hover > th, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover { background-color: rgb(250, 242, 204); }
+.table > tbody > tr.danger > td, .table > tbody > tr.danger > th, .table > tbody > tr > td.danger, .table > tbody > tr > th.danger, .table > tfoot > tr.danger > td, .table > tfoot > tr.danger > th, .table > tfoot > tr > td.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, .table > thead > tr > td.danger, .table > thead > tr > th.danger { background-color: rgb(242, 222, 222); }
+.table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr.danger:hover > th, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover { background-color: rgb(235, 204, 204); }
+.table-responsive { overflow-x: auto; min-height: 0.01%; }
+@media screen and (max-width: 767px) {
+ .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; border: 1px solid rgb(221, 221, 221); }
+ .table-responsive > .table { margin-bottom: 0px; }
+ .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > td, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > thead > tr > th { white-space: nowrap; }
+ .table-responsive > .table-bordered { border: 0px none; }
+ .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > thead > tr > th:first-child { border-left: 0px none; }
+ .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > thead > tr > th:last-child { border-right: 0px none; }
+ .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0px none; }
+}
+fieldset, legend { padding: 0px; border: 0px none; }
+fieldset { margin: 0px; min-width: 0px; }
+legend { width: 100%; margin-bottom: 20px; font-size: 21px; line-height: inherit; border-bottom: 1px solid rgb(229, 229, 229); }
+label { display: inline-block; max-width: 100%; margin-bottom: 5px; }
+input[type="search"] { box-sizing: border-box; }
+input[type="checkbox"], input[type="radio"] { margin: 4px 0px 0px; line-height: normal; }
+.form-control, output { font-size: 14px; line-height: 1.42857; color: rgb(85, 85, 85); display: block; }
+input[type="file"] { display: block; }
+input[type="range"] { display: block; width: 100%; }
+select[multiple], select[size] { height: auto; }
+input[type="file"]:focus, input[type="checkbox"]:focus, input[type="radio"]:focus { outline: thin dotted; outline-offset: -2px; }
+output { padding-top: 7px; }
+.form-control { width: 100%; height: 34px; padding: 6px 12px; background-color: rgb(255, 255, 255); border: 1px solid rgb(204, 204, 204); border-radius: 4px; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset; transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; }
+.form-control:focus { border-color: rgb(102, 175, 233); outline: 0px none; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset, 0px 0px 8px rgba(102, 175, 233, 0.6); }
+.form-control::-moz-placeholder { color: rgb(153, 153, 153); opacity: 1; }
+.has-success .checkbox, .has-success .checkbox-inline, .has-success .control-label, .has-success .form-control-feedback, .has-success .help-block, .has-success .radio, .has-success .radio-inline, .has-success.checkbox label, .has-success.checkbox-inline label, .has-success.radio label, .has-success.radio-inline label { color: rgb(60, 118, 61); }
+.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: rgb(238, 238, 238); opacity: 1; }
+.form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; }
+textarea.form-control { height: auto; }
+@media not all {
+ input.form-control[type="date"], input.form-control[type="time"], input.form-control[type="datetime-local"], input.form-control[type="month"] { line-height: 34px; }
+ .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"], input.input-sm[type="date"], input.input-sm[type="time"], input.input-sm[type="datetime-local"], input.input-sm[type="month"] { line-height: 30px; }
+ .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"], input.input-lg[type="date"], input.input-lg[type="time"], input.input-lg[type="datetime-local"], input.input-lg[type="month"] { line-height: 46px; }
+}
+.form-group { margin-bottom: 15px; }
+.checkbox, .radio { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; }
+.checkbox label, .radio label { min-height: 20px; padding-left: 20px; margin-bottom: 0px; font-weight: 400; cursor: pointer; }
+.checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"], .radio input[type="radio"], .radio-inline input[type="radio"] { position: absolute; margin-left: -20px; }
+.checkbox + .checkbox, .radio + .radio { margin-top: -5px; }
+.checkbox-inline, .radio-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0px; vertical-align: middle; font-weight: 400; cursor: pointer; }
+.checkbox-inline + .checkbox-inline, .radio-inline + .radio-inline { margin-top: 0px; margin-left: 10px; }
+.checkbox-inline.disabled, .checkbox.disabled label, .radio-inline.disabled, .radio.disabled label, fieldset[disabled] .checkbox label, fieldset[disabled] .checkbox-inline, fieldset[disabled] .radio label, fieldset[disabled] .radio-inline, fieldset[disabled] input[type="checkbox"], fieldset[disabled] input[type="radio"], input.disabled[type="checkbox"], input[type="checkbox"][disabled], input.disabled[type="radio"], input[type="radio"][disabled] { cursor: not-allowed; }
+.form-control-static { padding-top: 7px; padding-bottom: 7px; margin-bottom: 0px; min-height: 34px; }
+.form-control-static.input-lg, .form-control-static.input-sm { padding-left: 0px; padding-right: 0px; }
+.form-group-sm .form-control, .input-sm { padding: 5px 10px; border-radius: 3px; font-size: 12px; }
+.input-sm { height: 30px; line-height: 1.5; }
+select.input-sm { height: 30px; line-height: 30px; }
+select.input-sm[multiple], textarea.input-sm { height: auto; }
+.form-group-sm .form-control { height: 30px; line-height: 1.5; }
+.form-group-lg .form-control, .input-lg { border-radius: 6px; padding: 10px 16px; font-size: 18px; }
+.form-group-sm select.form-control { height: 30px; line-height: 30px; }
+.form-group-sm select.form-control[multiple], .form-group-sm textarea.form-control { height: auto; }
+.form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; }
+.input-lg { height: 46px; line-height: 1.33333; }
+select.input-lg { height: 46px; line-height: 46px; }
+select.input-lg[multiple], textarea.input-lg { height: auto; }
+.form-group-lg .form-control { height: 46px; line-height: 1.33333; }
+.form-group-lg select.form-control { height: 46px; line-height: 46px; }
+.form-group-lg select.form-control[multiple], .form-group-lg textarea.form-control { height: auto; }
+.form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.33333; }
+.has-feedback { position: relative; }
+.has-feedback .form-control { padding-right: 42.5px; }
+.form-control-feedback { position: absolute; top: 0px; right: 0px; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; }
+.collapsing, .dropdown, .dropup { position: relative; }
+.form-group-lg .form-control + .form-control-feedback, .input-group-lg + .form-control-feedback, .input-lg + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; }
+.form-group-sm .form-control + .form-control-feedback, .input-group-sm + .form-control-feedback, .input-sm + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; }
+.has-success .form-control { border-color: rgb(60, 118, 61); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset; }
+.has-success .form-control:focus { border-color: rgb(43, 84, 44); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset, 0px 0px 6px rgb(103, 177, 104); }
+.has-success .input-group-addon { color: rgb(60, 118, 61); border-color: rgb(60, 118, 61); background-color: rgb(223, 240, 216); }
+.has-warning .checkbox, .has-warning .checkbox-inline, .has-warning .control-label, .has-warning .form-control-feedback, .has-warning .help-block, .has-warning .radio, .has-warning .radio-inline, .has-warning.checkbox label, .has-warning.checkbox-inline label, .has-warning.radio label, .has-warning.radio-inline label { color: rgb(138, 109, 59); }
+.has-warning .form-control { border-color: rgb(138, 109, 59); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset; }
+.has-warning .form-control:focus { border-color: rgb(102, 81, 44); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset, 0px 0px 6px rgb(192, 161, 107); }
+.has-warning .input-group-addon { color: rgb(138, 109, 59); border-color: rgb(138, 109, 59); background-color: rgb(252, 248, 227); }
+.has-error .checkbox, .has-error .checkbox-inline, .has-error .control-label, .has-error .form-control-feedback, .has-error .help-block, .has-error .radio, .has-error .radio-inline, .has-error.checkbox label, .has-error.checkbox-inline label, .has-error.radio label, .has-error.radio-inline label { color: rgb(169, 68, 66); }
+.has-error .form-control { border-color: rgb(169, 68, 66); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset; }
+.has-error .form-control:focus { border-color: rgb(132, 53, 52); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset, 0px 0px 6px rgb(206, 132, 131); }
+.has-error .input-group-addon { color: rgb(169, 68, 66); border-color: rgb(169, 68, 66); background-color: rgb(242, 222, 222); }
+.has-feedback label ~ .form-control-feedback { top: 25px; }
+.has-feedback label.sr-only ~ .form-control-feedback { top: 0px; }
+.help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: rgb(115, 115, 115); }
+@media (min-width: 768px) {
+ .form-inline .form-control-static, .form-inline .form-group { display: inline-block; }
+ .form-inline .control-label, .form-inline .form-group { margin-bottom: 0px; vertical-align: middle; }
+ .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; }
+ .form-inline .input-group { display: inline-table; vertical-align: middle; }
+ .form-inline .input-group .form-control, .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn { width: auto; }
+ .form-inline .input-group > .form-control { width: 100%; }
+ .form-inline .checkbox, .form-inline .radio { display: inline-block; margin-top: 0px; margin-bottom: 0px; vertical-align: middle; }
+ .form-inline .checkbox label, .form-inline .radio label { padding-left: 0px; }
+ .form-inline .checkbox input[type="checkbox"], .form-inline .radio input[type="radio"] { position: relative; margin-left: 0px; }
+ .form-inline .has-feedback .form-control-feedback { top: 0px; }
+ .form-horizontal .control-label { text-align: right; margin-bottom: 0px; padding-top: 7px; }
+}
+.form-horizontal .checkbox, .form-horizontal .checkbox-inline, .form-horizontal .radio, .form-horizontal .radio-inline { margin-top: 0px; margin-bottom: 0px; padding-top: 7px; }
+.form-horizontal .checkbox, .form-horizontal .radio { min-height: 27px; }
+.form-horizontal .form-group { margin-left: -12px; margin-right: -12px; }
+.form-horizontal .has-feedback .form-control-feedback { right: 12px; }
+@media (min-width: 768px) {
+ .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 18px; }
+ .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; }
+}
+.btn { display: inline-block; margin-bottom: 0px; font-weight: 400; text-align: center; vertical-align: middle; touch-action: manipulation; cursor: pointer; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 14px; line-height: 1.42857; border-radius: 4px; -moz-user-select: none; }
+.btn.active.focus, .btn.active:focus, .btn.focus, .btn.focus:active, .btn:active:focus, .btn:focus { outline: thin dotted; outline-offset: -2px; }
+.btn.focus, .btn:focus, .btn:hover { color: rgb(51, 51, 51); text-decoration: none; }
+.btn.active, .btn:active { outline: 0px none; box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.125) inset; }
+.btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; opacity: 0.65; box-shadow: none; }
+a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; }
+.btn-default { color: rgb(51, 51, 51); background-color: rgb(255, 255, 255); border-color: rgb(204, 204, 204); }
+.btn-default.focus, .btn-default:focus { color: rgb(51, 51, 51); background-color: rgb(230, 230, 230); border-color: rgb(140, 140, 140); }
+.btn-default.active, .btn-default:active, .btn-default:hover, .open > .dropdown-toggle.btn-default { color: rgb(51, 51, 51); background-color: rgb(230, 230, 230); border-color: rgb(173, 173, 173); }
+.btn-default.active.focus, .btn-default.active:focus, .btn-default.active:hover, .btn-default.focus:active, .btn-default:active:focus, .btn-default:active:hover, .open > .dropdown-toggle.btn-default.focus, .open > .dropdown-toggle.btn-default:focus, .open > .dropdown-toggle.btn-default:hover { color: rgb(51, 51, 51); background-color: rgb(212, 212, 212); border-color: rgb(140, 140, 140); }
+.btn-default.disabled.focus, .btn-default.disabled:focus, .btn-default.disabled:hover, .btn-default.focus[disabled], .btn-default[disabled]:focus, .btn-default[disabled]:hover, fieldset[disabled] .btn-default.focus, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:hover { background-color: rgb(255, 255, 255); border-color: rgb(204, 204, 204); }
+.btn-default .badge { color: rgb(255, 255, 255); background-color: rgb(51, 51, 51); }
+.btn-primary { color: rgb(255, 255, 255); background-color: rgb(51, 122, 183); border-color: rgb(46, 109, 164); }
+.btn-primary.focus, .btn-primary:focus { color: rgb(255, 255, 255); background-color: rgb(40, 96, 144); border-color: rgb(18, 43, 64); }
+.btn-primary.active, .btn-primary:active, .btn-primary:hover, .open > .dropdown-toggle.btn-primary { color: rgb(255, 255, 255); background-color: rgb(40, 96, 144); border-color: rgb(32, 77, 116); }
+.btn-primary.active.focus, .btn-primary.active:focus, .btn-primary.active:hover, .btn-primary.focus:active, .btn-primary:active:focus, .btn-primary:active:hover, .open > .dropdown-toggle.btn-primary.focus, .open > .dropdown-toggle.btn-primary:focus, .open > .dropdown-toggle.btn-primary:hover { color: rgb(255, 255, 255); background-color: rgb(32, 77, 116); border-color: rgb(18, 43, 64); }
+.btn-primary.disabled.focus, .btn-primary.disabled:focus, .btn-primary.disabled:hover, .btn-primary.focus[disabled], .btn-primary[disabled]:focus, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:hover { background-color: rgb(51, 122, 183); border-color: rgb(46, 109, 164); }
+.btn-primary .badge { color: rgb(51, 122, 183); background-color: rgb(255, 255, 255); }
+.btn-success { color: rgb(255, 255, 255); background-color: rgb(92, 184, 92); border-color: rgb(76, 174, 76); }
+.btn-success.focus, .btn-success:focus { color: rgb(255, 255, 255); background-color: rgb(68, 157, 68); border-color: rgb(37, 86, 37); }
+.btn-success.active, .btn-success:active, .btn-success:hover, .open > .dropdown-toggle.btn-success { color: rgb(255, 255, 255); background-color: rgb(68, 157, 68); border-color: rgb(57, 132, 57); }
+.btn-success.active.focus, .btn-success.active:focus, .btn-success.active:hover, .btn-success.focus:active, .btn-success:active:focus, .btn-success:active:hover, .open > .dropdown-toggle.btn-success.focus, .open > .dropdown-toggle.btn-success:focus, .open > .dropdown-toggle.btn-success:hover { color: rgb(255, 255, 255); background-color: rgb(57, 132, 57); border-color: rgb(37, 86, 37); }
+.btn-success.active, .btn-success:active, .open > .dropdown-toggle.btn-success { background-image: none; }
+.btn-success.disabled.focus, .btn-success.disabled:focus, .btn-success.disabled:hover, .btn-success.focus[disabled], .btn-success[disabled]:focus, .btn-success[disabled]:hover, fieldset[disabled] .btn-success.focus, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:hover { background-color: rgb(92, 184, 92); border-color: rgb(76, 174, 76); }
+.btn-success .badge { color: rgb(92, 184, 92); background-color: rgb(255, 255, 255); }
+.btn-info { color: rgb(255, 255, 255); background-color: rgb(91, 192, 222); border-color: rgb(70, 184, 218); }
+.btn-info.focus, .btn-info:focus { color: rgb(255, 255, 255); background-color: rgb(49, 176, 213); border-color: rgb(27, 109, 133); }
+.btn-info.active, .btn-info:active, .btn-info:hover, .open > .dropdown-toggle.btn-info { color: rgb(255, 255, 255); background-color: rgb(49, 176, 213); border-color: rgb(38, 154, 188); }
+.btn-info.active.focus, .btn-info.active:focus, .btn-info.active:hover, .btn-info.focus:active, .btn-info:active:focus, .btn-info:active:hover, .open > .dropdown-toggle.btn-info.focus, .open > .dropdown-toggle.btn-info:focus, .open > .dropdown-toggle.btn-info:hover { color: rgb(255, 255, 255); background-color: rgb(38, 154, 188); border-color: rgb(27, 109, 133); }
+.btn-info.disabled.focus, .btn-info.disabled:focus, .btn-info.disabled:hover, .btn-info.focus[disabled], .btn-info[disabled]:focus, .btn-info[disabled]:hover, fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:hover { background-color: rgb(91, 192, 222); border-color: rgb(70, 184, 218); }
+.btn-info .badge { color: rgb(91, 192, 222); background-color: rgb(255, 255, 255); }
+.btn-warning { color: rgb(255, 255, 255); background-color: rgb(240, 173, 78); border-color: rgb(238, 162, 54); }
+.btn-warning.focus, .btn-warning:focus { color: rgb(255, 255, 255); background-color: rgb(236, 151, 31); border-color: rgb(152, 95, 13); }
+.btn-warning.active, .btn-warning:active, .btn-warning:hover, .open > .dropdown-toggle.btn-warning { color: rgb(255, 255, 255); background-color: rgb(236, 151, 31); border-color: rgb(213, 133, 18); }
+.btn-warning.active.focus, .btn-warning.active:focus, .btn-warning.active:hover, .btn-warning.focus:active, .btn-warning:active:focus, .btn-warning:active:hover, .open > .dropdown-toggle.btn-warning.focus, .open > .dropdown-toggle.btn-warning:focus, .open > .dropdown-toggle.btn-warning:hover { color: rgb(255, 255, 255); background-color: rgb(213, 133, 18); border-color: rgb(152, 95, 13); }
+.btn-warning.disabled.focus, .btn-warning.disabled:focus, .btn-warning.disabled:hover, .btn-warning.focus[disabled], .btn-warning[disabled]:focus, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning.focus, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:hover { background-color: rgb(240, 173, 78); border-color: rgb(238, 162, 54); }
+.btn-warning .badge { color: rgb(240, 173, 78); background-color: rgb(255, 255, 255); }
+.btn-danger { color: rgb(255, 255, 255); background-color: rgb(217, 83, 79); border-color: rgb(212, 63, 58); }
+.btn-danger.focus, .btn-danger:focus { color: rgb(255, 255, 255); background-color: rgb(201, 48, 44); border-color: rgb(118, 28, 25); }
+.btn-danger.active, .btn-danger:active, .btn-danger:hover, .open > .dropdown-toggle.btn-danger { color: rgb(255, 255, 255); background-color: rgb(201, 48, 44); border-color: rgb(172, 41, 37); }
+.btn-danger.active.focus, .btn-danger.active:focus, .btn-danger.active:hover, .btn-danger.focus:active, .btn-danger:active:focus, .btn-danger:active:hover, .open > .dropdown-toggle.btn-danger.focus, .open > .dropdown-toggle.btn-danger:focus, .open > .dropdown-toggle.btn-danger:hover { color: rgb(255, 255, 255); background-color: rgb(172, 41, 37); border-color: rgb(118, 28, 25); }
+.btn-danger.disabled.focus, .btn-danger.disabled:focus, .btn-danger.disabled:hover, .btn-danger.focus[disabled], .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:hover { background-color: rgb(217, 83, 79); border-color: rgb(212, 63, 58); }
+.btn-danger .badge { color: rgb(217, 83, 79); background-color: rgb(255, 255, 255); }
+.btn-link { color: rgb(51, 122, 183); font-weight: 400; border-radius: 0px; }
+.btn-link, .btn-link.active, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; box-shadow: none; }
+.btn-link, .btn-link:active, .btn-link:focus, .btn-link:hover { border-color: transparent; }
+.btn-link:focus, .btn-link:hover { color: rgb(35, 82, 124); text-decoration: underline; background-color: transparent; }
+.btn-link[disabled]:focus, .btn-link[disabled]:hover, fieldset[disabled] .btn-link:focus, fieldset[disabled] .btn-link:hover { color: rgb(119, 119, 119); text-decoration: none; }
+.btn-group-lg > .btn, .btn-lg { padding: 10px 16px; font-size: 18px; line-height: 1.33333; border-radius: 6px; }
+.btn-group-sm > .btn, .btn-sm { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; }
+.btn-group-xs > .btn, .btn-xs { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; }
+.btn-block { display: block; width: 100%; }
+.btn-block + .btn-block { margin-top: 5px; }
+input.btn-block[type="button"], input.btn-block[type="reset"], input.btn-block[type="submit"] { width: 100%; }
+.fade { opacity: 0; transition: opacity 0.15s linear 0s; }
+.fade.in { opacity: 1; }
+.collapse { display: none; }
+.collapse.in { display: block; }
+tr.collapse.in { display: table-row; }
+tbody.collapse.in { display: table-row-group; }
+.collapsing { height: 0px; overflow: hidden; transition-property: height, visibility; transition-duration: 0.35s; transition-timing-function: ease; }
+.caret { display: inline-block; width: 0px; height: 0px; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-right: 4px solid transparent; border-left: 4px solid transparent; }
+.dropdown-toggle:focus { outline: 0px none; }
+.dropdown-menu { position: absolute; top: 100%; left: 0px; z-index: 1000; display: none; min-width: 160px; padding: 5px 0px; margin: 2px 0px 0px; list-style: outside none none; font-size: 14px; text-align: left; background-color: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176); background-clip: padding-box; }
+.dropdown-menu-right, .dropdown-menu.pull-right { left: auto; right: 0px; }
+.dropdown-header, .dropdown-menu > li > a { display: block; padding: 3px 20px; line-height: 1.42857; white-space: nowrap; }
+.dropdown-menu .divider { height: 1px; margin: 9px 0px; overflow: hidden; background-color: rgb(229, 229, 229); }
+.dropdown-menu > li > a { clear: both; font-weight: 400; color: rgb(51, 51, 51); }
+.dropdown-menu > li > a:focus, .dropdown-menu > li > a:hover { text-decoration: none; color: rgb(38, 38, 38); background-color: rgb(245, 245, 245); }
+.dropdown-menu > .active > a, .dropdown-menu > .active > a:focus, .dropdown-menu > .active > a:hover { color: rgb(255, 255, 255); text-decoration: none; outline: 0px none; background-color: rgb(51, 122, 183); }
+.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:focus, .dropdown-menu > .disabled > a:hover { color: rgb(119, 119, 119); }
+.dropdown-menu > .disabled > a:focus, .dropdown-menu > .disabled > a:hover { text-decoration: none; background-color: transparent; cursor: not-allowed; }
+.open > .dropdown-menu { display: block; }
+.open > a { outline: 0px none; }
+.dropdown-menu-left { left: 0px; right: auto; }
+.dropdown-header { font-size: 12px; color: rgb(119, 119, 119); }
+.dropdown-backdrop { position: fixed; left: 0px; right: 0px; bottom: 0px; top: 0px; z-index: 990; }
+.nav-justified > .dropdown .dropdown-menu, .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; }
+.pull-right > .dropdown-menu { right: 0px; left: auto; }
+.dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0px none; border-bottom: 4px dashed; content: ""; }
+.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; }
+@media (min-width: 992px) {
+ .navbar-right .dropdown-menu { left: auto; right: 0px; }
+ .navbar-right .dropdown-menu-left { left: 0px; right: auto; }
+}
+.btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; }
+.btn-group-vertical > .btn, .btn-group > .btn { position: relative; float: left; }
+.btn-group-vertical > .btn.active, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:hover, .btn-group > .btn.active, .btn-group > .btn:active, .btn-group > .btn:focus, .btn-group > .btn:hover { z-index: 2; }
+.btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; }
+.btn-toolbar { margin-left: -5px; }
+.btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; }
+.btn .caret, .btn-group > .btn:first-child { margin-left: 0px; }
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0px; }
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0px; border-top-right-radius: 0px; }
+.btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0px; border-top-left-radius: 0px; }
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0px; }
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0px; border-top-right-radius: 0px; }
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-bottom-left-radius: 0px; border-top-left-radius: 0px; }
+.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0px none; }
+.btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; }
+.btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; }
+.btn-group.open .dropdown-toggle { box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.125) inset; }
+.btn-group.open .dropdown-toggle.btn-link { box-shadow: none; }
+.btn-lg .caret { border-width: 5px 5px 0px; }
+.dropup .btn-lg .caret { border-width: 0px 5px 5px; }
+.btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; }
+.btn-group-vertical > .btn-group > .btn { float: none; }
+.btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0px; }
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0px; }
+.btn-group-vertical > .btn:first-child:not(:last-child) { border-radius: 4px 4px 0px 0px; }
+.btn-group-vertical > .btn:last-child:not(:first-child) { border-radius: 0px 0px 4px 4px; }
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0px; }
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; }
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-right-radius: 0px; border-top-left-radius: 0px; }
+.btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; }
+.btn-group-justified > .btn, .btn-group-justified > .btn-group { float: none; display: table-cell; width: 1%; }
+.btn-group-justified > .btn-group .btn { width: 100%; }
+.btn-group-justified > .btn-group .dropdown-menu { left: auto; }
+[data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"] { position: absolute; clip: rect(0px, 0px, 0px, 0px); pointer-events: none; }
+.input-group { position: relative; display: table; border-collapse: separate; }
+.input-group[class*="col-"] { float: none; padding-left: 0px; padding-right: 0px; }
+.input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0px; }
+.input-group .form-control:focus { z-index: 3; }
+.input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.33333; border-radius: 6px; }
+select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; }
+select.input-group-lg[multiple] > .form-control, select.input-group-lg[multiple] > .input-group-addon, select.input-group-lg[multiple] > .input-group-btn > .btn, textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn { height: auto; }
+.input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; }
+select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; }
+select.input-group-sm[multiple] > .form-control, select.input-group-sm[multiple] > .input-group-addon, select.input-group-sm[multiple] > .input-group-btn > .btn, textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn { height: auto; }
+.input-group .form-control, .input-group-addon, .input-group-btn { display: table-cell; }
+.nav > li, .nav > li > a { display: block; position: relative; }
+.input-group .form-control:not(:first-child):not(:last-child), .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child) { border-radius: 0px; }
+.input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; }
+.input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: 400; line-height: 1; color: rgb(85, 85, 85); text-align: center; background-color: rgb(238, 238, 238); border: 1px solid rgb(204, 204, 204); border-radius: 4px; }
+.badge, .label { font-weight: 700; white-space: nowrap; text-align: center; }
+.input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; }
+.input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; }
+.input-group-addon input[type="checkbox"], .input-group-addon input[type="radio"] { margin-top: 0px; }
+.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn-group:not(:last-child) > .btn, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0px; border-top-right-radius: 0px; }
+.input-group-addon:first-child { border-right: 0px none; }
+.input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:first-child > .btn-group:not(:first-child) > .btn, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle { border-bottom-left-radius: 0px; border-top-left-radius: 0px; }
+.input-group-addon:last-child { border-left: 0px none; }
+.input-group-btn { position: relative; font-size: 0px; white-space: nowrap; }
+.input-group-btn > .btn { position: relative; }
+.input-group-btn > .btn + .btn { margin-left: -1px; }
+.input-group-btn > .btn:active, .input-group-btn > .btn:focus, .input-group-btn > .btn:hover { z-index: 2; }
+.input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; }
+.input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; }
+.nav { margin-bottom: 0px; padding-left: 0px; list-style: outside none none; }
+.nav > li > a { padding: 10px 15px; }
+.nav > li > a:focus, .nav > li > a:hover { text-decoration: none; background-color: rgb(238, 238, 238); }
+.nav > li.disabled > a { color: rgb(119, 119, 119); }
+.nav > li.disabled > a:focus, .nav > li.disabled > a:hover { color: rgb(119, 119, 119); text-decoration: none; background-color: transparent; cursor: not-allowed; }
+.nav .open > a, .nav .open > a:focus, .nav .open > a:hover { background-color: rgb(238, 238, 238); border-color: rgb(51, 122, 183); }
+.nav .nav-divider { height: 1px; margin: 9px 0px; overflow: hidden; background-color: rgb(229, 229, 229); }
+.nav > li > a > img { max-width: none; }
+.nav-tabs { border-bottom: 1px solid rgb(221, 221, 221); }
+.nav-tabs > li { float: left; margin-bottom: -1px; }
+.nav-tabs > li > a { margin-right: 2px; line-height: 1.42857; border: 1px solid transparent; border-radius: 4px 4px 0px 0px; }
+.nav-tabs > li > a:hover { border-color: rgb(238, 238, 238) rgb(238, 238, 238) rgb(221, 221, 221); }
+.nav-tabs > li.active > a, .nav-tabs > li.active > a:focus, .nav-tabs > li.active > a:hover { color: rgb(85, 85, 85); background-color: rgb(255, 255, 255); border-width: 1px; border-style: solid; border-color: rgb(221, 221, 221) rgb(221, 221, 221) transparent; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image: none; cursor: default; }
+.nav-tabs.nav-justified { width: 100%; border-bottom: 0px none; }
+.nav-tabs.nav-justified > li { float: none; }
+.nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; margin-right: 0px; border-radius: 4px; }
+.nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:hover { border: 1px solid rgb(221, 221, 221); }
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li { display: table-cell; width: 1%; }
+ .nav-tabs.nav-justified > li > a { margin-bottom: 0px; border-bottom: 1px solid rgb(221, 221, 221); border-radius: 4px 4px 0px 0px; }
+ .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:hover { border-bottom-color: rgb(255, 255, 255); }
+}
+.nav-pills > li { float: left; }
+.nav-justified > li, .nav-stacked > li { float: none; }
+.nav-pills > li > a { border-radius: 4px; }
+.nav-pills > li + li { margin-left: 2px; }
+.nav-pills > li.active > a, .nav-pills > li.active > a:focus, .nav-pills > li.active > a:hover { color: rgb(255, 255, 255); background-color: rgb(51, 122, 183); }
+.nav-stacked > li + li { margin-top: 2px; margin-left: 0px; }
+.nav-justified { width: 100%; }
+.nav-justified > li > a { text-align: center; margin-bottom: 5px; }
+.nav-tabs-justified { border-bottom: 0px none; }
+.nav-tabs-justified > li > a { margin-right: 0px; border-radius: 4px; }
+.nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:focus, .nav-tabs-justified > .active > a:hover { border: 1px solid rgb(221, 221, 221); }
+@media (min-width: 768px) {
+ .nav-justified > li { display: table-cell; width: 1%; }
+ .nav-justified > li > a { margin-bottom: 0px; }
+ .nav-tabs-justified > li > a { border-bottom: 1px solid rgb(221, 221, 221); border-radius: 4px 4px 0px 0px; }
+ .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:focus, .nav-tabs-justified > .active > a:hover { border-bottom-color: rgb(255, 255, 255); }
+}
+.tab-content > .tab-pane { display: none; }
+.tab-content > .active { display: block; }
+.nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0px; border-top-left-radius: 0px; }
+.navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; }
+.navbar-collapse { overflow-x: visible; padding-right: 12px; padding-left: 12px; border-top: 1px solid transparent; box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1) inset; }
+.navbar-collapse.in { overflow-y: auto; }
+@media (min-width: 992px) {
+ .navbar { border-radius: 4px; }
+ .navbar-header { float: left; }
+ .navbar-collapse { width: auto; border-top: 0px none; box-shadow: none; }
+ .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0px; overflow: visible !important; }
+ .navbar-collapse.in { overflow-y: visible; }
+ .navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse { padding-left: 0px; padding-right: 0px; }
+}
+.embed-responsive, .modal, .modal-open, .progress { overflow: hidden; }
+@media (max-device-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse { max-height: 200px; }
+}
+.container-fluid > .navbar-collapse, .container-fluid > .navbar-header, .container > .navbar-collapse, .container > .navbar-header { margin-right: -12px; margin-left: -12px; }
+.navbar-static-top { z-index: 1000; border-width: 0px 0px 1px; }
+.navbar-fixed-bottom, .navbar-fixed-top { position: fixed; right: 0px; left: 0px; z-index: 1030; }
+.navbar-fixed-top { top: 0px; border-width: 0px 0px 1px; }
+.navbar-fixed-bottom { bottom: 0px; margin-bottom: 0px; border-width: 1px 0px 0px; }
+.navbar-brand { float: left; padding: 15px 12px; font-size: 18px; line-height: 20px; height: 50px; }
+.navbar-brand:focus, .navbar-brand:hover { text-decoration: none; }
+.navbar-brand > img { display: block; }
+@media (min-width: 992px) {
+ .container-fluid > .navbar-collapse, .container-fluid > .navbar-header, .container > .navbar-collapse, .container > .navbar-header { margin-right: 0px; margin-left: 0px; }
+ .navbar-fixed-bottom, .navbar-fixed-top, .navbar-static-top { border-radius: 0px; }
+ .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -12px; }
+}
+.navbar-toggle { position: relative; float: right; margin-right: 12px; padding: 9px 10px; margin-top: 8px; margin-bottom: 8px; background-color: transparent; border: 1px solid transparent; border-radius: 4px; }
+.navbar-toggle:focus { outline: 0px none; }
+.navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; }
+.navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; }
+.navbar-nav { margin: 7.5px -12px; }
+.navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; }
+@media (max-width: 991px) {
+ .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0px; background-color: transparent; border: 0px none; box-shadow: none; }
+ .navbar-nav .open .dropdown-menu .dropdown-header, .navbar-nav .open .dropdown-menu > li > a { padding: 5px 15px 5px 25px; }
+ .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; }
+ .navbar-nav .open .dropdown-menu > li > a:focus, .navbar-nav .open .dropdown-menu > li > a:hover { background-image: none; }
+}
+.progress-bar-striped, .progress-striped .progress-bar, .progress-striped .progress-bar-success { background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+@media (min-width: 992px) {
+ .navbar-toggle { display: none; }
+ .navbar-nav { float: left; margin: 0px; }
+ .navbar-nav > li { float: left; }
+ .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; }
+}
+.navbar-form { padding: 10px 12px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1) inset, 0px 1px 0px rgba(255, 255, 255, 0.1); margin: 8px -12px; }
+@media (min-width: 768px) {
+ .navbar-form .form-control-static, .navbar-form .form-group { display: inline-block; }
+ .navbar-form .control-label, .navbar-form .form-group { margin-bottom: 0px; vertical-align: middle; }
+ .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; }
+ .navbar-form .input-group { display: inline-table; vertical-align: middle; }
+ .navbar-form .input-group .form-control, .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn { width: auto; }
+ .navbar-form .input-group > .form-control { width: 100%; }
+ .navbar-form .checkbox, .navbar-form .radio { display: inline-block; margin-top: 0px; margin-bottom: 0px; vertical-align: middle; }
+ .navbar-form .checkbox label, .navbar-form .radio label { padding-left: 0px; }
+ .navbar-form .checkbox input[type="checkbox"], .navbar-form .radio input[type="radio"] { position: relative; margin-left: 0px; }
+ .navbar-form .has-feedback .form-control-feedback { top: 0px; }
+}
+.breadcrumb > li, .pagination { display: inline-block; }
+.btn .badge, .btn .label { top: -1px; position: relative; }
+@media (max-width: 991px) {
+ .navbar-form .form-group { margin-bottom: 5px; }
+ .navbar-form .form-group:last-child { margin-bottom: 0px; }
+}
+@media (min-width: 992px) {
+ .navbar-form { width: auto; border: 0px none; margin-left: 0px; margin-right: 0px; padding-top: 0px; padding-bottom: 0px; box-shadow: none; }
+ .navbar-text { float: left; margin-left: 12px; margin-right: 12px; }
+}
+.navbar-nav > li > .dropdown-menu { margin-top: 0px; border-top-right-radius: 0px; border-top-left-radius: 0px; }
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0px; border-radius: 4px 4px 0px 0px; }
+.navbar-btn { margin-top: 8px; margin-bottom: 8px; }
+.navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; }
+.navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; }
+.media, .navbar-text { margin-top: 15px; }
+.navbar-text { margin-bottom: 15px; }
+@media (min-width: 992px) {
+ .navbar-left { float: left !important; }
+ .navbar-right { float: right !important; margin-right: -12px; }
+ .navbar-right ~ .navbar-right { margin-right: 0px; }
+}
+.navbar-default { background-color: rgb(248, 248, 248); border-color: rgb(231, 231, 231); }
+.navbar-default .navbar-brand { color: rgb(119, 119, 119); }
+.navbar-default .navbar-brand:focus, .navbar-default .navbar-brand:hover { color: rgb(94, 94, 94); background-color: transparent; }
+.navbar-default .navbar-nav > li > a, .navbar-default .navbar-text { color: rgb(119, 119, 119); }
+.navbar-default .navbar-nav > li > a:focus, .navbar-default .navbar-nav > li > a:hover { color: rgb(51, 51, 51); background-color: transparent; }
+.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:focus, .navbar-default .navbar-nav > .active > a:hover { color: rgb(85, 85, 85); background-color: rgb(231, 231, 231); }
+.navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:focus, .navbar-default .navbar-nav > .disabled > a:hover { color: rgb(204, 204, 204); background-color: transparent; }
+.navbar-default .navbar-toggle { border-color: rgb(221, 221, 221); }
+.navbar-default .navbar-toggle:focus, .navbar-default .navbar-toggle:hover { background-color: rgb(221, 221, 221); }
+.navbar-default .navbar-toggle .icon-bar { background-color: rgb(136, 136, 136); }
+.navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: rgb(231, 231, 231); }
+.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:focus, .navbar-default .navbar-nav > .open > a:hover { background-color: rgb(231, 231, 231); color: rgb(85, 85, 85); }
+@media (max-width: 991px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: rgb(119, 119, 119); }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus, .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover { color: rgb(51, 51, 51); background-color: transparent; }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover { color: rgb(85, 85, 85); background-color: rgb(231, 231, 231); }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover { color: rgb(204, 204, 204); background-color: transparent; }
+}
+.navbar-default .navbar-link { color: rgb(119, 119, 119); }
+.navbar-default .navbar-link:hover { color: rgb(51, 51, 51); }
+.navbar-default .btn-link { color: rgb(119, 119, 119); }
+.navbar-default .btn-link:focus, .navbar-default .btn-link:hover { color: rgb(51, 51, 51); }
+.navbar-default .btn-link[disabled]:focus, .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:focus, fieldset[disabled] .navbar-default .btn-link:hover { color: rgb(204, 204, 204); }
+.navbar-inverse { background-color: rgb(34, 34, 34); border-color: rgb(8, 8, 8); }
+.navbar-inverse .navbar-brand { color: rgb(157, 157, 157); }
+.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover { color: rgb(255, 255, 255); background-color: transparent; }
+.navbar-inverse .navbar-nav > li > a, .navbar-inverse .navbar-text { color: rgb(157, 157, 157); }
+.navbar-inverse .navbar-nav > li > a:focus, .navbar-inverse .navbar-nav > li > a:hover { color: rgb(255, 255, 255); background-color: transparent; }
+.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:focus, .navbar-inverse .navbar-nav > .active > a:hover { color: rgb(255, 255, 255); background-color: rgb(8, 8, 8); }
+.navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:focus, .navbar-inverse .navbar-nav > .disabled > a:hover { color: rgb(68, 68, 68); background-color: transparent; }
+.navbar-inverse .navbar-toggle { border-color: rgb(51, 51, 51); }
+.navbar-inverse .navbar-toggle:focus, .navbar-inverse .navbar-toggle:hover { background-color: rgb(51, 51, 51); }
+.navbar-inverse .navbar-toggle .icon-bar { background-color: rgb(255, 255, 255); }
+.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: rgb(16, 16, 16); }
+.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:focus, .navbar-inverse .navbar-nav > .open > a:hover { background-color: rgb(8, 8, 8); color: rgb(255, 255, 255); }
+@media (max-width: 991px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: rgb(8, 8, 8); }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: rgb(8, 8, 8); }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: rgb(157, 157, 157); }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover { color: rgb(255, 255, 255); background-color: transparent; }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover { color: rgb(255, 255, 255); background-color: rgb(8, 8, 8); }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover { color: rgb(68, 68, 68); background-color: transparent; }
+}
+.navbar-inverse .navbar-link { color: rgb(157, 157, 157); }
+.navbar-inverse .navbar-link:hover { color: rgb(255, 255, 255); }
+.navbar-inverse .btn-link { color: rgb(157, 157, 157); }
+.navbar-inverse .btn-link:focus, .navbar-inverse .btn-link:hover { color: rgb(255, 255, 255); }
+.navbar-inverse .btn-link[disabled]:focus, .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:focus, fieldset[disabled] .navbar-inverse .btn-link:hover { color: rgb(68, 68, 68); }
+.breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: outside none none; background-color: rgb(245, 245, 245); border-radius: 4px; }
+.breadcrumb > li + li::before { content: "/ "; padding: 0px 5px; color: rgb(204, 204, 204); }
+.breadcrumb > .active { color: rgb(119, 119, 119); }
+.pagination { padding-left: 0px; margin: 20px 0px; border-radius: 4px; }
+.pager li, .pagination > li { display: inline; }
+.pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; line-height: 1.42857; text-decoration: none; color: rgb(51, 122, 183); background-color: rgb(255, 255, 255); border: 1px solid rgb(221, 221, 221); margin-left: -1px; }
+.pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0px; border-bottom-left-radius: 4px; border-top-left-radius: 4px; }
+.pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 4px; border-top-right-radius: 4px; }
+.pagination > li > a:focus, .pagination > li > a:hover, .pagination > li > span:focus, .pagination > li > span:hover { z-index: 2; color: rgb(35, 82, 124); background-color: rgb(238, 238, 238); border-color: rgb(221, 221, 221); }
+.pagination > .active > a, .pagination > .active > a:focus, .pagination > .active > a:hover, .pagination > .active > span, .pagination > .active > span:focus, .pagination > .active > span:hover { z-index: 3; color: rgb(255, 255, 255); background-color: rgb(51, 122, 183); border-color: rgb(51, 122, 183); cursor: default; }
+.pagination > .disabled > a, .pagination > .disabled > a:focus, .pagination > .disabled > a:hover, .pagination > .disabled > span, .pagination > .disabled > span:focus, .pagination > .disabled > span:hover { color: rgb(119, 119, 119); background-color: rgb(255, 255, 255); border-color: rgb(221, 221, 221); cursor: not-allowed; }
+.pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.33333; }
+.pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; }
+.pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-bottom-right-radius: 6px; border-top-right-radius: 6px; }
+.pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; }
+.badge, .close, .label { line-height: 1; }
+.pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; }
+.pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; }
+.pager { padding-left: 0px; margin: 20px 0px; list-style: outside none none; text-align: center; }
+.pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: rgb(255, 255, 255); border: 1px solid rgb(221, 221, 221); border-radius: 15px; }
+.pager li > a:focus, .pager li > a:hover { text-decoration: none; background-color: rgb(238, 238, 238); }
+.pager .next > a, .pager .next > span { float: right; }
+.pager .previous > a, .pager .previous > span { float: left; }
+.pager .disabled > a, .pager .disabled > a:focus, .pager .disabled > a:hover, .pager .disabled > span { color: rgb(119, 119, 119); background-color: rgb(255, 255, 255); cursor: not-allowed; }
+a.badge:focus, a.badge:hover, a.label:focus, a.label:hover { color: rgb(255, 255, 255); cursor: pointer; text-decoration: none; }
+.label { display: inline; padding: 0.2em 0.6em 0.3em; font-size: 75%; color: rgb(255, 255, 255); border-radius: 0.25em; }
+.label:empty { display: none; }
+.label-default { background-color: rgb(119, 119, 119); }
+.label-default[href]:focus, .label-default[href]:hover { background-color: rgb(94, 94, 94); }
+.label-primary { background-color: rgb(51, 122, 183); }
+.label-primary[href]:focus, .label-primary[href]:hover { background-color: rgb(40, 96, 144); }
+.label-success { background-color: rgb(92, 184, 92); }
+.label-success[href]:focus, .label-success[href]:hover { background-color: rgb(68, 157, 68); }
+.label-info { background-color: rgb(91, 192, 222); }
+.label-info[href]:focus, .label-info[href]:hover { background-color: rgb(49, 176, 213); }
+.label-warning { background-color: rgb(240, 173, 78); }
+.label-warning[href]:focus, .label-warning[href]:hover { background-color: rgb(236, 151, 31); }
+.label-danger { background-color: rgb(217, 83, 79); }
+.label-danger[href]:focus, .label-danger[href]:hover { background-color: rgb(201, 48, 44); }
+.badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; color: rgb(255, 255, 255); vertical-align: middle; background-color: rgb(119, 119, 119); border-radius: 10px; }
+.badge:empty { display: none; }
+.media-object, .thumbnail { display: block; }
+.btn-group-xs > .btn .badge, .btn-xs .badge { top: 0px; padding: 1px 5px; }
+.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: rgb(51, 122, 183); background-color: rgb(255, 255, 255); }
+.jumbotron, .jumbotron .h1, .jumbotron h1 { color: inherit; }
+.list-group-item > .badge { float: right; }
+.list-group-item > .badge + .badge { margin-right: 5px; }
+.nav-pills > li > a > .badge { margin-left: 3px; }
+.jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; background-color: rgb(238, 238, 238); }
+.jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; }
+.alert, .thumbnail { margin-bottom: 20px; }
+.alert .alert-link, .close { font-weight: 700; }
+.jumbotron > hr { border-top-color: rgb(213, 213, 213); }
+.container .jumbotron, .container-fluid .jumbotron { border-radius: 6px; padding-left: 12px; padding-right: 12px; }
+.jumbotron .container { max-width: 100%; }
+@media screen and (min-width: 768px) {
+ .jumbotron { padding-top: 48px; padding-bottom: 48px; }
+ .container .jumbotron, .container-fluid .jumbotron { padding-left: 60px; padding-right: 60px; }
+ .jumbotron .h1, .jumbotron h1 { font-size: 63px; }
+}
+.thumbnail { padding: 4px; line-height: 1.42857; background-color: rgb(255, 255, 255); border: 1px solid rgb(221, 221, 221); border-radius: 4px; transition: border 0.2s ease-in-out 0s; }
+.thumbnail a > img, .thumbnail > img { margin-left: auto; margin-right: auto; }
+a.thumbnail.active, a.thumbnail:focus, a.thumbnail:hover { border-color: rgb(51, 122, 183); }
+.thumbnail .caption { padding: 9px; color: rgb(51, 51, 51); }
+.alert { padding: 15px; border: 1px solid transparent; border-radius: 4px; }
+.alert h4 { margin-top: 0px; color: inherit; }
+.alert > p, .alert > ul { margin-bottom: 0px; }
+.alert > p + p { margin-top: 5px; }
+.alert-dismissable, .alert-dismissible { padding-right: 35px; }
+.alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; }
+.modal, .modal-backdrop { right: 0px; bottom: 0px; left: 0px; }
+.alert-success { background-color: rgb(223, 240, 216); border-color: rgb(214, 233, 198); color: rgb(60, 118, 61); }
+.alert-success hr { border-top-color: rgb(201, 226, 179); }
+.alert-success .alert-link { color: rgb(43, 84, 44); }
+.alert-info { background-color: rgb(217, 237, 247); border-color: rgb(188, 232, 241); color: rgb(49, 112, 143); }
+.alert-info hr { border-top-color: rgb(166, 225, 236); }
+.alert-info .alert-link { color: rgb(36, 82, 105); }
+.alert-warning { background-color: rgb(252, 248, 227); border-color: rgb(250, 235, 204); color: rgb(138, 109, 59); }
+.alert-warning hr { border-top-color: rgb(247, 225, 181); }
+.alert-warning .alert-link { color: rgb(102, 81, 44); }
+.alert-danger { background-color: rgb(242, 222, 222); border-color: rgb(235, 204, 209); color: rgb(169, 68, 66); }
+.alert-danger hr { border-top-color: rgb(228, 185, 192); }
+.alert-danger .alert-link { color: rgb(132, 53, 52); }
+@keyframes progress-bar-stripes {
+0% { background-position: 40px 0px; }
+100% { background-position: 0px 0px; }
+}
+@keyframes progress-bar-stripes {
+0% { background-position: 40px 0px; }
+100% { background-position: 0px 0px; }
+}
+.progress { height: 20px; margin-bottom: 20px; background-color: rgb(245, 245, 245); border-radius: 4px; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; }
+.progress-bar { float: left; width: 0px; height: 100%; font-size: 12px; line-height: 20px; color: rgb(255, 255, 255); text-align: center; background-color: rgb(51, 122, 183); box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.15) inset; transition: width 0.6s ease 0s; }
+.progress-bar-striped, .progress-striped .progress-bar { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; }
+.progress-bar.active, .progress.active .progress-bar { animation: 2s linear 0s normal none infinite running progress-bar-stripes; }
+.progress-bar-success { background-color: rgb(92, 184, 92); }
+.progress-striped .progress-bar-success { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-striped .progress-bar-info, .progress-striped .progress-bar-warning { background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-info { background-color: rgb(91, 192, 222); }
+.progress-striped .progress-bar-info { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-warning { background-color: rgb(240, 173, 78); }
+.progress-striped .progress-bar-warning { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.progress-bar-danger { background-color: rgb(217, 83, 79); }
+.progress-striped .progress-bar-danger { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+.media:first-child { margin-top: 0px; }
+.media, .media-body { overflow: hidden; }
+.media-body { width: 10000px; }
+.media-object.img-thumbnail { max-width: none; }
+.media-right, .media > .pull-right { padding-left: 10px; }
+.media-left, .media > .pull-left { padding-right: 10px; }
+.media-body, .media-left, .media-right { display: table-cell; vertical-align: top; }
+.media-middle { vertical-align: middle; }
+.media-bottom { vertical-align: bottom; }
+.media-heading { margin-top: 0px; margin-bottom: 5px; }
+.media-list { padding-left: 0px; list-style: outside none none; }
+.list-group { margin-bottom: 20px; padding-left: 0px; }
+.list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: rgb(255, 255, 255); border: 1px solid rgb(221, 221, 221); }
+.list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; }
+.list-group-item:last-child { margin-bottom: 0px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; }
+a.list-group-item, button.list-group-item { color: rgb(85, 85, 85); }
+a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: rgb(51, 51, 51); }
+a.list-group-item:focus, a.list-group-item:hover, button.list-group-item:focus, button.list-group-item:hover { text-decoration: none; color: rgb(85, 85, 85); background-color: rgb(245, 245, 245); }
+button.list-group-item { width: 100%; text-align: left; }
+.list-group-item.disabled, .list-group-item.disabled:focus, .list-group-item.disabled:hover { background-color: rgb(238, 238, 238); color: rgb(119, 119, 119); cursor: not-allowed; }
+.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading { color: inherit; }
+.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text { color: rgb(119, 119, 119); }
+.list-group-item.active, .list-group-item.active:focus, .list-group-item.active:hover { z-index: 2; color: rgb(255, 255, 255); background-color: rgb(51, 122, 183); border-color: rgb(51, 122, 183); }
+.list-group-item.active .list-group-item-heading, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > small { color: inherit; }
+.list-group-item.active .list-group-item-text, .list-group-item.active:focus .list-group-item-text, .list-group-item.active:hover .list-group-item-text { color: rgb(199, 221, 239); }
+.list-group-item-success { color: rgb(60, 118, 61); background-color: rgb(223, 240, 216); }
+a.list-group-item-success, button.list-group-item-success { color: rgb(60, 118, 61); }
+a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; }
+a.list-group-item-success:focus, a.list-group-item-success:hover, button.list-group-item-success:focus, button.list-group-item-success:hover { color: rgb(60, 118, 61); background-color: rgb(208, 233, 198); }
+a.list-group-item-success.active, a.list-group-item-success.active:focus, a.list-group-item-success.active:hover, button.list-group-item-success.active, button.list-group-item-success.active:focus, button.list-group-item-success.active:hover { color: rgb(255, 255, 255); background-color: rgb(60, 118, 61); border-color: rgb(60, 118, 61); }
+.list-group-item-info { color: rgb(49, 112, 143); background-color: rgb(217, 237, 247); }
+a.list-group-item-info, button.list-group-item-info { color: rgb(49, 112, 143); }
+a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; }
+a.list-group-item-info:focus, a.list-group-item-info:hover, button.list-group-item-info:focus, button.list-group-item-info:hover { color: rgb(49, 112, 143); background-color: rgb(196, 227, 243); }
+a.list-group-item-info.active, a.list-group-item-info.active:focus, a.list-group-item-info.active:hover, button.list-group-item-info.active, button.list-group-item-info.active:focus, button.list-group-item-info.active:hover { color: rgb(255, 255, 255); background-color: rgb(49, 112, 143); border-color: rgb(49, 112, 143); }
+.list-group-item-warning { color: rgb(138, 109, 59); background-color: rgb(252, 248, 227); }
+a.list-group-item-warning, button.list-group-item-warning { color: rgb(138, 109, 59); }
+a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; }
+a.list-group-item-warning:focus, a.list-group-item-warning:hover, button.list-group-item-warning:focus, button.list-group-item-warning:hover { color: rgb(138, 109, 59); background-color: rgb(250, 242, 204); }
+a.list-group-item-warning.active, a.list-group-item-warning.active:focus, a.list-group-item-warning.active:hover, button.list-group-item-warning.active, button.list-group-item-warning.active:focus, button.list-group-item-warning.active:hover { color: rgb(255, 255, 255); background-color: rgb(138, 109, 59); border-color: rgb(138, 109, 59); }
+.list-group-item-danger { color: rgb(169, 68, 66); background-color: rgb(242, 222, 222); }
+a.list-group-item-danger, button.list-group-item-danger { color: rgb(169, 68, 66); }
+a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; }
+a.list-group-item-danger:focus, a.list-group-item-danger:hover, button.list-group-item-danger:focus, button.list-group-item-danger:hover { color: rgb(169, 68, 66); background-color: rgb(235, 204, 204); }
+a.list-group-item-danger.active, a.list-group-item-danger.active:focus, a.list-group-item-danger.active:hover, button.list-group-item-danger.active, button.list-group-item-danger.active:focus, button.list-group-item-danger.active:hover { color: rgb(255, 255, 255); background-color: rgb(169, 68, 66); border-color: rgb(169, 68, 66); }
+.panel-heading > .dropdown .dropdown-toggle, .panel-title, .panel-title > .small, .panel-title > .small > a, .panel-title > a, .panel-title > small, .panel-title > small > a { color: inherit; }
+.list-group-item-heading { margin-top: 0px; margin-bottom: 5px; }
+.list-group-item-text { margin-bottom: 0px; line-height: 1.3; }
+.panel { margin-bottom: 20px; background-color: rgb(255, 255, 255); border: 1px solid transparent; border-radius: 4px; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); }
+.panel-title, .panel > .list-group, .panel > .panel-collapse > .list-group, .panel > .panel-collapse > .table, .panel > .table, .panel > .table-responsive > .table { margin-bottom: 0px; }
+.panel-body { padding: 15px; }
+.panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; }
+.panel-title { margin-top: 0px; font-size: 16px; }
+.panel-footer { padding: 10px 15px; background-color: rgb(245, 245, 245); border-top: 1px solid rgb(221, 221, 221); border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; }
+.panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0px; border-radius: 0px; }
+.panel-group .panel-heading, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th { border-bottom: 0px none; }
+.panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0px none; border-top-right-radius: 3px; border-top-left-radius: 3px; }
+.panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0px none; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; }
+.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-right-radius: 0px; border-top-left-radius: 0px; }
+.panel > .table-responsive:first-child > .table:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table:first-child > thead:first-child > tr:first-child { border-top-right-radius: 3px; border-top-left-radius: 3px; }
+.list-group + .panel-footer, .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0px; }
+.panel > .panel-collapse > .table caption, .panel > .table caption, .panel > .table-responsive > .table caption { padding-left: 15px; padding-right: 15px; }
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; }
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; }
+.panel > .table-responsive:last-child > .table:last-child, .panel > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; }
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; }
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; }
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; }
+.panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid rgb(221, 221, 221); }
+.panel > .table > tbody:first-child > tr:first-child td, .panel > .table > tbody:first-child > tr:first-child th { border-top: 0px none; }
+.panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0px none; }
+.panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child { border-left: 0px none; }
+.panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child { border-right: 0px none; }
+.panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0px none; }
+.panel > .table-responsive { border: 0px none; margin-bottom: 0px; }
+.panel-group { margin-bottom: 20px; }
+.panel-group .panel { margin-bottom: 0px; border-radius: 4px; }
+.panel-group .panel + .panel { margin-top: 5px; }
+.panel-group .panel-heading + .panel-collapse > .list-group, .panel-group .panel-heading + .panel-collapse > .panel-body { border-top: 1px solid rgb(221, 221, 221); }
+.panel-group .panel-footer { border-top: 0px none; }
+.panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid rgb(221, 221, 221); }
+.panel-default { border-color: rgb(221, 221, 221); }
+.panel-default > .panel-heading { color: rgb(51, 51, 51); background-color: rgb(245, 245, 245); border-color: rgb(221, 221, 221); }
+.panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: rgb(221, 221, 221); }
+.panel-default > .panel-heading .badge { color: rgb(245, 245, 245); background-color: rgb(51, 51, 51); }
+.panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: rgb(221, 221, 221); }
+.panel-primary { border-color: rgb(51, 122, 183); }
+.panel-primary > .panel-heading { color: rgb(255, 255, 255); background-color: rgb(51, 122, 183); border-color: rgb(51, 122, 183); }
+.panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: rgb(51, 122, 183); }
+.panel-primary > .panel-heading .badge { color: rgb(51, 122, 183); background-color: rgb(255, 255, 255); }
+.panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: rgb(51, 122, 183); }
+.panel-success { border-color: rgb(214, 233, 198); }
+.panel-success > .panel-heading { color: rgb(60, 118, 61); background-color: rgb(223, 240, 216); border-color: rgb(214, 233, 198); }
+.panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: rgb(214, 233, 198); }
+.panel-success > .panel-heading .badge { color: rgb(223, 240, 216); background-color: rgb(60, 118, 61); }
+.panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: rgb(214, 233, 198); }
+.panel-info { border-color: rgb(188, 232, 241); }
+.panel-info > .panel-heading { color: rgb(49, 112, 143); background-color: rgb(217, 237, 247); border-color: rgb(188, 232, 241); }
+.panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: rgb(188, 232, 241); }
+.panel-info > .panel-heading .badge { color: rgb(217, 237, 247); background-color: rgb(49, 112, 143); }
+.panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: rgb(188, 232, 241); }
+.panel-warning { border-color: rgb(250, 235, 204); }
+.panel-warning > .panel-heading { color: rgb(138, 109, 59); background-color: rgb(252, 248, 227); border-color: rgb(250, 235, 204); }
+.panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: rgb(250, 235, 204); }
+.panel-warning > .panel-heading .badge { color: rgb(252, 248, 227); background-color: rgb(138, 109, 59); }
+.panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: rgb(250, 235, 204); }
+.panel-danger { border-color: rgb(235, 204, 209); }
+.panel-danger > .panel-heading { color: rgb(169, 68, 66); background-color: rgb(242, 222, 222); border-color: rgb(235, 204, 209); }
+.panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: rgb(235, 204, 209); }
+.panel-danger > .panel-heading .badge { color: rgb(242, 222, 222); background-color: rgb(169, 68, 66); }
+.panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: rgb(235, 204, 209); }
+.embed-responsive { position: relative; display: block; height: 0px; padding: 0px; }
+.embed-responsive .embed-responsive-item, .embed-responsive embed, .embed-responsive iframe, .embed-responsive object, .embed-responsive video { position: absolute; top: 0px; left: 0px; bottom: 0px; height: 100%; width: 100%; border: 0px none; }
+.embed-responsive-16by9 { padding-bottom: 56.25%; }
+.embed-responsive-4by3 { padding-bottom: 75%; }
+.well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: rgb(245, 245, 245); border: 1px solid rgb(227, 227, 227); border-radius: 4px; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05) inset; }
+.well blockquote { border-color: rgba(0, 0, 0, 0.15); }
+.well-lg { padding: 24px; border-radius: 6px; }
+.well-sm { padding: 9px; border-radius: 3px; }
+.close { float: right; font-size: 21px; color: rgb(0, 0, 0); text-shadow: 0px 1px 0px rgb(255, 255, 255); opacity: 0.2; }
+.popover, .tooltip { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-style: normal; font-weight: 400; letter-spacing: normal; line-height: 1.42857; text-shadow: none; text-transform: none; white-space: normal; word-break: normal; word-spacing: normal; overflow-wrap: normal; text-decoration: none; }
+.close:focus, .close:hover { color: rgb(0, 0, 0); text-decoration: none; cursor: pointer; opacity: 0.5; }
+button.close { padding: 0px; cursor: pointer; background: rgba(0, 0, 0, 0) none repeat scroll 0px 0px; border: 0px none; }
+.modal-content, .popover { background-clip: padding-box; }
+.modal { display: none; position: fixed; top: 0px; z-index: 1050; outline: 0px none; }
+.modal.fade .modal-dialog { transform: translate(0px, -25%); transition: transform 0.3s ease-out 0s; }
+.modal.in .modal-dialog { transform: translate(0px, 0px); }
+.modal-open .modal { overflow-x: hidden; overflow-y: auto; }
+.modal-dialog { position: relative; width: auto; margin: 10px; }
+.modal-content { position: relative; background-color: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; box-shadow: 0px 3px 9px rgba(0, 0, 0, 0.5); outline: 0px none; }
+.modal-backdrop { position: fixed; top: 0px; z-index: 1040; background-color: rgb(0, 0, 0); }
+.modal-backdrop.fade { opacity: 0; }
+.modal-backdrop.in { opacity: 0.5; }
+.modal-header { padding: 15px; border-bottom: 1px solid rgb(229, 229, 229); }
+.modal-header .close { margin-top: -2px; }
+.modal-title { margin: 0px; line-height: 1.42857; }
+.modal-body { position: relative; padding: 15px; }
+.modal-footer { padding: 15px; text-align: right; border-top: 1px solid rgb(229, 229, 229); }
+.modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0px; }
+.modal-footer .btn-group .btn + .btn { margin-left: -1px; }
+.modal-footer .btn-block + .btn-block { margin-left: 0px; }
+.modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; }
+@media (min-width: 768px) {
+ .modal-dialog { width: 600px; margin: 30px auto; }
+ .modal-content { box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.5); }
+ .modal-sm { width: 300px; }
+}
+.tooltip.top-left .tooltip-arrow, .tooltip.top-right .tooltip-arrow { bottom: 0px; margin-bottom: -5px; border-width: 5px 5px 0px; border-top-color: rgb(0, 0, 0); }
+@media (min-width: 992px) {
+ .modal-lg { width: 900px; }
+}
+.tooltip { position: absolute; z-index: 1070; display: block; text-align: start; font-size: 12px; opacity: 0; }
+.tooltip.in { opacity: 0.9; }
+.tooltip.top { margin-top: -3px; padding: 5px 0px; }
+.tooltip.right { margin-left: 3px; padding: 0px 5px; }
+.tooltip.bottom { margin-top: 3px; padding: 5px 0px; }
+.tooltip.left { margin-left: -3px; padding: 0px 5px; }
+.tooltip-inner { max-width: 200px; padding: 3px 8px; color: rgb(255, 255, 255); text-align: center; background-color: rgb(0, 0, 0); border-radius: 4px; }
+.tooltip-arrow { position: absolute; width: 0px; height: 0px; border-color: transparent; border-style: solid; }
+.tooltip.top .tooltip-arrow { bottom: 0px; left: 50%; margin-left: -5px; border-width: 5px 5px 0px; border-top-color: rgb(0, 0, 0); }
+.tooltip.top-left .tooltip-arrow { right: 5px; }
+.tooltip.top-right .tooltip-arrow { left: 5px; }
+.tooltip.right .tooltip-arrow { top: 50%; left: 0px; margin-top: -5px; border-width: 5px 5px 5px 0px; border-right-color: rgb(0, 0, 0); }
+.tooltip.left .tooltip-arrow { top: 50%; right: 0px; margin-top: -5px; border-width: 5px 0px 5px 5px; border-left-color: rgb(0, 0, 0); }
+.tooltip.bottom .tooltip-arrow, .tooltip.bottom-left .tooltip-arrow, .tooltip.bottom-right .tooltip-arrow { border-width: 0px 5px 5px; border-bottom-color: rgb(0, 0, 0); top: 0px; }
+.tooltip.bottom .tooltip-arrow { left: 50%; margin-left: -5px; }
+.tooltip.bottom-left .tooltip-arrow { right: 5px; margin-top: -5px; }
+.tooltip.bottom-right .tooltip-arrow { left: 5px; margin-top: -5px; }
+.popover { position: absolute; top: 0px; left: 0px; z-index: 1060; display: none; max-width: 276px; padding: 1px; text-align: start; font-size: 14px; background-color: rgb(255, 255, 255); border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.2); }
+.carousel-caption, .carousel-control { color: rgb(255, 255, 255); text-align: center; text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.6); }
+.popover.top { margin-top: -10px; }
+.popover.right { margin-left: 10px; }
+.popover.bottom { margin-top: 10px; }
+.popover.left { margin-left: -10px; }
+.popover-title { margin: 0px; padding: 8px 14px; font-size: 14px; background-color: rgb(247, 247, 247); border-bottom: 1px solid rgb(235, 235, 235); border-radius: 5px 5px 0px 0px; }
+.popover-content { padding: 9px 14px; }
+.popover > .arrow, .popover > .arrow::after { position: absolute; display: block; width: 0px; height: 0px; border-color: transparent; border-style: solid; }
+.carousel, .carousel-inner { position: relative; }
+.popover > .arrow { border-width: 11px; }
+.popover > .arrow::after { border-width: 10px; content: ""; }
+.popover.top > .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0px; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; }
+.popover.top > .arrow::after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0px; border-top-color: rgb(255, 255, 255); }
+.popover.left > .arrow::after, .popover.right > .arrow::after { content: " "; bottom: -10px; }
+.popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0px; border-right-color: rgba(0, 0, 0, 0.25); }
+.popover.right > .arrow::after { left: 1px; border-left-width: 0px; border-right-color: rgb(255, 255, 255); }
+.popover.bottom > .arrow { left: 50%; margin-left: -11px; border-top-width: 0px; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; }
+.popover.bottom > .arrow::after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0px; border-bottom-color: rgb(255, 255, 255); }
+.popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0px; border-left-color: rgba(0, 0, 0, 0.25); }
+.popover.left > .arrow::after { right: 1px; border-right-width: 0px; border-left-color: rgb(255, 255, 255); }
+.carousel-inner { overflow: hidden; width: 100%; }
+.carousel-inner > .item { display: none; position: relative; transition: left 0.6s ease-in-out 0s; }
+.carousel-inner > .item > a > img, .carousel-inner > .item > img { line-height: 1; }
+@media not all, (-webkit-transform-3d) {
+ .carousel-inner > .item { transition: transform 0.6s ease-in-out 0s; backface-visibility: hidden; perspective: 1000px; }
+ .carousel-inner > .item.active.right, .carousel-inner > .item.next { transform: translate3d(100%, 0px, 0px); left: 0px; }
+ .carousel-inner > .item.active.left, .carousel-inner > .item.prev { transform: translate3d(-100%, 0px, 0px); left: 0px; }
+ .carousel-inner > .item.active, .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right { transform: translate3d(0px, 0px, 0px); left: 0px; }
+}
+.carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; }
+.carousel-inner > .active { left: 0px; }
+.carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0px; width: 100%; }
+.carousel-inner > .next { left: 100%; }
+.carousel-inner > .prev { left: -100%; }
+.carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0px; }
+.carousel-inner > .active.left { left: -100%; }
+.carousel-inner > .active.right { left: 100%; }
+.carousel-control { position: absolute; top: 0px; left: 0px; bottom: 0px; width: 15%; opacity: 0.5; font-size: 20px; background-color: rgba(0, 0, 0, 0); }
+.carousel-control.left { background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0px, rgba(0, 0, 0, 0) 100%); background-repeat: repeat-x; }
+.carousel-control.right { left: auto; right: 0px; background-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0px, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; }
+.carousel-control:focus, .carousel-control:hover { outline: 0px none; color: rgb(255, 255, 255); text-decoration: none; opacity: 0.9; }
+.carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next, .carousel-control .icon-prev { position: absolute; top: 50%; margin-top: -10px; z-index: 5; display: inline-block; }
+.carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { left: 50%; margin-left: -10px; }
+.carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { right: 50%; margin-right: -10px; }
+.carousel-control .icon-next, .carousel-control .icon-prev { width: 20px; height: 20px; line-height: 1; font-family: serif; }
+.carousel-control .icon-prev::before { content: "‹"; }
+.carousel-control .icon-next::before { content: "›"; }
+.carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0px; list-style: outside none none; text-align: center; }
+.carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid rgb(255, 255, 255); border-radius: 10px; cursor: pointer; background-color: rgba(0, 0, 0, 0); }
+.carousel-indicators .active { margin: 0px; width: 12px; height: 12px; background-color: rgb(255, 255, 255); }
+.carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; }
+.carousel-caption .btn, .text-hide { text-shadow: none; }
+@media screen and (min-width: 768px) {
+ .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next, .carousel-control .icon-prev { width: 30px; height: 30px; margin-top: -10px; font-size: 30px; }
+ .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -10px; }
+ .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -10px; }
+ .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; }
+ .carousel-indicators { bottom: 20px; }
+}
+.btn-group-vertical > .btn-group::after, .btn-group-vertical > .btn-group::before, .btn-toolbar::after, .btn-toolbar::before, .clearfix::after, .clearfix::before, .container-fluid::after, .container-fluid::before, .container::after, .container::before, .dl-horizontal dd::after, .dl-horizontal dd::before, .form-horizontal .form-group::after, .form-horizontal .form-group::before, .modal-footer::after, .modal-footer::before, .modal-header::after, .modal-header::before, .nav::after, .nav::before, .navbar-collapse::after, .navbar-collapse::before, .navbar-header::after, .navbar-header::before, .navbar::after, .navbar::before, .pager::after, .pager::before, .panel-body::after, .panel-body::before, .row::after, .row::before { content: " "; display: table; }
+.btn-group-vertical > .btn-group::after, .btn-toolbar::after, .clearfix::after, .container-fluid::after, .container::after, .dl-horizontal dd::after, .form-horizontal .form-group::after, .modal-footer::after, .modal-header::after, .nav::after, .navbar-collapse::after, .navbar-header::after, .navbar::after, .pager::after, .panel-body::after, .row::after { clear: both; }
+.center-block { display: block; margin-left: auto; margin-right: auto; }
+.pull-right { float: right !important; }
+.pull-left { float: left !important; }
+.hide { display: none !important; }
+.show { display: block !important; }
+.hidden, .visible-lg, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block, .visible-md, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-sm, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-xs, .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block { display: none !important; }
+.invisible { visibility: hidden; }
+.text-hide { font: 0px/0 a; color: transparent; background-color: transparent; border: 0px none; }
+.affix { position: fixed; }
+@media (max-width: 767px) {
+ .visible-xs { display: block !important; }
+ table.visible-xs { display: table !important; }
+ tr.visible-xs { display: table-row !important; }
+ td.visible-xs, th.visible-xs { display: table-cell !important; }
+ .visible-xs-block { display: block !important; }
+ .visible-xs-inline { display: inline !important; }
+ .visible-xs-inline-block { display: inline-block !important; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm { display: block !important; }
+ table.visible-sm { display: table !important; }
+ tr.visible-sm { display: table-row !important; }
+ td.visible-sm, th.visible-sm { display: table-cell !important; }
+ .visible-sm-block { display: block !important; }
+ .visible-sm-inline { display: inline !important; }
+ .visible-sm-inline-block { display: inline-block !important; }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md { display: block !important; }
+ table.visible-md { display: table !important; }
+ tr.visible-md { display: table-row !important; }
+ td.visible-md, th.visible-md { display: table-cell !important; }
+ .visible-md-block { display: block !important; }
+ .visible-md-inline { display: inline !important; }
+ .visible-md-inline-block { display: inline-block !important; }
+}
+@media (min-width: 1200px) {
+ .visible-lg { display: block !important; }
+ table.visible-lg { display: table !important; }
+ tr.visible-lg { display: table-row !important; }
+ td.visible-lg, th.visible-lg { display: table-cell !important; }
+ .visible-lg-block { display: block !important; }
+ .visible-lg-inline { display: inline !important; }
+ .visible-lg-inline-block { display: inline-block !important; }
+ .hidden-lg { display: none !important; }
+}
+@media (max-width: 767px) {
+ .hidden-xs { display: none !important; }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .hidden-sm { display: none !important; }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .hidden-md { display: none !important; }
+}
+.visible-print { display: none !important; }
+@media print {
+ .visible-print { display: block !important; }
+ table.visible-print { display: table !important; }
+ tr.visible-print { display: table-row !important; }
+ td.visible-print, th.visible-print { display: table-cell !important; }
+}
+.visible-print-block { display: none !important; }
+@media print {
+ .visible-print-block { display: block !important; }
+}
+.visible-print-inline { display: none !important; }
+@media print {
+ .visible-print-inline { display: inline !important; }
+}
+.visible-print-inline-block { display: none !important; }
+@media print {
+ .visible-print-inline-block { display: inline-block !important; }
+ .hidden-print { display: none !important; }
+}
diff --git a/at-admin/static/index/bootstrap.min.js b/at-admin/static/index/bootstrap.min.js
new file mode 100644
index 0000000..e79c065
--- /dev/null
+++ b/at-admin/static/index/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/at-admin/static/index/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff b/at-admin/static/index/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff
new file mode 100644
index 0000000..e096d04
Binary files /dev/null and b/at-admin/static/index/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff differ
diff --git a/at-admin/static/index/common.css b/at-admin/static/index/common.css
new file mode 100644
index 0000000..92cde02
--- /dev/null
+++ b/at-admin/static/index/common.css
@@ -0,0 +1,108 @@
+/**
+ * common css
+ * Copyright (c) 2016 phachon@163.com
+ */
+
+a{
+ text-decoration:none;
+ cursor: pointer;
+}
+a:hover{
+ text-decoration:none;
+ cursor:pointer;
+}
+a:hover, a:focus {
+ text-decoration: none;
+}
+th {
+ text-align:center;
+ background:#efefef;
+}
+.panel-heading {
+ padding: 8px;
+ border-bottom: 1px solid transparent;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.container-fluid {
+ padding-right: 6px;
+ padding-left: 6px;
+}
+.row {
+ margin-right: -6px;
+ margin-left: -6px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+ padding-right: 6px;
+ padding-left: 6px;
+}
+.control-label {padding-right:15px;}
+
+.inline-group {display: inline-table;}
+
+.center {
+ text-align: center;
+}
+.table{
+ table-layout:fixed;
+}
+
+ul,li {
+ /*font-size: 13px;*/
+ font-size: 14px;
+}
+
+th{
+ background-color: #F5F5F5;
+}
+
+/*width 按百分比*/
+.w5p{width:5%;}
+.w6p{width:6%;}
+.w7p{width:7%;}
+.w8p{width:8%;}
+.w9p{width:9%;}
+.w10p{width:10%;}
+.w12p{width:12%;}
+.w13p{width:13%;}
+.w15p{width:15%;}
+.w20p{width:20%;}
+.w25p{width:25%;}
+.w30p{width:30%;}
+.w35p{width:35%;}
+.w40p{width:40%;}
+.w45p{width:45%;}
+.w50p{width:50%;}
+.w55p{width:55%;}
+.w60p{width:60%;}
+.w65p{width:65%;}
+.w70p{width:70%;}
+.w75p{width:75%;}
+.w80p{width:80%;}
+.w85p{width:85%;}
+.w90p{width:90%;}
+.w95p{width:95%;}
+.w100p{width:100%;}
+
+/*width 按像素*/
+.w10{width:10px;}
+.w20{width:20px;}
+.w30{width:30px;}
+.w40{width:40px;}
+.w50{width:50px;}
+.w100{width:100px;}
+.w150{width:150px;}
+.w160{width:160px;}
+.w170{width:170px;}
+.w180{width:180px;}
+.w190{width:190px;}
+.w200{width:200px;}
+.w240{width:240px;}
+.w260{width:260px;}
+.w280{width:280px;}
+.w300{width:300px;}
+.w400{width:400px;}
+.w500{width:500px;}
+.w600{width:600px;}
+.w700{width:700px;}
+.w800{width:800px;}
\ No newline at end of file
diff --git a/at-admin/static/index/favicon.ico b/at-admin/static/index/favicon.ico
new file mode 100644
index 0000000..374d378
Binary files /dev/null and b/at-admin/static/index/favicon.ico differ
diff --git a/at-admin/static/index/favicon.jpg b/at-admin/static/index/favicon.jpg
new file mode 100644
index 0000000..b43a409
Binary files /dev/null and b/at-admin/static/index/favicon.jpg differ
diff --git a/at-admin/static/index/favicon.png b/at-admin/static/index/favicon.png
new file mode 100644
index 0000000..207c5e2
Binary files /dev/null and b/at-admin/static/index/favicon.png differ
diff --git a/at-admin/static/index/favicon2.ico b/at-admin/static/index/favicon2.ico
new file mode 100644
index 0000000..a2c324f
Binary files /dev/null and b/at-admin/static/index/favicon2.ico differ
diff --git a/at-admin/static/index/font-awesome.min.css b/at-admin/static/index/font-awesome.min.css
new file mode 100644
index 0000000..62d7237
--- /dev/null
+++ b/at-admin/static/index/font-awesome.min.css
@@ -0,0 +1,653 @@
+/* Code tidied up by ScrapBook */
+@font-face {
+ font-family: "FontAwesome";
+ font-style: normal;
+ font-weight: normal;
+ src: url("fontawesome-webfont.eot") format("embedded-opentype"), url("fontawesome-webfont.woff2") format("woff2"), url("fontawesome-webfont.woff") format("woff"), url("fontawesome-webfont.ttf") format("truetype"), url("fontawesome-webfont.svg") format("svg");
+}
+.fa { display: inline-block; font-family: FontAwesome; font-style: normal; font-weight: normal; line-height: 1; font-size-adjust: none; font-stretch: normal; font-feature-settings: normal; font-language-override: normal; font-kerning: auto; font-synthesis: weight style; font-variant: normal; font-size: inherit; text-rendering: auto; }
+.fa-lg { font-size: 1.33333em; line-height: 0.75em; vertical-align: -15%; }
+.fa-2x { font-size: 2em; }
+.fa-3x { font-size: 3em; }
+.fa-4x { font-size: 4em; }
+.fa-5x { font-size: 5em; }
+.fa-fw { width: 1.28571em; text-align: center; }
+.fa-ul { padding-left: 0px; margin-left: 2.14286em; list-style-type: none; }
+.fa-ul > li { position: relative; }
+.fa-li { position: absolute; left: -2.14286em; width: 2.14286em; top: 0.142857em; text-align: center; }
+.fa-li.fa-lg { left: -1.85714em; }
+.fa-border { padding: 0.2em 0.25em 0.15em; border: 0.08em solid rgb(238, 238, 238); border-radius: 0.1em; }
+.fa-pull-left { float: left; }
+.fa-pull-right { float: right; }
+.fa.fa-pull-left { margin-right: 0.3em; }
+.fa.fa-pull-right { margin-left: 0.3em; }
+.pull-right { float: right; }
+.pull-left { float: left; }
+.fa.pull-left { margin-right: 0.3em; }
+.fa.pull-right { margin-left: 0.3em; }
+.fa-spin { animation: 2s linear 0s normal none infinite running fa-spin; }
+.fa-pulse { animation: 1s steps(8) 0s normal none infinite running fa-spin; }
+@keyframes fa-spin {
+0% { transform: rotate(0deg); }
+100% { transform: rotate(359deg); }
+}
+@keyframes fa-spin {
+0% { transform: rotate(0deg); }
+100% { transform: rotate(359deg); }
+}
+.fa-rotate-90 { transform: rotate(90deg); }
+.fa-rotate-180 { transform: rotate(180deg); }
+.fa-rotate-270 { transform: rotate(270deg); }
+.fa-flip-horizontal { transform: scale(-1, 1); }
+.fa-flip-vertical { transform: scale(1, -1); }
+:root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; }
+.fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; }
+.fa-stack-1x, .fa-stack-2x { position: absolute; left: 0px; width: 100%; text-align: center; }
+.fa-stack-1x { line-height: inherit; }
+.fa-stack-2x { font-size: 2em; }
+.fa-inverse { color: rgb(255, 255, 255); }
+.fa-glass::before { content: ""; }
+.fa-music::before { content: ""; }
+.fa-search::before { content: ""; }
+.fa-envelope-o::before { content: ""; }
+.fa-heart::before { content: ""; }
+.fa-star::before { content: ""; }
+.fa-star-o::before { content: ""; }
+.fa-user::before { content: ""; }
+.fa-film::before { content: ""; }
+.fa-th-large::before { content: ""; }
+.fa-th::before { content: ""; }
+.fa-th-list::before { content: ""; }
+.fa-check::before { content: ""; }
+.fa-remove::before, .fa-close::before, .fa-times::before { content: ""; }
+.fa-search-plus::before { content: ""; }
+.fa-search-minus::before { content: ""; }
+.fa-power-off::before { content: ""; }
+.fa-signal::before { content: ""; }
+.fa-gear::before, .fa-cog::before { content: ""; }
+.fa-trash-o::before { content: ""; }
+.fa-home::before { content: ""; }
+.fa-file-o::before { content: ""; }
+.fa-clock-o::before { content: ""; }
+.fa-road::before { content: ""; }
+.fa-download::before { content: ""; }
+.fa-arrow-circle-o-down::before { content: ""; }
+.fa-arrow-circle-o-up::before { content: ""; }
+.fa-inbox::before { content: ""; }
+.fa-play-circle-o::before { content: ""; }
+.fa-rotate-right::before, .fa-repeat::before { content: ""; }
+.fa-refresh::before { content: ""; }
+.fa-list-alt::before { content: ""; }
+.fa-lock::before { content: ""; }
+.fa-flag::before { content: ""; }
+.fa-headphones::before { content: ""; }
+.fa-volume-off::before { content: ""; }
+.fa-volume-down::before { content: ""; }
+.fa-volume-up::before { content: ""; }
+.fa-qrcode::before { content: ""; }
+.fa-barcode::before { content: ""; }
+.fa-tag::before { content: ""; }
+.fa-tags::before { content: ""; }
+.fa-book::before { content: ""; }
+.fa-bookmark::before { content: ""; }
+.fa-print::before { content: ""; }
+.fa-camera::before { content: ""; }
+.fa-font::before { content: ""; }
+.fa-bold::before { content: ""; }
+.fa-italic::before { content: ""; }
+.fa-text-height::before { content: ""; }
+.fa-text-width::before { content: ""; }
+.fa-align-left::before { content: ""; }
+.fa-align-center::before { content: ""; }
+.fa-align-right::before { content: ""; }
+.fa-align-justify::before { content: ""; }
+.fa-list::before { content: ""; }
+.fa-dedent::before, .fa-outdent::before { content: ""; }
+.fa-indent::before { content: ""; }
+.fa-video-camera::before { content: ""; }
+.fa-photo::before, .fa-image::before, .fa-picture-o::before { content: ""; }
+.fa-pencil::before { content: ""; }
+.fa-map-marker::before { content: ""; }
+.fa-adjust::before { content: ""; }
+.fa-tint::before { content: ""; }
+.fa-edit::before, .fa-pencil-square-o::before { content: ""; }
+.fa-share-square-o::before { content: ""; }
+.fa-check-square-o::before { content: ""; }
+.fa-arrows::before { content: ""; }
+.fa-step-backward::before { content: ""; }
+.fa-fast-backward::before { content: ""; }
+.fa-backward::before { content: ""; }
+.fa-play::before { content: ""; }
+.fa-pause::before { content: ""; }
+.fa-stop::before { content: ""; }
+.fa-forward::before { content: ""; }
+.fa-fast-forward::before { content: ""; }
+.fa-step-forward::before { content: ""; }
+.fa-eject::before { content: ""; }
+.fa-chevron-left::before { content: ""; }
+.fa-chevron-right::before { content: ""; }
+.fa-plus-circle::before { content: ""; }
+.fa-minus-circle::before { content: ""; }
+.fa-times-circle::before { content: ""; }
+.fa-check-circle::before { content: ""; }
+.fa-question-circle::before { content: ""; }
+.fa-info-circle::before { content: ""; }
+.fa-crosshairs::before { content: ""; }
+.fa-times-circle-o::before { content: ""; }
+.fa-check-circle-o::before { content: ""; }
+.fa-ban::before { content: ""; }
+.fa-arrow-left::before { content: ""; }
+.fa-arrow-right::before { content: ""; }
+.fa-arrow-up::before { content: ""; }
+.fa-arrow-down::before { content: ""; }
+.fa-mail-forward::before, .fa-share::before { content: ""; }
+.fa-expand::before { content: ""; }
+.fa-compress::before { content: ""; }
+.fa-plus::before { content: ""; }
+.fa-minus::before { content: ""; }
+.fa-asterisk::before { content: ""; }
+.fa-exclamation-circle::before { content: ""; }
+.fa-gift::before { content: ""; }
+.fa-leaf::before { content: ""; }
+.fa-fire::before { content: ""; }
+.fa-eye::before { content: ""; }
+.fa-eye-slash::before { content: ""; }
+.fa-warning::before, .fa-exclamation-triangle::before { content: ""; }
+.fa-plane::before { content: ""; }
+.fa-calendar::before { content: ""; }
+.fa-random::before { content: ""; }
+.fa-comment::before { content: ""; }
+.fa-magnet::before { content: ""; }
+.fa-chevron-up::before { content: ""; }
+.fa-chevron-down::before { content: ""; }
+.fa-retweet::before { content: ""; }
+.fa-shopping-cart::before { content: ""; }
+.fa-folder::before { content: ""; }
+.fa-folder-open::before { content: ""; }
+.fa-arrows-v::before { content: ""; }
+.fa-arrows-h::before { content: ""; }
+.fa-bar-chart-o::before, .fa-bar-chart::before { content: ""; }
+.fa-twitter-square::before { content: ""; }
+.fa-facebook-square::before { content: ""; }
+.fa-camera-retro::before { content: ""; }
+.fa-key::before { content: ""; }
+.fa-gears::before, .fa-cogs::before { content: ""; }
+.fa-comments::before { content: ""; }
+.fa-thumbs-o-up::before { content: ""; }
+.fa-thumbs-o-down::before { content: ""; }
+.fa-star-half::before { content: ""; }
+.fa-heart-o::before { content: ""; }
+.fa-sign-out::before { content: ""; }
+.fa-linkedin-square::before { content: ""; }
+.fa-thumb-tack::before { content: ""; }
+.fa-external-link::before { content: ""; }
+.fa-sign-in::before { content: ""; }
+.fa-trophy::before { content: ""; }
+.fa-github-square::before { content: ""; }
+.fa-upload::before { content: ""; }
+.fa-lemon-o::before { content: ""; }
+.fa-phone::before { content: ""; }
+.fa-square-o::before { content: ""; }
+.fa-bookmark-o::before { content: ""; }
+.fa-phone-square::before { content: ""; }
+.fa-twitter::before { content: ""; }
+.fa-facebook-f::before, .fa-facebook::before { content: ""; }
+.fa-github::before { content: ""; }
+.fa-unlock::before { content: ""; }
+.fa-credit-card::before { content: ""; }
+.fa-feed::before, .fa-rss::before { content: ""; }
+.fa-hdd-o::before { content: ""; }
+.fa-bullhorn::before { content: ""; }
+.fa-bell::before { content: ""; }
+.fa-certificate::before { content: ""; }
+.fa-hand-o-right::before { content: ""; }
+.fa-hand-o-left::before { content: ""; }
+.fa-hand-o-up::before { content: ""; }
+.fa-hand-o-down::before { content: ""; }
+.fa-arrow-circle-left::before { content: ""; }
+.fa-arrow-circle-right::before { content: ""; }
+.fa-arrow-circle-up::before { content: ""; }
+.fa-arrow-circle-down::before { content: ""; }
+.fa-globe::before { content: ""; }
+.fa-wrench::before { content: ""; }
+.fa-tasks::before { content: ""; }
+.fa-filter::before { content: ""; }
+.fa-briefcase::before { content: ""; }
+.fa-arrows-alt::before { content: ""; }
+.fa-group::before, .fa-users::before { content: ""; }
+.fa-chain::before, .fa-link::before { content: ""; }
+.fa-cloud::before { content: ""; }
+.fa-flask::before { content: ""; }
+.fa-cut::before, .fa-scissors::before { content: ""; }
+.fa-copy::before, .fa-files-o::before { content: ""; }
+.fa-paperclip::before { content: ""; }
+.fa-save::before, .fa-floppy-o::before { content: ""; }
+.fa-square::before { content: ""; }
+.fa-navicon::before, .fa-reorder::before, .fa-bars::before { content: ""; }
+.fa-list-ul::before { content: ""; }
+.fa-list-ol::before { content: ""; }
+.fa-strikethrough::before { content: ""; }
+.fa-underline::before { content: ""; }
+.fa-table::before { content: ""; }
+.fa-magic::before { content: ""; }
+.fa-truck::before { content: ""; }
+.fa-pinterest::before { content: ""; }
+.fa-pinterest-square::before { content: ""; }
+.fa-google-plus-square::before { content: ""; }
+.fa-google-plus::before { content: ""; }
+.fa-money::before { content: ""; }
+.fa-caret-down::before { content: ""; }
+.fa-caret-up::before { content: ""; }
+.fa-caret-left::before { content: ""; }
+.fa-caret-right::before { content: ""; }
+.fa-columns::before { content: ""; }
+.fa-unsorted::before, .fa-sort::before { content: ""; }
+.fa-sort-down::before, .fa-sort-desc::before { content: ""; }
+.fa-sort-up::before, .fa-sort-asc::before { content: ""; }
+.fa-envelope::before { content: ""; }
+.fa-linkedin::before { content: ""; }
+.fa-rotate-left::before, .fa-undo::before { content: ""; }
+.fa-legal::before, .fa-gavel::before { content: ""; }
+.fa-dashboard::before, .fa-tachometer::before { content: ""; }
+.fa-comment-o::before { content: ""; }
+.fa-comments-o::before { content: ""; }
+.fa-flash::before, .fa-bolt::before { content: ""; }
+.fa-sitemap::before { content: ""; }
+.fa-umbrella::before { content: ""; }
+.fa-paste::before, .fa-clipboard::before { content: ""; }
+.fa-lightbulb-o::before { content: ""; }
+.fa-exchange::before { content: ""; }
+.fa-cloud-download::before { content: ""; }
+.fa-cloud-upload::before { content: ""; }
+.fa-user-md::before { content: ""; }
+.fa-stethoscope::before { content: ""; }
+.fa-suitcase::before { content: ""; }
+.fa-bell-o::before { content: ""; }
+.fa-coffee::before { content: ""; }
+.fa-cutlery::before { content: ""; }
+.fa-file-text-o::before { content: ""; }
+.fa-building-o::before { content: ""; }
+.fa-hospital-o::before { content: ""; }
+.fa-ambulance::before { content: ""; }
+.fa-medkit::before { content: ""; }
+.fa-fighter-jet::before { content: ""; }
+.fa-beer::before { content: ""; }
+.fa-h-square::before { content: ""; }
+.fa-plus-square::before { content: ""; }
+.fa-angle-double-left::before { content: ""; }
+.fa-angle-double-right::before { content: ""; }
+.fa-angle-double-up::before { content: ""; }
+.fa-angle-double-down::before { content: ""; }
+.fa-angle-left::before { content: ""; }
+.fa-angle-right::before { content: ""; }
+.fa-angle-up::before { content: ""; }
+.fa-angle-down::before { content: ""; }
+.fa-desktop::before { content: ""; }
+.fa-laptop::before { content: ""; }
+.fa-tablet::before { content: ""; }
+.fa-mobile-phone::before, .fa-mobile::before { content: ""; }
+.fa-circle-o::before { content: ""; }
+.fa-quote-left::before { content: ""; }
+.fa-quote-right::before { content: ""; }
+.fa-spinner::before { content: ""; }
+.fa-circle::before { content: ""; }
+.fa-mail-reply::before, .fa-reply::before { content: ""; }
+.fa-github-alt::before { content: ""; }
+.fa-folder-o::before { content: ""; }
+.fa-folder-open-o::before { content: ""; }
+.fa-smile-o::before { content: ""; }
+.fa-frown-o::before { content: ""; }
+.fa-meh-o::before { content: ""; }
+.fa-gamepad::before { content: ""; }
+.fa-keyboard-o::before { content: ""; }
+.fa-flag-o::before { content: ""; }
+.fa-flag-checkered::before { content: ""; }
+.fa-terminal::before { content: ""; }
+.fa-code::before { content: ""; }
+.fa-mail-reply-all::before, .fa-reply-all::before { content: ""; }
+.fa-star-half-empty::before, .fa-star-half-full::before, .fa-star-half-o::before { content: ""; }
+.fa-location-arrow::before { content: ""; }
+.fa-crop::before { content: ""; }
+.fa-code-fork::before { content: ""; }
+.fa-unlink::before, .fa-chain-broken::before { content: ""; }
+.fa-question::before { content: ""; }
+.fa-info::before { content: ""; }
+.fa-exclamation::before { content: ""; }
+.fa-superscript::before { content: ""; }
+.fa-subscript::before { content: ""; }
+.fa-eraser::before { content: ""; }
+.fa-puzzle-piece::before { content: ""; }
+.fa-microphone::before { content: ""; }
+.fa-microphone-slash::before { content: ""; }
+.fa-shield::before { content: ""; }
+.fa-calendar-o::before { content: ""; }
+.fa-fire-extinguisher::before { content: ""; }
+.fa-rocket::before { content: ""; }
+.fa-maxcdn::before { content: ""; }
+.fa-chevron-circle-left::before { content: ""; }
+.fa-chevron-circle-right::before { content: ""; }
+.fa-chevron-circle-up::before { content: ""; }
+.fa-chevron-circle-down::before { content: ""; }
+.fa-html5::before { content: ""; }
+.fa-css3::before { content: ""; }
+.fa-anchor::before { content: ""; }
+.fa-unlock-alt::before { content: ""; }
+.fa-bullseye::before { content: ""; }
+.fa-ellipsis-h::before { content: ""; }
+.fa-ellipsis-v::before { content: ""; }
+.fa-rss-square::before { content: ""; }
+.fa-play-circle::before { content: ""; }
+.fa-ticket::before { content: ""; }
+.fa-minus-square::before { content: ""; }
+.fa-minus-square-o::before { content: ""; }
+.fa-level-up::before { content: ""; }
+.fa-level-down::before { content: ""; }
+.fa-check-square::before { content: ""; }
+.fa-pencil-square::before { content: ""; }
+.fa-external-link-square::before { content: ""; }
+.fa-share-square::before { content: ""; }
+.fa-compass::before { content: ""; }
+.fa-toggle-down::before, .fa-caret-square-o-down::before { content: ""; }
+.fa-toggle-up::before, .fa-caret-square-o-up::before { content: ""; }
+.fa-toggle-right::before, .fa-caret-square-o-right::before { content: ""; }
+.fa-euro::before, .fa-eur::before { content: ""; }
+.fa-gbp::before { content: ""; }
+.fa-dollar::before, .fa-usd::before { content: ""; }
+.fa-rupee::before, .fa-inr::before { content: ""; }
+.fa-cny::before, .fa-rmb::before, .fa-yen::before, .fa-jpy::before { content: ""; }
+.fa-ruble::before, .fa-rouble::before, .fa-rub::before { content: ""; }
+.fa-won::before, .fa-krw::before { content: ""; }
+.fa-bitcoin::before, .fa-btc::before { content: ""; }
+.fa-file::before { content: ""; }
+.fa-file-text::before { content: ""; }
+.fa-sort-alpha-asc::before { content: ""; }
+.fa-sort-alpha-desc::before { content: ""; }
+.fa-sort-amount-asc::before { content: ""; }
+.fa-sort-amount-desc::before { content: ""; }
+.fa-sort-numeric-asc::before { content: ""; }
+.fa-sort-numeric-desc::before { content: ""; }
+.fa-thumbs-up::before { content: ""; }
+.fa-thumbs-down::before { content: ""; }
+.fa-youtube-square::before { content: ""; }
+.fa-youtube::before { content: ""; }
+.fa-xing::before { content: ""; }
+.fa-xing-square::before { content: ""; }
+.fa-youtube-play::before { content: ""; }
+.fa-dropbox::before { content: ""; }
+.fa-stack-overflow::before { content: ""; }
+.fa-instagram::before { content: ""; }
+.fa-flickr::before { content: ""; }
+.fa-adn::before { content: ""; }
+.fa-bitbucket::before { content: ""; }
+.fa-bitbucket-square::before { content: ""; }
+.fa-tumblr::before { content: ""; }
+.fa-tumblr-square::before { content: ""; }
+.fa-long-arrow-down::before { content: ""; }
+.fa-long-arrow-up::before { content: ""; }
+.fa-long-arrow-left::before { content: ""; }
+.fa-long-arrow-right::before { content: ""; }
+.fa-apple::before { content: ""; }
+.fa-windows::before { content: ""; }
+.fa-android::before { content: ""; }
+.fa-linux::before { content: ""; }
+.fa-dribbble::before { content: ""; }
+.fa-skype::before { content: ""; }
+.fa-foursquare::before { content: ""; }
+.fa-trello::before { content: ""; }
+.fa-female::before { content: ""; }
+.fa-male::before { content: ""; }
+.fa-gittip::before, .fa-gratipay::before { content: ""; }
+.fa-sun-o::before { content: ""; }
+.fa-moon-o::before { content: ""; }
+.fa-archive::before { content: ""; }
+.fa-bug::before { content: ""; }
+.fa-vk::before { content: ""; }
+.fa-weibo::before { content: ""; }
+.fa-renren::before { content: ""; }
+.fa-pagelines::before { content: ""; }
+.fa-stack-exchange::before { content: ""; }
+.fa-arrow-circle-o-right::before { content: ""; }
+.fa-arrow-circle-o-left::before { content: ""; }
+.fa-toggle-left::before, .fa-caret-square-o-left::before { content: ""; }
+.fa-dot-circle-o::before { content: ""; }
+.fa-wheelchair::before { content: ""; }
+.fa-vimeo-square::before { content: ""; }
+.fa-turkish-lira::before, .fa-try::before { content: ""; }
+.fa-plus-square-o::before { content: ""; }
+.fa-space-shuttle::before { content: ""; }
+.fa-slack::before { content: ""; }
+.fa-envelope-square::before { content: ""; }
+.fa-wordpress::before { content: ""; }
+.fa-openid::before { content: ""; }
+.fa-institution::before, .fa-bank::before, .fa-university::before { content: ""; }
+.fa-mortar-board::before, .fa-graduation-cap::before { content: ""; }
+.fa-yahoo::before { content: ""; }
+.fa-google::before { content: ""; }
+.fa-reddit::before { content: ""; }
+.fa-reddit-square::before { content: ""; }
+.fa-stumbleupon-circle::before { content: ""; }
+.fa-stumbleupon::before { content: ""; }
+.fa-delicious::before { content: ""; }
+.fa-digg::before { content: ""; }
+.fa-pied-piper::before { content: ""; }
+.fa-pied-piper-alt::before { content: ""; }
+.fa-drupal::before { content: ""; }
+.fa-joomla::before { content: ""; }
+.fa-language::before { content: ""; }
+.fa-fax::before { content: ""; }
+.fa-building::before { content: ""; }
+.fa-child::before { content: ""; }
+.fa-paw::before { content: ""; }
+.fa-spoon::before { content: ""; }
+.fa-cube::before { content: ""; }
+.fa-cubes::before { content: ""; }
+.fa-behance::before { content: ""; }
+.fa-behance-square::before { content: ""; }
+.fa-steam::before { content: ""; }
+.fa-steam-square::before { content: ""; }
+.fa-recycle::before { content: ""; }
+.fa-automobile::before, .fa-car::before { content: ""; }
+.fa-cab::before, .fa-taxi::before { content: ""; }
+.fa-tree::before { content: ""; }
+.fa-spotify::before { content: ""; }
+.fa-deviantart::before { content: ""; }
+.fa-soundcloud::before { content: ""; }
+.fa-database::before { content: ""; }
+.fa-file-pdf-o::before { content: ""; }
+.fa-file-word-o::before { content: ""; }
+.fa-file-excel-o::before { content: ""; }
+.fa-file-powerpoint-o::before { content: ""; }
+.fa-file-photo-o::before, .fa-file-picture-o::before, .fa-file-image-o::before { content: ""; }
+.fa-file-zip-o::before, .fa-file-archive-o::before { content: ""; }
+.fa-file-sound-o::before, .fa-file-audio-o::before { content: ""; }
+.fa-file-movie-o::before, .fa-file-video-o::before { content: ""; }
+.fa-file-code-o::before { content: ""; }
+.fa-vine::before { content: ""; }
+.fa-codepen::before { content: ""; }
+.fa-jsfiddle::before { content: ""; }
+.fa-life-bouy::before, .fa-life-buoy::before, .fa-life-saver::before, .fa-support::before, .fa-life-ring::before { content: ""; }
+.fa-circle-o-notch::before { content: ""; }
+.fa-ra::before, .fa-rebel::before { content: ""; }
+.fa-ge::before, .fa-empire::before { content: ""; }
+.fa-git-square::before { content: ""; }
+.fa-git::before { content: ""; }
+.fa-y-combinator-square::before, .fa-yc-square::before, .fa-hacker-news::before { content: ""; }
+.fa-tencent-weibo::before { content: ""; }
+.fa-qq::before { content: ""; }
+.fa-wechat::before, .fa-weixin::before { content: ""; }
+.fa-send::before, .fa-paper-plane::before { content: ""; }
+.fa-send-o::before, .fa-paper-plane-o::before { content: ""; }
+.fa-history::before { content: ""; }
+.fa-circle-thin::before { content: ""; }
+.fa-header::before { content: ""; }
+.fa-paragraph::before { content: ""; }
+.fa-sliders::before { content: ""; }
+.fa-share-alt::before { content: ""; }
+.fa-share-alt-square::before { content: ""; }
+.fa-bomb::before { content: ""; }
+.fa-soccer-ball-o::before, .fa-futbol-o::before { content: ""; }
+.fa-tty::before { content: ""; }
+.fa-binoculars::before { content: ""; }
+.fa-plug::before { content: ""; }
+.fa-slideshare::before { content: ""; }
+.fa-twitch::before { content: ""; }
+.fa-yelp::before { content: ""; }
+.fa-newspaper-o::before { content: ""; }
+.fa-wifi::before { content: ""; }
+.fa-calculator::before { content: ""; }
+.fa-paypal::before { content: ""; }
+.fa-google-wallet::before { content: ""; }
+.fa-cc-visa::before { content: ""; }
+.fa-cc-mastercard::before { content: ""; }
+.fa-cc-discover::before { content: ""; }
+.fa-cc-amex::before { content: ""; }
+.fa-cc-paypal::before { content: ""; }
+.fa-cc-stripe::before { content: ""; }
+.fa-bell-slash::before { content: ""; }
+.fa-bell-slash-o::before { content: ""; }
+.fa-trash::before { content: ""; }
+.fa-copyright::before { content: ""; }
+.fa-at::before { content: ""; }
+.fa-eyedropper::before { content: ""; }
+.fa-paint-brush::before { content: ""; }
+.fa-birthday-cake::before { content: ""; }
+.fa-area-chart::before { content: ""; }
+.fa-pie-chart::before { content: ""; }
+.fa-line-chart::before { content: ""; }
+.fa-lastfm::before { content: ""; }
+.fa-lastfm-square::before { content: ""; }
+.fa-toggle-off::before { content: ""; }
+.fa-toggle-on::before { content: ""; }
+.fa-bicycle::before { content: ""; }
+.fa-bus::before { content: ""; }
+.fa-ioxhost::before { content: ""; }
+.fa-angellist::before { content: ""; }
+.fa-cc::before { content: ""; }
+.fa-shekel::before, .fa-sheqel::before, .fa-ils::before { content: ""; }
+.fa-meanpath::before { content: ""; }
+.fa-buysellads::before { content: ""; }
+.fa-connectdevelop::before { content: ""; }
+.fa-dashcube::before { content: ""; }
+.fa-forumbee::before { content: ""; }
+.fa-leanpub::before { content: ""; }
+.fa-sellsy::before { content: ""; }
+.fa-shirtsinbulk::before { content: ""; }
+.fa-simplybuilt::before { content: ""; }
+.fa-skyatlas::before { content: ""; }
+.fa-cart-plus::before { content: ""; }
+.fa-cart-arrow-down::before { content: ""; }
+.fa-diamond::before { content: ""; }
+.fa-ship::before { content: ""; }
+.fa-user-secret::before { content: ""; }
+.fa-motorcycle::before { content: ""; }
+.fa-street-view::before { content: ""; }
+.fa-heartbeat::before { content: ""; }
+.fa-venus::before { content: ""; }
+.fa-mars::before { content: ""; }
+.fa-mercury::before { content: ""; }
+.fa-intersex::before, .fa-transgender::before { content: ""; }
+.fa-transgender-alt::before { content: ""; }
+.fa-venus-double::before { content: ""; }
+.fa-mars-double::before { content: ""; }
+.fa-venus-mars::before { content: ""; }
+.fa-mars-stroke::before { content: ""; }
+.fa-mars-stroke-v::before { content: ""; }
+.fa-mars-stroke-h::before { content: ""; }
+.fa-neuter::before { content: ""; }
+.fa-genderless::before { content: ""; }
+.fa-facebook-official::before { content: ""; }
+.fa-pinterest-p::before { content: ""; }
+.fa-whatsapp::before { content: ""; }
+.fa-server::before { content: ""; }
+.fa-user-plus::before { content: ""; }
+.fa-user-times::before { content: ""; }
+.fa-hotel::before, .fa-bed::before { content: ""; }
+.fa-viacoin::before { content: ""; }
+.fa-train::before { content: ""; }
+.fa-subway::before { content: ""; }
+.fa-medium::before { content: ""; }
+.fa-yc::before, .fa-y-combinator::before { content: ""; }
+.fa-optin-monster::before { content: ""; }
+.fa-opencart::before { content: ""; }
+.fa-expeditedssl::before { content: ""; }
+.fa-battery-4::before, .fa-battery-full::before { content: ""; }
+.fa-battery-3::before, .fa-battery-three-quarters::before { content: ""; }
+.fa-battery-2::before, .fa-battery-half::before { content: ""; }
+.fa-battery-1::before, .fa-battery-quarter::before { content: ""; }
+.fa-battery-0::before, .fa-battery-empty::before { content: ""; }
+.fa-mouse-pointer::before { content: ""; }
+.fa-i-cursor::before { content: ""; }
+.fa-object-group::before { content: ""; }
+.fa-object-ungroup::before { content: ""; }
+.fa-sticky-note::before { content: ""; }
+.fa-sticky-note-o::before { content: ""; }
+.fa-cc-jcb::before { content: ""; }
+.fa-cc-diners-club::before { content: ""; }
+.fa-clone::before { content: ""; }
+.fa-balance-scale::before { content: ""; }
+.fa-hourglass-o::before { content: ""; }
+.fa-hourglass-1::before, .fa-hourglass-start::before { content: ""; }
+.fa-hourglass-2::before, .fa-hourglass-half::before { content: ""; }
+.fa-hourglass-3::before, .fa-hourglass-end::before { content: ""; }
+.fa-hourglass::before { content: ""; }
+.fa-hand-grab-o::before, .fa-hand-rock-o::before { content: ""; }
+.fa-hand-stop-o::before, .fa-hand-paper-o::before { content: ""; }
+.fa-hand-scissors-o::before { content: ""; }
+.fa-hand-lizard-o::before { content: ""; }
+.fa-hand-spock-o::before { content: ""; }
+.fa-hand-pointer-o::before { content: ""; }
+.fa-hand-peace-o::before { content: ""; }
+.fa-trademark::before { content: ""; }
+.fa-registered::before { content: ""; }
+.fa-creative-commons::before { content: ""; }
+.fa-gg::before { content: ""; }
+.fa-gg-circle::before { content: ""; }
+.fa-tripadvisor::before { content: ""; }
+.fa-odnoklassniki::before { content: ""; }
+.fa-odnoklassniki-square::before { content: ""; }
+.fa-get-pocket::before { content: ""; }
+.fa-wikipedia-w::before { content: ""; }
+.fa-safari::before { content: ""; }
+.fa-chrome::before { content: ""; }
+.fa-firefox::before { content: ""; }
+.fa-opera::before { content: ""; }
+.fa-internet-explorer::before { content: ""; }
+.fa-tv::before, .fa-television::before { content: ""; }
+.fa-contao::before { content: ""; }
+.fa-500px::before { content: ""; }
+.fa-amazon::before { content: ""; }
+.fa-calendar-plus-o::before { content: ""; }
+.fa-calendar-minus-o::before { content: ""; }
+.fa-calendar-times-o::before { content: ""; }
+.fa-calendar-check-o::before { content: ""; }
+.fa-industry::before { content: ""; }
+.fa-map-pin::before { content: ""; }
+.fa-map-signs::before { content: ""; }
+.fa-map-o::before { content: ""; }
+.fa-map::before { content: ""; }
+.fa-commenting::before { content: ""; }
+.fa-commenting-o::before { content: ""; }
+.fa-houzz::before { content: ""; }
+.fa-vimeo::before { content: ""; }
+.fa-black-tie::before { content: ""; }
+.fa-fonticons::before { content: ""; }
+.fa-reddit-alien::before { content: ""; }
+.fa-edge::before { content: ""; }
+.fa-credit-card-alt::before { content: ""; }
+.fa-codiepie::before { content: ""; }
+.fa-modx::before { content: ""; }
+.fa-fort-awesome::before { content: ""; }
+.fa-usb::before { content: ""; }
+.fa-product-hunt::before { content: ""; }
+.fa-mixcloud::before { content: ""; }
+.fa-scribd::before { content: ""; }
+.fa-pause-circle::before { content: ""; }
+.fa-pause-circle-o::before { content: ""; }
+.fa-stop-circle::before { content: ""; }
+.fa-stop-circle-o::before { content: ""; }
+.fa-shopping-bag::before { content: ""; }
+.fa-shopping-basket::before { content: ""; }
+.fa-hashtag::before { content: ""; }
+.fa-bluetooth::before { content: ""; }
+.fa-bluetooth-b::before { content: ""; }
+.fa-percent::before { content: ""; }
diff --git a/at-admin/static/index/fontawesome-webfont.eot b/at-admin/static/index/fontawesome-webfont.eot
new file mode 100644
index 0000000..9b6afae
Binary files /dev/null and b/at-admin/static/index/fontawesome-webfont.eot differ
diff --git a/at-admin/static/index/fontawesome-webfont.svg b/at-admin/static/index/fontawesome-webfont.svg
new file mode 100644
index 0000000..d05688e
--- /dev/null
+++ b/at-admin/static/index/fontawesome-webfont.svg
@@ -0,0 +1,655 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/static/index/fontawesome-webfont.ttf b/at-admin/static/index/fontawesome-webfont.ttf
new file mode 100644
index 0000000..26dea79
Binary files /dev/null and b/at-admin/static/index/fontawesome-webfont.ttf differ
diff --git a/at-admin/static/index/fontawesome-webfont.woff b/at-admin/static/index/fontawesome-webfont.woff
new file mode 100644
index 0000000..dc35ce3
Binary files /dev/null and b/at-admin/static/index/fontawesome-webfont.woff differ
diff --git a/at-admin/static/index/fontawesome-webfont.woff2 b/at-admin/static/index/fontawesome-webfont.woff2
new file mode 100644
index 0000000..500e517
Binary files /dev/null and b/at-admin/static/index/fontawesome-webfont.woff2 differ
diff --git a/at-admin/static/index/fonts.googleapis.com.css b/at-admin/static/index/fonts.googleapis.com.css
new file mode 100644
index 0000000..0973070
--- /dev/null
+++ b/at-admin/static/index/fonts.googleapis.com.css
@@ -0,0 +1,13 @@
+/* Code tidied up by ScrapBook */
+@font-face {
+ font-family: "Open Sans";
+ font-style: normal;
+ font-weight: 300;
+ src: local("Open Sans Light"), local("OpenSans-Light"), url("DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff") format("woff");
+}
+@font-face {
+ font-family: "Open Sans";
+ font-style: normal;
+ font-weight: 400;
+ src: local("Open Sans"), local("OpenSans"), url("cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff") format("woff");
+}
diff --git a/at-admin/static/index/glyphicons-halflings-regular.eot b/at-admin/static/index/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
Binary files /dev/null and b/at-admin/static/index/glyphicons-halflings-regular.eot differ
diff --git a/at-admin/static/index/glyphicons-halflings-regular.svg b/at-admin/static/index/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/at-admin/static/index/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/at-admin/static/index/glyphicons-halflings-regular.ttf b/at-admin/static/index/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
Binary files /dev/null and b/at-admin/static/index/glyphicons-halflings-regular.ttf differ
diff --git a/at-admin/static/index/glyphicons-halflings-regular.woff b/at-admin/static/index/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
Binary files /dev/null and b/at-admin/static/index/glyphicons-halflings-regular.woff differ
diff --git a/at-admin/static/index/glyphicons-halflings-regular.woff2 b/at-admin/static/index/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
Binary files /dev/null and b/at-admin/static/index/glyphicons-halflings-regular.woff2 differ
diff --git a/at-admin/static/index/jquery-2.1.4.min.js b/at-admin/static/index/jquery-2.1.4.min.js
new file mode 100644
index 0000000..fad9ab1
--- /dev/null
+++ b/at-admin/static/index/jquery-2.1.4.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=" ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
+return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
+void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("
+{{end}}
+`
+
+var qpsTpl = `{{define "content"}}
+Requests statistics
+
+
+
+ {{range .Content.Fields}}
+
+ {{.}}
+
+ {{end}}
+
+
+
+
+ {{range $i, $elem := .Content.Data}}
+
+
+ {{index $elem 0}}
+ {{index $elem 1}}
+ {{index $elem 2}}
+ {{index $elem 4}}
+ {{index $elem 6}}
+ {{index $elem 8}}
+ {{index $elem 10}}
+
+ {{end}}
+
+
+
+{{end}}`
+
+var configTpl = `
+{{define "content"}}
+Configurations
+
+{{range $index, $elem := .Content}}
+{{$index}}={{$elem}}
+{{end}}
+
+{{end}}
+`
+
+var routerAndFilterTpl = `{{define "content"}}
+
+
+{{.Title}}
+
+{{range .Content.Methods}}
+
+
+
{{.}}
+
+
+
+
+ {{range $.Content.Fields}}
+
+ {{.}}
+
+ {{end}}
+
+
+
+
+ {{$slice := index $.Content.Data .}}
+ {{range $i, $elem := $slice}}
+
+
+ {{range $elem}}
+
+ {{.}}
+
+ {{end}}
+
+
+ {{end}}
+
+
+
+
+
+{{end}}
+
+
+{{end}}`
+
+var tasksTpl = `{{define "content"}}
+
+{{.Title}}
+
+{{if .Message }}
+{{ $messageType := index .Message 0}}
+
+{{index .Message 1}}
+
+{{end}}
+
+
+
+
+
+{{range .Content.Fields}}
+
+{{.}}
+
+{{end}}
+
+
+
+
+{{range $i, $slice := .Content.Data}}
+
+ {{range $slice}}
+
+ {{.}}
+
+ {{end}}
+
+ Run
+
+
+{{end}}
+
+
+
+{{end}}`
+
+var healthCheckTpl = `
+{{define "content"}}
+
+{{.Title}}
+
+
+
+{{range .Content.Fields}}
+
+ {{.}}
+
+{{end}}
+
+
+
+{{range $i, $slice := .Content.Data}}
+ {{ $header := index $slice 0}}
+ {{ if eq "success" $header}}
+
+ {{else if eq "error" $header}}
+
+ {{else}}
+
+ {{end}}
+ {{range $j, $elem := $slice}}
+ {{if ne $j 0}}
+
+ {{$elem}}
+
+ {{end}}
+ {{end}}
+
+ {{$header}}
+
+
+{{end}}
+
+
+
+{{end}}`
+
+// The base dashboardTpl
+var dashboardTpl = `
+
+
+
+
+
+
+
+
+
+
+Welcome to Beego Admin Dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{{template "content" .}}
+
+
+
+
+
+
+
+
+{{template "scripts" .}}
+
+
+`
diff --git a/at-admin/vendor/github.com/astaxie/beego/app.go b/at-admin/vendor/github.com/astaxie/beego/app.go
new file mode 100644
index 0000000..d9e85e9
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/app.go
@@ -0,0 +1,497 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "crypto/tls"
+ "crypto/x509"
+ "fmt"
+ "io/ioutil"
+ "net"
+ "net/http"
+ "net/http/fcgi"
+ "os"
+ "path"
+ "strings"
+ "time"
+
+ "github.com/astaxie/beego/grace"
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/utils"
+ "golang.org/x/crypto/acme/autocert"
+)
+
+var (
+ // BeeApp is an application instance
+ BeeApp *App
+)
+
+func init() {
+ // create beego application
+ BeeApp = NewApp()
+}
+
+// App defines beego application with a new PatternServeMux.
+type App struct {
+ Handlers *ControllerRegister
+ Server *http.Server
+}
+
+// NewApp returns a new beego application.
+func NewApp() *App {
+ cr := NewControllerRegister()
+ app := &App{Handlers: cr, Server: &http.Server{}}
+ return app
+}
+
+// MiddleWare function for http.Handler
+type MiddleWare func(http.Handler) http.Handler
+
+// Run beego application.
+func (app *App) Run(mws ...MiddleWare) {
+ addr := BConfig.Listen.HTTPAddr
+
+ if BConfig.Listen.HTTPPort != 0 {
+ addr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPAddr, BConfig.Listen.HTTPPort)
+ }
+
+ var (
+ err error
+ l net.Listener
+ endRunning = make(chan bool, 1)
+ )
+
+ // run cgi server
+ if BConfig.Listen.EnableFcgi {
+ if BConfig.Listen.EnableStdIo {
+ if err = fcgi.Serve(nil, app.Handlers); err == nil { // standard I/O
+ logs.Info("Use FCGI via standard I/O")
+ } else {
+ logs.Critical("Cannot use FCGI via standard I/O", err)
+ }
+ return
+ }
+ if BConfig.Listen.HTTPPort == 0 {
+ // remove the Socket file before start
+ if utils.FileExists(addr) {
+ os.Remove(addr)
+ }
+ l, err = net.Listen("unix", addr)
+ } else {
+ l, err = net.Listen("tcp", addr)
+ }
+ if err != nil {
+ logs.Critical("Listen: ", err)
+ }
+ if err = fcgi.Serve(l, app.Handlers); err != nil {
+ logs.Critical("fcgi.Serve: ", err)
+ }
+ return
+ }
+
+ app.Server.Handler = app.Handlers
+ for i := len(mws) - 1; i >= 0; i-- {
+ if mws[i] == nil {
+ continue
+ }
+ app.Server.Handler = mws[i](app.Server.Handler)
+ }
+ app.Server.ReadTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
+ app.Server.WriteTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
+ app.Server.ErrorLog = logs.GetLogger("HTTP")
+
+ // run graceful mode
+ if BConfig.Listen.Graceful {
+ httpsAddr := BConfig.Listen.HTTPSAddr
+ app.Server.Addr = httpsAddr
+ if BConfig.Listen.EnableHTTPS || BConfig.Listen.EnableMutualHTTPS {
+ go func() {
+ time.Sleep(1000 * time.Microsecond)
+ if BConfig.Listen.HTTPSPort != 0 {
+ httpsAddr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPSAddr, BConfig.Listen.HTTPSPort)
+ app.Server.Addr = httpsAddr
+ }
+ server := grace.NewServer(httpsAddr, app.Handlers)
+ server.Server.ReadTimeout = app.Server.ReadTimeout
+ server.Server.WriteTimeout = app.Server.WriteTimeout
+ if BConfig.Listen.EnableMutualHTTPS {
+ if err := server.ListenAndServeMutualTLS(BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile, BConfig.Listen.TrustCaFile); err != nil {
+ logs.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
+ time.Sleep(100 * time.Microsecond)
+ endRunning <- true
+ }
+ } else {
+ if BConfig.Listen.AutoTLS {
+ m := autocert.Manager{
+ Prompt: autocert.AcceptTOS,
+ HostPolicy: autocert.HostWhitelist(BConfig.Listen.Domains...),
+ Cache: autocert.DirCache(BConfig.Listen.TLSCacheDir),
+ }
+ app.Server.TLSConfig = &tls.Config{GetCertificate: m.GetCertificate}
+ BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile = "", ""
+ }
+ if err := server.ListenAndServeTLS(BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile); err != nil {
+ logs.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
+ time.Sleep(100 * time.Microsecond)
+ endRunning <- true
+ }
+ }
+ }()
+ }
+ if BConfig.Listen.EnableHTTP {
+ go func() {
+ server := grace.NewServer(addr, app.Handlers)
+ server.Server.ReadTimeout = app.Server.ReadTimeout
+ server.Server.WriteTimeout = app.Server.WriteTimeout
+ if BConfig.Listen.ListenTCP4 {
+ server.Network = "tcp4"
+ }
+ if err := server.ListenAndServe(); err != nil {
+ logs.Critical("ListenAndServe: ", err, fmt.Sprintf("%d", os.Getpid()))
+ time.Sleep(100 * time.Microsecond)
+ endRunning <- true
+ }
+ }()
+ }
+ <-endRunning
+ return
+ }
+
+ // run normal mode
+ if BConfig.Listen.EnableHTTPS || BConfig.Listen.EnableMutualHTTPS {
+ go func() {
+ time.Sleep(1000 * time.Microsecond)
+ if BConfig.Listen.HTTPSPort != 0 {
+ app.Server.Addr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPSAddr, BConfig.Listen.HTTPSPort)
+ } else if BConfig.Listen.EnableHTTP {
+ logs.Info("Start https server error, conflict with http. Please reset https port")
+ return
+ }
+ logs.Info("https server Running on https://%s", app.Server.Addr)
+ if BConfig.Listen.AutoTLS {
+ m := autocert.Manager{
+ Prompt: autocert.AcceptTOS,
+ HostPolicy: autocert.HostWhitelist(BConfig.Listen.Domains...),
+ Cache: autocert.DirCache(BConfig.Listen.TLSCacheDir),
+ }
+ app.Server.TLSConfig = &tls.Config{GetCertificate: m.GetCertificate}
+ BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile = "", ""
+ } else if BConfig.Listen.EnableMutualHTTPS {
+ pool := x509.NewCertPool()
+ data, err := ioutil.ReadFile(BConfig.Listen.TrustCaFile)
+ if err != nil {
+ logs.Info("MutualHTTPS should provide TrustCaFile")
+ return
+ }
+ pool.AppendCertsFromPEM(data)
+ app.Server.TLSConfig = &tls.Config{
+ ClientCAs: pool,
+ ClientAuth: tls.RequireAndVerifyClientCert,
+ }
+ }
+ if err := app.Server.ListenAndServeTLS(BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile); err != nil {
+ logs.Critical("ListenAndServeTLS: ", err)
+ time.Sleep(100 * time.Microsecond)
+ endRunning <- true
+ }
+ }()
+
+ }
+ if BConfig.Listen.EnableHTTP {
+ go func() {
+ app.Server.Addr = addr
+ logs.Info("http server Running on http://%s", app.Server.Addr)
+ if BConfig.Listen.ListenTCP4 {
+ ln, err := net.Listen("tcp4", app.Server.Addr)
+ if err != nil {
+ logs.Critical("ListenAndServe: ", err)
+ time.Sleep(100 * time.Microsecond)
+ endRunning <- true
+ return
+ }
+ if err = app.Server.Serve(ln); err != nil {
+ logs.Critical("ListenAndServe: ", err)
+ time.Sleep(100 * time.Microsecond)
+ endRunning <- true
+ return
+ }
+ } else {
+ if err := app.Server.ListenAndServe(); err != nil {
+ logs.Critical("ListenAndServe: ", err)
+ time.Sleep(100 * time.Microsecond)
+ endRunning <- true
+ }
+ }
+ }()
+ }
+ <-endRunning
+}
+
+// Router adds a patterned controller handler to BeeApp.
+// it's an alias method of App.Router.
+// usage:
+// simple router
+// beego.Router("/admin", &admin.UserController{})
+// beego.Router("/admin/index", &admin.ArticleController{})
+//
+// regex router
+//
+// beego.Router("/api/:id([0-9]+)", &controllers.RController{})
+//
+// custom rules
+// beego.Router("/api/list",&RestController{},"*:ListFood")
+// beego.Router("/api/create",&RestController{},"post:CreateFood")
+// beego.Router("/api/update",&RestController{},"put:UpdateFood")
+// beego.Router("/api/delete",&RestController{},"delete:DeleteFood")
+func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App {
+ BeeApp.Handlers.Add(rootpath, c, mappingMethods...)
+ return BeeApp
+}
+
+// UnregisterFixedRoute unregisters the route with the specified fixedRoute. It is particularly useful
+// in web applications that inherit most routes from a base webapp via the underscore
+// import, and aim to overwrite only certain paths.
+// The method parameter can be empty or "*" for all HTTP methods, or a particular
+// method type (e.g. "GET" or "POST") for selective removal.
+//
+// Usage (replace "GET" with "*" for all methods):
+// beego.UnregisterFixedRoute("/yourpreviouspath", "GET")
+// beego.Router("/yourpreviouspath", yourControllerAddress, "get:GetNewPage")
+func UnregisterFixedRoute(fixedRoute string, method string) *App {
+ subPaths := splitPath(fixedRoute)
+ if method == "" || method == "*" {
+ for m := range HTTPMETHOD {
+ if _, ok := BeeApp.Handlers.routers[m]; !ok {
+ continue
+ }
+ if BeeApp.Handlers.routers[m].prefix == strings.Trim(fixedRoute, "/ ") {
+ findAndRemoveSingleTree(BeeApp.Handlers.routers[m])
+ continue
+ }
+ findAndRemoveTree(subPaths, BeeApp.Handlers.routers[m], m)
+ }
+ return BeeApp
+ }
+ // Single HTTP method
+ um := strings.ToUpper(method)
+ if _, ok := BeeApp.Handlers.routers[um]; ok {
+ if BeeApp.Handlers.routers[um].prefix == strings.Trim(fixedRoute, "/ ") {
+ findAndRemoveSingleTree(BeeApp.Handlers.routers[um])
+ return BeeApp
+ }
+ findAndRemoveTree(subPaths, BeeApp.Handlers.routers[um], um)
+ }
+ return BeeApp
+}
+
+func findAndRemoveTree(paths []string, entryPointTree *Tree, method string) {
+ for i := range entryPointTree.fixrouters {
+ if entryPointTree.fixrouters[i].prefix == paths[0] {
+ if len(paths) == 1 {
+ if len(entryPointTree.fixrouters[i].fixrouters) > 0 {
+ // If the route had children subtrees, remove just the functional leaf,
+ // to allow children to function as before
+ if len(entryPointTree.fixrouters[i].leaves) > 0 {
+ entryPointTree.fixrouters[i].leaves[0] = nil
+ entryPointTree.fixrouters[i].leaves = entryPointTree.fixrouters[i].leaves[1:]
+ }
+ } else {
+ // Remove the *Tree from the fixrouters slice
+ entryPointTree.fixrouters[i] = nil
+
+ if i == len(entryPointTree.fixrouters)-1 {
+ entryPointTree.fixrouters = entryPointTree.fixrouters[:i]
+ } else {
+ entryPointTree.fixrouters = append(entryPointTree.fixrouters[:i], entryPointTree.fixrouters[i+1:len(entryPointTree.fixrouters)]...)
+ }
+ }
+ return
+ }
+ findAndRemoveTree(paths[1:], entryPointTree.fixrouters[i], method)
+ }
+ }
+}
+
+func findAndRemoveSingleTree(entryPointTree *Tree) {
+ if entryPointTree == nil {
+ return
+ }
+ if len(entryPointTree.fixrouters) > 0 {
+ // If the route had children subtrees, remove just the functional leaf,
+ // to allow children to function as before
+ if len(entryPointTree.leaves) > 0 {
+ entryPointTree.leaves[0] = nil
+ entryPointTree.leaves = entryPointTree.leaves[1:]
+ }
+ }
+}
+
+// Include will generate router file in the router/xxx.go from the controller's comments
+// usage:
+// beego.Include(&BankAccount{}, &OrderController{},&RefundController{},&ReceiptController{})
+// type BankAccount struct{
+// beego.Controller
+// }
+//
+// register the function
+// func (b *BankAccount)Mapping(){
+// b.Mapping("ShowAccount" , b.ShowAccount)
+// b.Mapping("ModifyAccount", b.ModifyAccount)
+//}
+//
+// //@router /account/:id [get]
+// func (b *BankAccount) ShowAccount(){
+// //logic
+// }
+//
+//
+// //@router /account/:id [post]
+// func (b *BankAccount) ModifyAccount(){
+// //logic
+// }
+//
+// the comments @router url methodlist
+// url support all the function Router's pattern
+// methodlist [get post head put delete options *]
+func Include(cList ...ControllerInterface) *App {
+ BeeApp.Handlers.Include(cList...)
+ return BeeApp
+}
+
+// RESTRouter adds a restful controller handler to BeeApp.
+// its' controller implements beego.ControllerInterface and
+// defines a param "pattern/:objectId" to visit each resource.
+func RESTRouter(rootpath string, c ControllerInterface) *App {
+ Router(rootpath, c)
+ Router(path.Join(rootpath, ":objectId"), c)
+ return BeeApp
+}
+
+// AutoRouter adds defined controller handler to BeeApp.
+// it's same to App.AutoRouter.
+// if beego.AddAuto(&MainContorlller{}) and MainController has methods List and Page,
+// visit the url /main/list to exec List function or /main/page to exec Page function.
+func AutoRouter(c ControllerInterface) *App {
+ BeeApp.Handlers.AddAuto(c)
+ return BeeApp
+}
+
+// AutoPrefix adds controller handler to BeeApp with prefix.
+// it's same to App.AutoRouterWithPrefix.
+// if beego.AutoPrefix("/admin",&MainContorlller{}) and MainController has methods List and Page,
+// visit the url /admin/main/list to exec List function or /admin/main/page to exec Page function.
+func AutoPrefix(prefix string, c ControllerInterface) *App {
+ BeeApp.Handlers.AddAutoPrefix(prefix, c)
+ return BeeApp
+}
+
+// Get used to register router for Get method
+// usage:
+// beego.Get("/", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Get(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Get(rootpath, f)
+ return BeeApp
+}
+
+// Post used to register router for Post method
+// usage:
+// beego.Post("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Post(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Post(rootpath, f)
+ return BeeApp
+}
+
+// Delete used to register router for Delete method
+// usage:
+// beego.Delete("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Delete(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Delete(rootpath, f)
+ return BeeApp
+}
+
+// Put used to register router for Put method
+// usage:
+// beego.Put("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Put(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Put(rootpath, f)
+ return BeeApp
+}
+
+// Head used to register router for Head method
+// usage:
+// beego.Head("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Head(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Head(rootpath, f)
+ return BeeApp
+}
+
+// Options used to register router for Options method
+// usage:
+// beego.Options("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Options(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Options(rootpath, f)
+ return BeeApp
+}
+
+// Patch used to register router for Patch method
+// usage:
+// beego.Patch("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Patch(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Patch(rootpath, f)
+ return BeeApp
+}
+
+// Any used to register router for all methods
+// usage:
+// beego.Any("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func Any(rootpath string, f FilterFunc) *App {
+ BeeApp.Handlers.Any(rootpath, f)
+ return BeeApp
+}
+
+// Handler used to register a Handler router
+// usage:
+// beego.Handler("/api", http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
+// fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
+// }))
+func Handler(rootpath string, h http.Handler, options ...interface{}) *App {
+ BeeApp.Handlers.Handler(rootpath, h, options...)
+ return BeeApp
+}
+
+// InsertFilter adds a FilterFunc with pattern condition and action constant.
+// The pos means action constant including
+// beego.BeforeStatic, beego.BeforeRouter, beego.BeforeExec, beego.AfterExec and beego.FinishRouter.
+// The bool params is for setting the returnOnOutput value (false allows multiple filters to execute)
+func InsertFilter(pattern string, pos int, filter FilterFunc, params ...bool) *App {
+ BeeApp.Handlers.InsertFilter(pattern, pos, filter, params...)
+ return BeeApp
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/beego.go b/at-admin/vendor/github.com/astaxie/beego/beego.go
new file mode 100644
index 0000000..66b19f3
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/beego.go
@@ -0,0 +1,123 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "os"
+ "path/filepath"
+ "strconv"
+ "strings"
+)
+
+const (
+ // VERSION represent beego web framework version.
+ VERSION = "1.12.0"
+
+ // DEV is for develop
+ DEV = "dev"
+ // PROD is for production
+ PROD = "prod"
+)
+
+// M is Map shortcut
+type M map[string]interface{}
+
+// Hook function to run
+type hookfunc func() error
+
+var (
+ hooks = make([]hookfunc, 0) //hook function slice to store the hookfunc
+)
+
+// AddAPPStartHook is used to register the hookfunc
+// The hookfuncs will run in beego.Run()
+// such as initiating session , starting middleware , building template, starting admin control and so on.
+func AddAPPStartHook(hf ...hookfunc) {
+ hooks = append(hooks, hf...)
+}
+
+// Run beego application.
+// beego.Run() default run on HttpPort
+// beego.Run("localhost")
+// beego.Run(":8089")
+// beego.Run("127.0.0.1:8089")
+func Run(params ...string) {
+
+ initBeforeHTTPRun()
+
+ if len(params) > 0 && params[0] != "" {
+ strs := strings.Split(params[0], ":")
+ if len(strs) > 0 && strs[0] != "" {
+ BConfig.Listen.HTTPAddr = strs[0]
+ }
+ if len(strs) > 1 && strs[1] != "" {
+ BConfig.Listen.HTTPPort, _ = strconv.Atoi(strs[1])
+ }
+
+ BConfig.Listen.Domains = params
+ }
+
+ BeeApp.Run()
+}
+
+// RunWithMiddleWares Run beego application with middlewares.
+func RunWithMiddleWares(addr string, mws ...MiddleWare) {
+ initBeforeHTTPRun()
+
+ strs := strings.Split(addr, ":")
+ if len(strs) > 0 && strs[0] != "" {
+ BConfig.Listen.HTTPAddr = strs[0]
+ BConfig.Listen.Domains = []string{strs[0]}
+ }
+ if len(strs) > 1 && strs[1] != "" {
+ BConfig.Listen.HTTPPort, _ = strconv.Atoi(strs[1])
+ }
+
+ BeeApp.Run(mws...)
+}
+
+func initBeforeHTTPRun() {
+ //init hooks
+ AddAPPStartHook(
+ registerMime,
+ registerDefaultErrorHandler,
+ registerSession,
+ registerTemplate,
+ registerAdmin,
+ registerGzip,
+ )
+
+ for _, hk := range hooks {
+ if err := hk(); err != nil {
+ panic(err)
+ }
+ }
+}
+
+// TestBeegoInit is for test package init
+func TestBeegoInit(ap string) {
+ path := filepath.Join(ap, "conf", "app.conf")
+ os.Chdir(ap)
+ InitBeegoBeforeTest(path)
+}
+
+// InitBeegoBeforeTest is for test package init
+func InitBeegoBeforeTest(appConfigPath string) {
+ if err := LoadAppConfig(appConfigProvider, appConfigPath); err != nil {
+ panic(err)
+ }
+ BConfig.RunMode = "test"
+ initBeforeHTTPRun()
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/config.go b/at-admin/vendor/github.com/astaxie/beego/config.go
new file mode 100644
index 0000000..7969dce
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/config.go
@@ -0,0 +1,510 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "reflect"
+ "runtime"
+ "strings"
+
+ "github.com/astaxie/beego/config"
+ "github.com/astaxie/beego/context"
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/session"
+ "github.com/astaxie/beego/utils"
+)
+
+// Config is the main struct for BConfig
+type Config struct {
+ AppName string //Application name
+ RunMode string //Running Mode: dev | prod
+ RouterCaseSensitive bool
+ ServerName string
+ RecoverPanic bool
+ RecoverFunc func(*context.Context)
+ CopyRequestBody bool
+ EnableGzip bool
+ MaxMemory int64
+ EnableErrorsShow bool
+ EnableErrorsRender bool
+ Listen Listen
+ WebConfig WebConfig
+ Log LogConfig
+}
+
+// Listen holds for http and https related config
+type Listen struct {
+ Graceful bool // Graceful means use graceful module to start the server
+ ServerTimeOut int64
+ ListenTCP4 bool
+ EnableHTTP bool
+ HTTPAddr string
+ HTTPPort int
+ AutoTLS bool
+ Domains []string
+ TLSCacheDir string
+ EnableHTTPS bool
+ EnableMutualHTTPS bool
+ HTTPSAddr string
+ HTTPSPort int
+ HTTPSCertFile string
+ HTTPSKeyFile string
+ TrustCaFile string
+ EnableAdmin bool
+ AdminAddr string
+ AdminPort int
+ EnableFcgi bool
+ EnableStdIo bool // EnableStdIo works with EnableFcgi Use FCGI via standard I/O
+}
+
+// WebConfig holds web related config
+type WebConfig struct {
+ AutoRender bool
+ EnableDocs bool
+ FlashName string
+ FlashSeparator string
+ DirectoryIndex bool
+ StaticDir map[string]string
+ StaticExtensionsToGzip []string
+ TemplateLeft string
+ TemplateRight string
+ ViewsPath string
+ EnableXSRF bool
+ XSRFKey string
+ XSRFExpire int
+ Session SessionConfig
+}
+
+// SessionConfig holds session related config
+type SessionConfig struct {
+ SessionOn bool
+ SessionProvider string
+ SessionName string
+ SessionGCMaxLifetime int64
+ SessionProviderConfig string
+ SessionCookieLifeTime int
+ SessionAutoSetCookie bool
+ SessionDomain string
+ SessionDisableHTTPOnly bool // used to allow for cross domain cookies/javascript cookies.
+ SessionEnableSidInHTTPHeader bool // enable store/get the sessionId into/from http headers
+ SessionNameInHTTPHeader string
+ SessionEnableSidInURLQuery bool // enable get the sessionId from Url Query params
+}
+
+// LogConfig holds Log related config
+type LogConfig struct {
+ AccessLogs bool
+ EnableStaticLogs bool //log static files requests default: false
+ AccessLogsFormat string //access log format: JSON_FORMAT, APACHE_FORMAT or empty string
+ FileLineNum bool
+ Outputs map[string]string // Store Adaptor : config
+}
+
+var (
+ // BConfig is the default config for Application
+ BConfig *Config
+ // AppConfig is the instance of Config, store the config information from file
+ AppConfig *beegoAppConfig
+ // AppPath is the absolute path to the app
+ AppPath string
+ // GlobalSessions is the instance for the session manager
+ GlobalSessions *session.Manager
+
+ // appConfigPath is the path to the config files
+ appConfigPath string
+ // appConfigProvider is the provider for the config, default is ini
+ appConfigProvider = "ini"
+)
+
+func init() {
+ BConfig = newBConfig()
+ var err error
+ if AppPath, err = filepath.Abs(filepath.Dir(os.Args[0])); err != nil {
+ panic(err)
+ }
+ workPath, err := os.Getwd()
+ if err != nil {
+ panic(err)
+ }
+ var filename = "app.conf"
+ if os.Getenv("BEEGO_RUNMODE") != "" {
+ filename = os.Getenv("BEEGO_RUNMODE") + ".app.conf"
+ }
+ appConfigPath = filepath.Join(workPath, "conf", filename)
+ if !utils.FileExists(appConfigPath) {
+ appConfigPath = filepath.Join(AppPath, "conf", filename)
+ if !utils.FileExists(appConfigPath) {
+ AppConfig = &beegoAppConfig{innerConfig: config.NewFakeConfig()}
+ return
+ }
+ }
+ if err = parseConfig(appConfigPath); err != nil {
+ panic(err)
+ }
+}
+
+func recoverPanic(ctx *context.Context) {
+ if err := recover(); err != nil {
+ if err == ErrAbort {
+ return
+ }
+ if !BConfig.RecoverPanic {
+ panic(err)
+ }
+ if BConfig.EnableErrorsShow {
+ if _, ok := ErrorMaps[fmt.Sprint(err)]; ok {
+ exception(fmt.Sprint(err), ctx)
+ return
+ }
+ }
+ var stack string
+ logs.Critical("the request url is ", ctx.Input.URL())
+ logs.Critical("Handler crashed with error", err)
+ for i := 1; ; i++ {
+ _, file, line, ok := runtime.Caller(i)
+ if !ok {
+ break
+ }
+ logs.Critical(fmt.Sprintf("%s:%d", file, line))
+ stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line))
+ }
+ if BConfig.RunMode == DEV && BConfig.EnableErrorsRender {
+ showErr(err, ctx, stack)
+ }
+ if ctx.Output.Status != 0 {
+ ctx.ResponseWriter.WriteHeader(ctx.Output.Status)
+ } else {
+ ctx.ResponseWriter.WriteHeader(500)
+ }
+ }
+}
+
+func newBConfig() *Config {
+ return &Config{
+ AppName: "beego",
+ RunMode: PROD,
+ RouterCaseSensitive: true,
+ ServerName: "beegoServer:" + VERSION,
+ RecoverPanic: true,
+ RecoverFunc: recoverPanic,
+ CopyRequestBody: false,
+ EnableGzip: false,
+ MaxMemory: 1 << 26, //64MB
+ EnableErrorsShow: true,
+ EnableErrorsRender: true,
+ Listen: Listen{
+ Graceful: false,
+ ServerTimeOut: 0,
+ ListenTCP4: false,
+ EnableHTTP: true,
+ AutoTLS: false,
+ Domains: []string{},
+ TLSCacheDir: ".",
+ HTTPAddr: "",
+ HTTPPort: 8080,
+ EnableHTTPS: false,
+ HTTPSAddr: "",
+ HTTPSPort: 10443,
+ HTTPSCertFile: "",
+ HTTPSKeyFile: "",
+ EnableAdmin: false,
+ AdminAddr: "",
+ AdminPort: 8088,
+ EnableFcgi: false,
+ EnableStdIo: false,
+ },
+ WebConfig: WebConfig{
+ AutoRender: true,
+ EnableDocs: false,
+ FlashName: "BEEGO_FLASH",
+ FlashSeparator: "BEEGOFLASH",
+ DirectoryIndex: false,
+ StaticDir: map[string]string{"/static": "static"},
+ StaticExtensionsToGzip: []string{".css", ".js"},
+ TemplateLeft: "{{",
+ TemplateRight: "}}",
+ ViewsPath: "views",
+ EnableXSRF: false,
+ XSRFKey: "beegoxsrf",
+ XSRFExpire: 0,
+ Session: SessionConfig{
+ SessionOn: false,
+ SessionProvider: "memory",
+ SessionName: "beegosessionID",
+ SessionGCMaxLifetime: 3600,
+ SessionProviderConfig: "",
+ SessionDisableHTTPOnly: false,
+ SessionCookieLifeTime: 0, //set cookie default is the browser life
+ SessionAutoSetCookie: true,
+ SessionDomain: "",
+ SessionEnableSidInHTTPHeader: false, // enable store/get the sessionId into/from http headers
+ SessionNameInHTTPHeader: "Beegosessionid",
+ SessionEnableSidInURLQuery: false, // enable get the sessionId from Url Query params
+ },
+ },
+ Log: LogConfig{
+ AccessLogs: false,
+ EnableStaticLogs: false,
+ AccessLogsFormat: "APACHE_FORMAT",
+ FileLineNum: true,
+ Outputs: map[string]string{"console": ""},
+ },
+ }
+}
+
+// now only support ini, next will support json.
+func parseConfig(appConfigPath string) (err error) {
+ AppConfig, err = newAppConfig(appConfigProvider, appConfigPath)
+ if err != nil {
+ return err
+ }
+ return assignConfig(AppConfig)
+}
+
+func assignConfig(ac config.Configer) error {
+ for _, i := range []interface{}{BConfig, &BConfig.Listen, &BConfig.WebConfig, &BConfig.Log, &BConfig.WebConfig.Session} {
+ assignSingleConfig(i, ac)
+ }
+ // set the run mode first
+ if envRunMode := os.Getenv("BEEGO_RUNMODE"); envRunMode != "" {
+ BConfig.RunMode = envRunMode
+ } else if runMode := ac.String("RunMode"); runMode != "" {
+ BConfig.RunMode = runMode
+ }
+
+ if sd := ac.String("StaticDir"); sd != "" {
+ BConfig.WebConfig.StaticDir = map[string]string{}
+ sds := strings.Fields(sd)
+ for _, v := range sds {
+ if url2fsmap := strings.SplitN(v, ":", 2); len(url2fsmap) == 2 {
+ BConfig.WebConfig.StaticDir["/"+strings.Trim(url2fsmap[0], "/")] = url2fsmap[1]
+ } else {
+ BConfig.WebConfig.StaticDir["/"+strings.Trim(url2fsmap[0], "/")] = url2fsmap[0]
+ }
+ }
+ }
+
+ if sgz := ac.String("StaticExtensionsToGzip"); sgz != "" {
+ extensions := strings.Split(sgz, ",")
+ fileExts := []string{}
+ for _, ext := range extensions {
+ ext = strings.TrimSpace(ext)
+ if ext == "" {
+ continue
+ }
+ if !strings.HasPrefix(ext, ".") {
+ ext = "." + ext
+ }
+ fileExts = append(fileExts, ext)
+ }
+ if len(fileExts) > 0 {
+ BConfig.WebConfig.StaticExtensionsToGzip = fileExts
+ }
+ }
+
+ if lo := ac.String("LogOutputs"); lo != "" {
+ // if lo is not nil or empty
+ // means user has set his own LogOutputs
+ // clear the default setting to BConfig.Log.Outputs
+ BConfig.Log.Outputs = make(map[string]string)
+ los := strings.Split(lo, ";")
+ for _, v := range los {
+ if logType2Config := strings.SplitN(v, ",", 2); len(logType2Config) == 2 {
+ BConfig.Log.Outputs[logType2Config[0]] = logType2Config[1]
+ } else {
+ continue
+ }
+ }
+ }
+
+ //init log
+ logs.Reset()
+ for adaptor, config := range BConfig.Log.Outputs {
+ err := logs.SetLogger(adaptor, config)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, fmt.Sprintf("%s with the config %q got err:%s", adaptor, config, err.Error()))
+ }
+ }
+ logs.SetLogFuncCall(BConfig.Log.FileLineNum)
+
+ return nil
+}
+
+func assignSingleConfig(p interface{}, ac config.Configer) {
+ pt := reflect.TypeOf(p)
+ if pt.Kind() != reflect.Ptr {
+ return
+ }
+ pt = pt.Elem()
+ if pt.Kind() != reflect.Struct {
+ return
+ }
+ pv := reflect.ValueOf(p).Elem()
+
+ for i := 0; i < pt.NumField(); i++ {
+ pf := pv.Field(i)
+ if !pf.CanSet() {
+ continue
+ }
+ name := pt.Field(i).Name
+ switch pf.Kind() {
+ case reflect.String:
+ pf.SetString(ac.DefaultString(name, pf.String()))
+ case reflect.Int, reflect.Int64:
+ pf.SetInt(ac.DefaultInt64(name, pf.Int()))
+ case reflect.Bool:
+ pf.SetBool(ac.DefaultBool(name, pf.Bool()))
+ case reflect.Struct:
+ default:
+ //do nothing here
+ }
+ }
+
+}
+
+// LoadAppConfig allow developer to apply a config file
+func LoadAppConfig(adapterName, configPath string) error {
+ absConfigPath, err := filepath.Abs(configPath)
+ if err != nil {
+ return err
+ }
+
+ if !utils.FileExists(absConfigPath) {
+ return fmt.Errorf("the target config file: %s don't exist", configPath)
+ }
+
+ appConfigPath = absConfigPath
+ appConfigProvider = adapterName
+
+ return parseConfig(appConfigPath)
+}
+
+type beegoAppConfig struct {
+ innerConfig config.Configer
+}
+
+func newAppConfig(appConfigProvider, appConfigPath string) (*beegoAppConfig, error) {
+ ac, err := config.NewConfig(appConfigProvider, appConfigPath)
+ if err != nil {
+ return nil, err
+ }
+ return &beegoAppConfig{ac}, nil
+}
+
+func (b *beegoAppConfig) Set(key, val string) error {
+ if err := b.innerConfig.Set(BConfig.RunMode+"::"+key, val); err != nil {
+ return err
+ }
+ return b.innerConfig.Set(key, val)
+}
+
+func (b *beegoAppConfig) String(key string) string {
+ if v := b.innerConfig.String(BConfig.RunMode + "::" + key); v != "" {
+ return v
+ }
+ return b.innerConfig.String(key)
+}
+
+func (b *beegoAppConfig) Strings(key string) []string {
+ if v := b.innerConfig.Strings(BConfig.RunMode + "::" + key); len(v) > 0 {
+ return v
+ }
+ return b.innerConfig.Strings(key)
+}
+
+func (b *beegoAppConfig) Int(key string) (int, error) {
+ if v, err := b.innerConfig.Int(BConfig.RunMode + "::" + key); err == nil {
+ return v, nil
+ }
+ return b.innerConfig.Int(key)
+}
+
+func (b *beegoAppConfig) Int64(key string) (int64, error) {
+ if v, err := b.innerConfig.Int64(BConfig.RunMode + "::" + key); err == nil {
+ return v, nil
+ }
+ return b.innerConfig.Int64(key)
+}
+
+func (b *beegoAppConfig) Bool(key string) (bool, error) {
+ if v, err := b.innerConfig.Bool(BConfig.RunMode + "::" + key); err == nil {
+ return v, nil
+ }
+ return b.innerConfig.Bool(key)
+}
+
+func (b *beegoAppConfig) Float(key string) (float64, error) {
+ if v, err := b.innerConfig.Float(BConfig.RunMode + "::" + key); err == nil {
+ return v, nil
+ }
+ return b.innerConfig.Float(key)
+}
+
+func (b *beegoAppConfig) DefaultString(key string, defaultVal string) string {
+ if v := b.String(key); v != "" {
+ return v
+ }
+ return defaultVal
+}
+
+func (b *beegoAppConfig) DefaultStrings(key string, defaultVal []string) []string {
+ if v := b.Strings(key); len(v) != 0 {
+ return v
+ }
+ return defaultVal
+}
+
+func (b *beegoAppConfig) DefaultInt(key string, defaultVal int) int {
+ if v, err := b.Int(key); err == nil {
+ return v
+ }
+ return defaultVal
+}
+
+func (b *beegoAppConfig) DefaultInt64(key string, defaultVal int64) int64 {
+ if v, err := b.Int64(key); err == nil {
+ return v
+ }
+ return defaultVal
+}
+
+func (b *beegoAppConfig) DefaultBool(key string, defaultVal bool) bool {
+ if v, err := b.Bool(key); err == nil {
+ return v
+ }
+ return defaultVal
+}
+
+func (b *beegoAppConfig) DefaultFloat(key string, defaultVal float64) float64 {
+ if v, err := b.Float(key); err == nil {
+ return v
+ }
+ return defaultVal
+}
+
+func (b *beegoAppConfig) DIY(key string) (interface{}, error) {
+ return b.innerConfig.DIY(key)
+}
+
+func (b *beegoAppConfig) GetSection(section string) (map[string]string, error) {
+ return b.innerConfig.GetSection(section)
+}
+
+func (b *beegoAppConfig) SaveConfigFile(filename string) error {
+ return b.innerConfig.SaveConfigFile(filename)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/config/config.go b/at-admin/vendor/github.com/astaxie/beego/config/config.go
new file mode 100644
index 0000000..bfd79e8
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/config/config.go
@@ -0,0 +1,242 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+// Package config is used to parse config.
+// Usage:
+// import "github.com/astaxie/beego/config"
+//Examples.
+//
+// cnf, err := config.NewConfig("ini", "config.conf")
+//
+// cnf APIS:
+//
+// cnf.Set(key, val string) error
+// cnf.String(key string) string
+// cnf.Strings(key string) []string
+// cnf.Int(key string) (int, error)
+// cnf.Int64(key string) (int64, error)
+// cnf.Bool(key string) (bool, error)
+// cnf.Float(key string) (float64, error)
+// cnf.DefaultString(key string, defaultVal string) string
+// cnf.DefaultStrings(key string, defaultVal []string) []string
+// cnf.DefaultInt(key string, defaultVal int) int
+// cnf.DefaultInt64(key string, defaultVal int64) int64
+// cnf.DefaultBool(key string, defaultVal bool) bool
+// cnf.DefaultFloat(key string, defaultVal float64) float64
+// cnf.DIY(key string) (interface{}, error)
+// cnf.GetSection(section string) (map[string]string, error)
+// cnf.SaveConfigFile(filename string) error
+//More docs http://beego.me/docs/module/config.md
+package config
+
+import (
+ "fmt"
+ "os"
+ "reflect"
+ "time"
+)
+
+// Configer defines how to get and set value from configuration raw data.
+type Configer interface {
+ Set(key, val string) error //support section::key type in given key when using ini type.
+ String(key string) string //support section::key type in key string when using ini and json type; Int,Int64,Bool,Float,DIY are same.
+ Strings(key string) []string //get string slice
+ Int(key string) (int, error)
+ Int64(key string) (int64, error)
+ Bool(key string) (bool, error)
+ Float(key string) (float64, error)
+ DefaultString(key string, defaultVal string) string // support section::key type in key string when using ini and json type; Int,Int64,Bool,Float,DIY are same.
+ DefaultStrings(key string, defaultVal []string) []string //get string slice
+ DefaultInt(key string, defaultVal int) int
+ DefaultInt64(key string, defaultVal int64) int64
+ DefaultBool(key string, defaultVal bool) bool
+ DefaultFloat(key string, defaultVal float64) float64
+ DIY(key string) (interface{}, error)
+ GetSection(section string) (map[string]string, error)
+ SaveConfigFile(filename string) error
+}
+
+// Config is the adapter interface for parsing config file to get raw data to Configer.
+type Config interface {
+ Parse(key string) (Configer, error)
+ ParseData(data []byte) (Configer, error)
+}
+
+var adapters = make(map[string]Config)
+
+// Register makes a config adapter available by the adapter name.
+// If Register is called twice with the same name or if driver is nil,
+// it panics.
+func Register(name string, adapter Config) {
+ if adapter == nil {
+ panic("config: Register adapter is nil")
+ }
+ if _, ok := adapters[name]; ok {
+ panic("config: Register called twice for adapter " + name)
+ }
+ adapters[name] = adapter
+}
+
+// NewConfig adapterName is ini/json/xml/yaml.
+// filename is the config file path.
+func NewConfig(adapterName, filename string) (Configer, error) {
+ adapter, ok := adapters[adapterName]
+ if !ok {
+ return nil, fmt.Errorf("config: unknown adaptername %q (forgotten import?)", adapterName)
+ }
+ return adapter.Parse(filename)
+}
+
+// NewConfigData adapterName is ini/json/xml/yaml.
+// data is the config data.
+func NewConfigData(adapterName string, data []byte) (Configer, error) {
+ adapter, ok := adapters[adapterName]
+ if !ok {
+ return nil, fmt.Errorf("config: unknown adaptername %q (forgotten import?)", adapterName)
+ }
+ return adapter.ParseData(data)
+}
+
+// ExpandValueEnvForMap convert all string value with environment variable.
+func ExpandValueEnvForMap(m map[string]interface{}) map[string]interface{} {
+ for k, v := range m {
+ switch value := v.(type) {
+ case string:
+ m[k] = ExpandValueEnv(value)
+ case map[string]interface{}:
+ m[k] = ExpandValueEnvForMap(value)
+ case map[string]string:
+ for k2, v2 := range value {
+ value[k2] = ExpandValueEnv(v2)
+ }
+ m[k] = value
+ }
+ }
+ return m
+}
+
+// ExpandValueEnv returns value of convert with environment variable.
+//
+// Return environment variable if value start with "${" and end with "}".
+// Return default value if environment variable is empty or not exist.
+//
+// It accept value formats "${env}" , "${env||}}" , "${env||defaultValue}" , "defaultvalue".
+// Examples:
+// v1 := config.ExpandValueEnv("${GOPATH}") // return the GOPATH environment variable.
+// v2 := config.ExpandValueEnv("${GOAsta||/usr/local/go}") // return the default value "/usr/local/go/".
+// v3 := config.ExpandValueEnv("Astaxie") // return the value "Astaxie".
+func ExpandValueEnv(value string) (realValue string) {
+ realValue = value
+
+ vLen := len(value)
+ // 3 = ${}
+ if vLen < 3 {
+ return
+ }
+ // Need start with "${" and end with "}", then return.
+ if value[0] != '$' || value[1] != '{' || value[vLen-1] != '}' {
+ return
+ }
+
+ key := ""
+ defaultV := ""
+ // value start with "${"
+ for i := 2; i < vLen; i++ {
+ if value[i] == '|' && (i+1 < vLen && value[i+1] == '|') {
+ key = value[2:i]
+ defaultV = value[i+2 : vLen-1] // other string is default value.
+ break
+ } else if value[i] == '}' {
+ key = value[2:i]
+ break
+ }
+ }
+
+ realValue = os.Getenv(key)
+ if realValue == "" {
+ realValue = defaultV
+ }
+
+ return
+}
+
+// ParseBool returns the boolean value represented by the string.
+//
+// It accepts 1, 1.0, t, T, TRUE, true, True, YES, yes, Yes,Y, y, ON, on, On,
+// 0, 0.0, f, F, FALSE, false, False, NO, no, No, N,n, OFF, off, Off.
+// Any other value returns an error.
+func ParseBool(val interface{}) (value bool, err error) {
+ if val != nil {
+ switch v := val.(type) {
+ case bool:
+ return v, nil
+ case string:
+ switch v {
+ case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "Y", "y", "ON", "on", "On":
+ return true, nil
+ case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "N", "n", "OFF", "off", "Off":
+ return false, nil
+ }
+ case int8, int32, int64:
+ strV := fmt.Sprintf("%d", v)
+ if strV == "1" {
+ return true, nil
+ } else if strV == "0" {
+ return false, nil
+ }
+ case float64:
+ if v == 1.0 {
+ return true, nil
+ } else if v == 0.0 {
+ return false, nil
+ }
+ }
+ return false, fmt.Errorf("parsing %q: invalid syntax", val)
+ }
+ return false, fmt.Errorf("parsing : invalid syntax")
+}
+
+// ToString converts values of any type to string.
+func ToString(x interface{}) string {
+ switch y := x.(type) {
+
+ // Handle dates with special logic
+ // This needs to come above the fmt.Stringer
+ // test since time.Time's have a .String()
+ // method
+ case time.Time:
+ return y.Format("A Monday")
+
+ // Handle type string
+ case string:
+ return y
+
+ // Handle type with .String() method
+ case fmt.Stringer:
+ return y.String()
+
+ // Handle type with .Error() method
+ case error:
+ return y.Error()
+
+ }
+
+ // Handle named string type
+ if v := reflect.ValueOf(x); v.Kind() == reflect.String {
+ return v.String()
+ }
+
+ // Fallback to fmt package for anything else like numeric types
+ return fmt.Sprint(x)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/config/fake.go b/at-admin/vendor/github.com/astaxie/beego/config/fake.go
new file mode 100644
index 0000000..d21ab82
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/config/fake.go
@@ -0,0 +1,134 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package config
+
+import (
+ "errors"
+ "strconv"
+ "strings"
+)
+
+type fakeConfigContainer struct {
+ data map[string]string
+}
+
+func (c *fakeConfigContainer) getData(key string) string {
+ return c.data[strings.ToLower(key)]
+}
+
+func (c *fakeConfigContainer) Set(key, val string) error {
+ c.data[strings.ToLower(key)] = val
+ return nil
+}
+
+func (c *fakeConfigContainer) String(key string) string {
+ return c.getData(key)
+}
+
+func (c *fakeConfigContainer) DefaultString(key string, defaultval string) string {
+ v := c.String(key)
+ if v == "" {
+ return defaultval
+ }
+ return v
+}
+
+func (c *fakeConfigContainer) Strings(key string) []string {
+ v := c.String(key)
+ if v == "" {
+ return nil
+ }
+ return strings.Split(v, ";")
+}
+
+func (c *fakeConfigContainer) DefaultStrings(key string, defaultval []string) []string {
+ v := c.Strings(key)
+ if v == nil {
+ return defaultval
+ }
+ return v
+}
+
+func (c *fakeConfigContainer) Int(key string) (int, error) {
+ return strconv.Atoi(c.getData(key))
+}
+
+func (c *fakeConfigContainer) DefaultInt(key string, defaultval int) int {
+ v, err := c.Int(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+func (c *fakeConfigContainer) Int64(key string) (int64, error) {
+ return strconv.ParseInt(c.getData(key), 10, 64)
+}
+
+func (c *fakeConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
+ v, err := c.Int64(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+func (c *fakeConfigContainer) Bool(key string) (bool, error) {
+ return ParseBool(c.getData(key))
+}
+
+func (c *fakeConfigContainer) DefaultBool(key string, defaultval bool) bool {
+ v, err := c.Bool(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+func (c *fakeConfigContainer) Float(key string) (float64, error) {
+ return strconv.ParseFloat(c.getData(key), 64)
+}
+
+func (c *fakeConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
+ v, err := c.Float(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+func (c *fakeConfigContainer) DIY(key string) (interface{}, error) {
+ if v, ok := c.data[strings.ToLower(key)]; ok {
+ return v, nil
+ }
+ return nil, errors.New("key not find")
+}
+
+func (c *fakeConfigContainer) GetSection(section string) (map[string]string, error) {
+ return nil, errors.New("not implement in the fakeConfigContainer")
+}
+
+func (c *fakeConfigContainer) SaveConfigFile(filename string) error {
+ return errors.New("not implement in the fakeConfigContainer")
+}
+
+var _ Configer = new(fakeConfigContainer)
+
+// NewFakeConfig return a fake Configer
+func NewFakeConfig() Configer {
+ return &fakeConfigContainer{
+ data: make(map[string]string),
+ }
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/config/ini.go b/at-admin/vendor/github.com/astaxie/beego/config/ini.go
new file mode 100644
index 0000000..002e5e0
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/config/ini.go
@@ -0,0 +1,504 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package config
+
+import (
+ "bufio"
+ "bytes"
+ "errors"
+ "io"
+ "io/ioutil"
+ "os"
+ "os/user"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "sync"
+)
+
+var (
+ defaultSection = "default" // default section means if some ini items not in a section, make them in default section,
+ bNumComment = []byte{'#'} // number signal
+ bSemComment = []byte{';'} // semicolon signal
+ bEmpty = []byte{}
+ bEqual = []byte{'='} // equal signal
+ bDQuote = []byte{'"'} // quote signal
+ sectionStart = []byte{'['} // section start signal
+ sectionEnd = []byte{']'} // section end signal
+ lineBreak = "\n"
+)
+
+// IniConfig implements Config to parse ini file.
+type IniConfig struct {
+}
+
+// Parse creates a new Config and parses the file configuration from the named file.
+func (ini *IniConfig) Parse(name string) (Configer, error) {
+ return ini.parseFile(name)
+}
+
+func (ini *IniConfig) parseFile(name string) (*IniConfigContainer, error) {
+ data, err := ioutil.ReadFile(name)
+ if err != nil {
+ return nil, err
+ }
+
+ return ini.parseData(filepath.Dir(name), data)
+}
+
+func (ini *IniConfig) parseData(dir string, data []byte) (*IniConfigContainer, error) {
+ cfg := &IniConfigContainer{
+ data: make(map[string]map[string]string),
+ sectionComment: make(map[string]string),
+ keyComment: make(map[string]string),
+ RWMutex: sync.RWMutex{},
+ }
+ cfg.Lock()
+ defer cfg.Unlock()
+
+ var comment bytes.Buffer
+ buf := bufio.NewReader(bytes.NewBuffer(data))
+ // check the BOM
+ head, err := buf.Peek(3)
+ if err == nil && head[0] == 239 && head[1] == 187 && head[2] == 191 {
+ for i := 1; i <= 3; i++ {
+ buf.ReadByte()
+ }
+ }
+ section := defaultSection
+ tmpBuf := bytes.NewBuffer(nil)
+ for {
+ tmpBuf.Reset()
+
+ shouldBreak := false
+ for {
+ tmp, isPrefix, err := buf.ReadLine()
+ if err == io.EOF {
+ shouldBreak = true
+ break
+ }
+
+ //It might be a good idea to throw a error on all unknonw errors?
+ if _, ok := err.(*os.PathError); ok {
+ return nil, err
+ }
+
+ tmpBuf.Write(tmp)
+ if isPrefix {
+ continue
+ }
+
+ if !isPrefix {
+ break
+ }
+ }
+ if shouldBreak {
+ break
+ }
+
+ line := tmpBuf.Bytes()
+ line = bytes.TrimSpace(line)
+ if bytes.Equal(line, bEmpty) {
+ continue
+ }
+ var bComment []byte
+ switch {
+ case bytes.HasPrefix(line, bNumComment):
+ bComment = bNumComment
+ case bytes.HasPrefix(line, bSemComment):
+ bComment = bSemComment
+ }
+ if bComment != nil {
+ line = bytes.TrimLeft(line, string(bComment))
+ // Need append to a new line if multi-line comments.
+ if comment.Len() > 0 {
+ comment.WriteByte('\n')
+ }
+ comment.Write(line)
+ continue
+ }
+
+ if bytes.HasPrefix(line, sectionStart) && bytes.HasSuffix(line, sectionEnd) {
+ section = strings.ToLower(string(line[1 : len(line)-1])) // section name case insensitive
+ if comment.Len() > 0 {
+ cfg.sectionComment[section] = comment.String()
+ comment.Reset()
+ }
+ if _, ok := cfg.data[section]; !ok {
+ cfg.data[section] = make(map[string]string)
+ }
+ continue
+ }
+
+ if _, ok := cfg.data[section]; !ok {
+ cfg.data[section] = make(map[string]string)
+ }
+ keyValue := bytes.SplitN(line, bEqual, 2)
+
+ key := string(bytes.TrimSpace(keyValue[0])) // key name case insensitive
+ key = strings.ToLower(key)
+
+ // handle include "other.conf"
+ if len(keyValue) == 1 && strings.HasPrefix(key, "include") {
+
+ includefiles := strings.Fields(key)
+ if includefiles[0] == "include" && len(includefiles) == 2 {
+
+ otherfile := strings.Trim(includefiles[1], "\"")
+ if !filepath.IsAbs(otherfile) {
+ otherfile = filepath.Join(dir, otherfile)
+ }
+
+ i, err := ini.parseFile(otherfile)
+ if err != nil {
+ return nil, err
+ }
+
+ for sec, dt := range i.data {
+ if _, ok := cfg.data[sec]; !ok {
+ cfg.data[sec] = make(map[string]string)
+ }
+ for k, v := range dt {
+ cfg.data[sec][k] = v
+ }
+ }
+
+ for sec, comm := range i.sectionComment {
+ cfg.sectionComment[sec] = comm
+ }
+
+ for k, comm := range i.keyComment {
+ cfg.keyComment[k] = comm
+ }
+
+ continue
+ }
+ }
+
+ if len(keyValue) != 2 {
+ return nil, errors.New("read the content error: \"" + string(line) + "\", should key = val")
+ }
+ val := bytes.TrimSpace(keyValue[1])
+ if bytes.HasPrefix(val, bDQuote) {
+ val = bytes.Trim(val, `"`)
+ }
+
+ cfg.data[section][key] = ExpandValueEnv(string(val))
+ if comment.Len() > 0 {
+ cfg.keyComment[section+"."+key] = comment.String()
+ comment.Reset()
+ }
+
+ }
+ return cfg, nil
+}
+
+// ParseData parse ini the data
+// When include other.conf,other.conf is either absolute directory
+// or under beego in default temporary directory(/tmp/beego[-username]).
+func (ini *IniConfig) ParseData(data []byte) (Configer, error) {
+ dir := "beego"
+ currentUser, err := user.Current()
+ if err == nil {
+ dir = "beego-" + currentUser.Username
+ }
+ dir = filepath.Join(os.TempDir(), dir)
+ if err = os.MkdirAll(dir, os.ModePerm); err != nil {
+ return nil, err
+ }
+
+ return ini.parseData(dir, data)
+}
+
+// IniConfigContainer A Config represents the ini configuration.
+// When set and get value, support key as section:name type.
+type IniConfigContainer struct {
+ data map[string]map[string]string // section=> key:val
+ sectionComment map[string]string // section : comment
+ keyComment map[string]string // id: []{comment, key...}; id 1 is for main comment.
+ sync.RWMutex
+}
+
+// Bool returns the boolean value for a given key.
+func (c *IniConfigContainer) Bool(key string) (bool, error) {
+ return ParseBool(c.getdata(key))
+}
+
+// DefaultBool returns the boolean value for a given key.
+// if err != nil return defaultval
+func (c *IniConfigContainer) DefaultBool(key string, defaultval bool) bool {
+ v, err := c.Bool(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+// Int returns the integer value for a given key.
+func (c *IniConfigContainer) Int(key string) (int, error) {
+ return strconv.Atoi(c.getdata(key))
+}
+
+// DefaultInt returns the integer value for a given key.
+// if err != nil return defaultval
+func (c *IniConfigContainer) DefaultInt(key string, defaultval int) int {
+ v, err := c.Int(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+// Int64 returns the int64 value for a given key.
+func (c *IniConfigContainer) Int64(key string) (int64, error) {
+ return strconv.ParseInt(c.getdata(key), 10, 64)
+}
+
+// DefaultInt64 returns the int64 value for a given key.
+// if err != nil return defaultval
+func (c *IniConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
+ v, err := c.Int64(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+// Float returns the float value for a given key.
+func (c *IniConfigContainer) Float(key string) (float64, error) {
+ return strconv.ParseFloat(c.getdata(key), 64)
+}
+
+// DefaultFloat returns the float64 value for a given key.
+// if err != nil return defaultval
+func (c *IniConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
+ v, err := c.Float(key)
+ if err != nil {
+ return defaultval
+ }
+ return v
+}
+
+// String returns the string value for a given key.
+func (c *IniConfigContainer) String(key string) string {
+ return c.getdata(key)
+}
+
+// DefaultString returns the string value for a given key.
+// if err != nil return defaultval
+func (c *IniConfigContainer) DefaultString(key string, defaultval string) string {
+ v := c.String(key)
+ if v == "" {
+ return defaultval
+ }
+ return v
+}
+
+// Strings returns the []string value for a given key.
+// Return nil if config value does not exist or is empty.
+func (c *IniConfigContainer) Strings(key string) []string {
+ v := c.String(key)
+ if v == "" {
+ return nil
+ }
+ return strings.Split(v, ";")
+}
+
+// DefaultStrings returns the []string value for a given key.
+// if err != nil return defaultval
+func (c *IniConfigContainer) DefaultStrings(key string, defaultval []string) []string {
+ v := c.Strings(key)
+ if v == nil {
+ return defaultval
+ }
+ return v
+}
+
+// GetSection returns map for the given section
+func (c *IniConfigContainer) GetSection(section string) (map[string]string, error) {
+ if v, ok := c.data[section]; ok {
+ return v, nil
+ }
+ return nil, errors.New("not exist section")
+}
+
+// SaveConfigFile save the config into file.
+//
+// BUG(env): The environment variable config item will be saved with real value in SaveConfigFile Function.
+func (c *IniConfigContainer) SaveConfigFile(filename string) (err error) {
+ // Write configuration file by filename.
+ f, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ // Get section or key comments. Fixed #1607
+ getCommentStr := func(section, key string) string {
+ var (
+ comment string
+ ok bool
+ )
+ if len(key) == 0 {
+ comment, ok = c.sectionComment[section]
+ } else {
+ comment, ok = c.keyComment[section+"."+key]
+ }
+
+ if ok {
+ // Empty comment
+ if len(comment) == 0 || len(strings.TrimSpace(comment)) == 0 {
+ return string(bNumComment)
+ }
+ prefix := string(bNumComment)
+ // Add the line head character "#"
+ return prefix + strings.Replace(comment, lineBreak, lineBreak+prefix, -1)
+ }
+ return ""
+ }
+
+ buf := bytes.NewBuffer(nil)
+ // Save default section at first place
+ if dt, ok := c.data[defaultSection]; ok {
+ for key, val := range dt {
+ if key != " " {
+ // Write key comments.
+ if v := getCommentStr(defaultSection, key); len(v) > 0 {
+ if _, err = buf.WriteString(v + lineBreak); err != nil {
+ return err
+ }
+ }
+
+ // Write key and value.
+ if _, err = buf.WriteString(key + string(bEqual) + val + lineBreak); err != nil {
+ return err
+ }
+ }
+ }
+
+ // Put a line between sections.
+ if _, err = buf.WriteString(lineBreak); err != nil {
+ return err
+ }
+ }
+ // Save named sections
+ for section, dt := range c.data {
+ if section != defaultSection {
+ // Write section comments.
+ if v := getCommentStr(section, ""); len(v) > 0 {
+ if _, err = buf.WriteString(v + lineBreak); err != nil {
+ return err
+ }
+ }
+
+ // Write section name.
+ if _, err = buf.WriteString(string(sectionStart) + section + string(sectionEnd) + lineBreak); err != nil {
+ return err
+ }
+
+ for key, val := range dt {
+ if key != " " {
+ // Write key comments.
+ if v := getCommentStr(section, key); len(v) > 0 {
+ if _, err = buf.WriteString(v + lineBreak); err != nil {
+ return err
+ }
+ }
+
+ // Write key and value.
+ if _, err = buf.WriteString(key + string(bEqual) + val + lineBreak); err != nil {
+ return err
+ }
+ }
+ }
+
+ // Put a line between sections.
+ if _, err = buf.WriteString(lineBreak); err != nil {
+ return err
+ }
+ }
+ }
+ _, err = buf.WriteTo(f)
+ return err
+}
+
+// Set writes a new value for key.
+// if write to one section, the key need be "section::key".
+// if the section is not existed, it panics.
+func (c *IniConfigContainer) Set(key, value string) error {
+ c.Lock()
+ defer c.Unlock()
+ if len(key) == 0 {
+ return errors.New("key is empty")
+ }
+
+ var (
+ section, k string
+ sectionKey = strings.Split(strings.ToLower(key), "::")
+ )
+
+ if len(sectionKey) >= 2 {
+ section = sectionKey[0]
+ k = sectionKey[1]
+ } else {
+ section = defaultSection
+ k = sectionKey[0]
+ }
+
+ if _, ok := c.data[section]; !ok {
+ c.data[section] = make(map[string]string)
+ }
+ c.data[section][k] = value
+ return nil
+}
+
+// DIY returns the raw value by a given key.
+func (c *IniConfigContainer) DIY(key string) (v interface{}, err error) {
+ if v, ok := c.data[strings.ToLower(key)]; ok {
+ return v, nil
+ }
+ return v, errors.New("key not find")
+}
+
+// section.key or key
+func (c *IniConfigContainer) getdata(key string) string {
+ if len(key) == 0 {
+ return ""
+ }
+ c.RLock()
+ defer c.RUnlock()
+
+ var (
+ section, k string
+ sectionKey = strings.Split(strings.ToLower(key), "::")
+ )
+ if len(sectionKey) >= 2 {
+ section = sectionKey[0]
+ k = sectionKey[1]
+ } else {
+ section = defaultSection
+ k = sectionKey[0]
+ }
+ if v, ok := c.data[section]; ok {
+ if vv, ok := v[k]; ok {
+ return vv
+ }
+ }
+ return ""
+}
+
+func init() {
+ Register("ini", &IniConfig{})
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/config/json.go b/at-admin/vendor/github.com/astaxie/beego/config/json.go
new file mode 100644
index 0000000..74c18c9
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/config/json.go
@@ -0,0 +1,266 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package config
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "strings"
+ "sync"
+)
+
+// JSONConfig is a json config parser and implements Config interface.
+type JSONConfig struct {
+}
+
+// Parse returns a ConfigContainer with parsed json config map.
+func (js *JSONConfig) Parse(filename string) (Configer, error) {
+ file, err := os.Open(filename)
+ if err != nil {
+ return nil, err
+ }
+ defer file.Close()
+ content, err := ioutil.ReadAll(file)
+ if err != nil {
+ return nil, err
+ }
+
+ return js.ParseData(content)
+}
+
+// ParseData returns a ConfigContainer with json string
+func (js *JSONConfig) ParseData(data []byte) (Configer, error) {
+ x := &JSONConfigContainer{
+ data: make(map[string]interface{}),
+ }
+ err := json.Unmarshal(data, &x.data)
+ if err != nil {
+ var wrappingArray []interface{}
+ err2 := json.Unmarshal(data, &wrappingArray)
+ if err2 != nil {
+ return nil, err
+ }
+ x.data["rootArray"] = wrappingArray
+ }
+
+ x.data = ExpandValueEnvForMap(x.data)
+
+ return x, nil
+}
+
+// JSONConfigContainer A Config represents the json configuration.
+// Only when get value, support key as section:name type.
+type JSONConfigContainer struct {
+ data map[string]interface{}
+ sync.RWMutex
+}
+
+// Bool returns the boolean value for a given key.
+func (c *JSONConfigContainer) Bool(key string) (bool, error) {
+ val := c.getData(key)
+ if val != nil {
+ return ParseBool(val)
+ }
+ return false, fmt.Errorf("not exist key: %q", key)
+}
+
+// DefaultBool return the bool value if has no error
+// otherwise return the defaultval
+func (c *JSONConfigContainer) DefaultBool(key string, defaultval bool) bool {
+ if v, err := c.Bool(key); err == nil {
+ return v
+ }
+ return defaultval
+}
+
+// Int returns the integer value for a given key.
+func (c *JSONConfigContainer) Int(key string) (int, error) {
+ val := c.getData(key)
+ if val != nil {
+ if v, ok := val.(float64); ok {
+ return int(v), nil
+ }
+ return 0, errors.New("not int value")
+ }
+ return 0, errors.New("not exist key:" + key)
+}
+
+// DefaultInt returns the integer value for a given key.
+// if err != nil return defaultval
+func (c *JSONConfigContainer) DefaultInt(key string, defaultval int) int {
+ if v, err := c.Int(key); err == nil {
+ return v
+ }
+ return defaultval
+}
+
+// Int64 returns the int64 value for a given key.
+func (c *JSONConfigContainer) Int64(key string) (int64, error) {
+ val := c.getData(key)
+ if val != nil {
+ if v, ok := val.(float64); ok {
+ return int64(v), nil
+ }
+ return 0, errors.New("not int64 value")
+ }
+ return 0, errors.New("not exist key:" + key)
+}
+
+// DefaultInt64 returns the int64 value for a given key.
+// if err != nil return defaultval
+func (c *JSONConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
+ if v, err := c.Int64(key); err == nil {
+ return v
+ }
+ return defaultval
+}
+
+// Float returns the float value for a given key.
+func (c *JSONConfigContainer) Float(key string) (float64, error) {
+ val := c.getData(key)
+ if val != nil {
+ if v, ok := val.(float64); ok {
+ return v, nil
+ }
+ return 0.0, errors.New("not float64 value")
+ }
+ return 0.0, errors.New("not exist key:" + key)
+}
+
+// DefaultFloat returns the float64 value for a given key.
+// if err != nil return defaultval
+func (c *JSONConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
+ if v, err := c.Float(key); err == nil {
+ return v
+ }
+ return defaultval
+}
+
+// String returns the string value for a given key.
+func (c *JSONConfigContainer) String(key string) string {
+ val := c.getData(key)
+ if val != nil {
+ if v, ok := val.(string); ok {
+ return v
+ }
+ }
+ return ""
+}
+
+// DefaultString returns the string value for a given key.
+// if err != nil return defaultval
+func (c *JSONConfigContainer) DefaultString(key string, defaultval string) string {
+ // TODO FIXME should not use "" to replace non existence
+ if v := c.String(key); v != "" {
+ return v
+ }
+ return defaultval
+}
+
+// Strings returns the []string value for a given key.
+func (c *JSONConfigContainer) Strings(key string) []string {
+ stringVal := c.String(key)
+ if stringVal == "" {
+ return nil
+ }
+ return strings.Split(c.String(key), ";")
+}
+
+// DefaultStrings returns the []string value for a given key.
+// if err != nil return defaultval
+func (c *JSONConfigContainer) DefaultStrings(key string, defaultval []string) []string {
+ if v := c.Strings(key); v != nil {
+ return v
+ }
+ return defaultval
+}
+
+// GetSection returns map for the given section
+func (c *JSONConfigContainer) GetSection(section string) (map[string]string, error) {
+ if v, ok := c.data[section]; ok {
+ return v.(map[string]string), nil
+ }
+ return nil, errors.New("nonexist section " + section)
+}
+
+// SaveConfigFile save the config into file
+func (c *JSONConfigContainer) SaveConfigFile(filename string) (err error) {
+ // Write configuration file by filename.
+ f, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ b, err := json.MarshalIndent(c.data, "", " ")
+ if err != nil {
+ return err
+ }
+ _, err = f.Write(b)
+ return err
+}
+
+// Set writes a new value for key.
+func (c *JSONConfigContainer) Set(key, val string) error {
+ c.Lock()
+ defer c.Unlock()
+ c.data[key] = val
+ return nil
+}
+
+// DIY returns the raw value by a given key.
+func (c *JSONConfigContainer) DIY(key string) (v interface{}, err error) {
+ val := c.getData(key)
+ if val != nil {
+ return val, nil
+ }
+ return nil, errors.New("not exist key")
+}
+
+// section.key or key
+func (c *JSONConfigContainer) getData(key string) interface{} {
+ if len(key) == 0 {
+ return nil
+ }
+
+ c.RLock()
+ defer c.RUnlock()
+
+ sectionKeys := strings.Split(key, "::")
+ if len(sectionKeys) >= 2 {
+ curValue, ok := c.data[sectionKeys[0]]
+ if !ok {
+ return nil
+ }
+ for _, key := range sectionKeys[1:] {
+ if v, ok := curValue.(map[string]interface{}); ok {
+ if curValue, ok = v[key]; !ok {
+ return nil
+ }
+ }
+ }
+ return curValue
+ }
+ if v, ok := c.data[key]; ok {
+ return v
+ }
+ return nil
+}
+
+func init() {
+ Register("json", &JSONConfig{})
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/acceptencoder.go b/at-admin/vendor/github.com/astaxie/beego/context/acceptencoder.go
new file mode 100644
index 0000000..b4e2492
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/acceptencoder.go
@@ -0,0 +1,232 @@
+// Copyright 2015 beego Author. All Rights Reserved.
+//
+// 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.
+
+package context
+
+import (
+ "bytes"
+ "compress/flate"
+ "compress/gzip"
+ "compress/zlib"
+ "io"
+ "net/http"
+ "os"
+ "strconv"
+ "strings"
+ "sync"
+)
+
+var (
+ //Default size==20B same as nginx
+ defaultGzipMinLength = 20
+ //Content will only be compressed if content length is either unknown or greater than gzipMinLength.
+ gzipMinLength = defaultGzipMinLength
+ //The compression level used for deflate compression. (0-9).
+ gzipCompressLevel int
+ //List of HTTP methods to compress. If not set, only GET requests are compressed.
+ includedMethods map[string]bool
+ getMethodOnly bool
+)
+
+// InitGzip init the gzipcompress
+func InitGzip(minLength, compressLevel int, methods []string) {
+ if minLength >= 0 {
+ gzipMinLength = minLength
+ }
+ gzipCompressLevel = compressLevel
+ if gzipCompressLevel < flate.NoCompression || gzipCompressLevel > flate.BestCompression {
+ gzipCompressLevel = flate.BestSpeed
+ }
+ getMethodOnly = (len(methods) == 0) || (len(methods) == 1 && strings.ToUpper(methods[0]) == "GET")
+ includedMethods = make(map[string]bool, len(methods))
+ for _, v := range methods {
+ includedMethods[strings.ToUpper(v)] = true
+ }
+}
+
+type resetWriter interface {
+ io.Writer
+ Reset(w io.Writer)
+}
+
+type nopResetWriter struct {
+ io.Writer
+}
+
+func (n nopResetWriter) Reset(w io.Writer) {
+ //do nothing
+}
+
+type acceptEncoder struct {
+ name string
+ levelEncode func(int) resetWriter
+ customCompressLevelPool *sync.Pool
+ bestCompressionPool *sync.Pool
+}
+
+func (ac acceptEncoder) encode(wr io.Writer, level int) resetWriter {
+ if ac.customCompressLevelPool == nil || ac.bestCompressionPool == nil {
+ return nopResetWriter{wr}
+ }
+ var rwr resetWriter
+ switch level {
+ case flate.BestSpeed:
+ rwr = ac.customCompressLevelPool.Get().(resetWriter)
+ case flate.BestCompression:
+ rwr = ac.bestCompressionPool.Get().(resetWriter)
+ default:
+ rwr = ac.levelEncode(level)
+ }
+ rwr.Reset(wr)
+ return rwr
+}
+
+func (ac acceptEncoder) put(wr resetWriter, level int) {
+ if ac.customCompressLevelPool == nil || ac.bestCompressionPool == nil {
+ return
+ }
+ wr.Reset(nil)
+
+ //notice
+ //compressionLevel==BestCompression DOES NOT MATTER
+ //sync.Pool will not memory leak
+
+ switch level {
+ case gzipCompressLevel:
+ ac.customCompressLevelPool.Put(wr)
+ case flate.BestCompression:
+ ac.bestCompressionPool.Put(wr)
+ }
+}
+
+var (
+ noneCompressEncoder = acceptEncoder{"", nil, nil, nil}
+ gzipCompressEncoder = acceptEncoder{
+ name: "gzip",
+ levelEncode: func(level int) resetWriter { wr, _ := gzip.NewWriterLevel(nil, level); return wr },
+ customCompressLevelPool: &sync.Pool{New: func() interface{} { wr, _ := gzip.NewWriterLevel(nil, gzipCompressLevel); return wr }},
+ bestCompressionPool: &sync.Pool{New: func() interface{} { wr, _ := gzip.NewWriterLevel(nil, flate.BestCompression); return wr }},
+ }
+
+ //according to the sec :http://tools.ietf.org/html/rfc2616#section-3.5 ,the deflate compress in http is zlib indeed
+ //deflate
+ //The "zlib" format defined in RFC 1950 [31] in combination with
+ //the "deflate" compression mechanism described in RFC 1951 [29].
+ deflateCompressEncoder = acceptEncoder{
+ name: "deflate",
+ levelEncode: func(level int) resetWriter { wr, _ := zlib.NewWriterLevel(nil, level); return wr },
+ customCompressLevelPool: &sync.Pool{New: func() interface{} { wr, _ := zlib.NewWriterLevel(nil, gzipCompressLevel); return wr }},
+ bestCompressionPool: &sync.Pool{New: func() interface{} { wr, _ := zlib.NewWriterLevel(nil, flate.BestCompression); return wr }},
+ }
+)
+
+var (
+ encoderMap = map[string]acceptEncoder{ // all the other compress methods will ignore
+ "gzip": gzipCompressEncoder,
+ "deflate": deflateCompressEncoder,
+ "*": gzipCompressEncoder, // * means any compress will accept,we prefer gzip
+ "identity": noneCompressEncoder, // identity means none-compress
+ }
+)
+
+// WriteFile reads from file and writes to writer by the specific encoding(gzip/deflate)
+func WriteFile(encoding string, writer io.Writer, file *os.File) (bool, string, error) {
+ return writeLevel(encoding, writer, file, flate.BestCompression)
+}
+
+// WriteBody reads writes content to writer by the specific encoding(gzip/deflate)
+func WriteBody(encoding string, writer io.Writer, content []byte) (bool, string, error) {
+ if encoding == "" || len(content) < gzipMinLength {
+ _, err := writer.Write(content)
+ return false, "", err
+ }
+ return writeLevel(encoding, writer, bytes.NewReader(content), gzipCompressLevel)
+}
+
+// writeLevel reads from reader,writes to writer by specific encoding and compress level
+// the compress level is defined by deflate package
+func writeLevel(encoding string, writer io.Writer, reader io.Reader, level int) (bool, string, error) {
+ var outputWriter resetWriter
+ var err error
+ var ce = noneCompressEncoder
+
+ if cf, ok := encoderMap[encoding]; ok {
+ ce = cf
+ }
+ encoding = ce.name
+ outputWriter = ce.encode(writer, level)
+ defer ce.put(outputWriter, level)
+
+ _, err = io.Copy(outputWriter, reader)
+ if err != nil {
+ return false, "", err
+ }
+
+ switch outputWriter.(type) {
+ case io.WriteCloser:
+ outputWriter.(io.WriteCloser).Close()
+ }
+ return encoding != "", encoding, nil
+}
+
+// ParseEncoding will extract the right encoding for response
+// the Accept-Encoding's sec is here:
+// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
+func ParseEncoding(r *http.Request) string {
+ if r == nil {
+ return ""
+ }
+ if (getMethodOnly && r.Method == "GET") || includedMethods[r.Method] {
+ return parseEncoding(r)
+ }
+ return ""
+}
+
+type q struct {
+ name string
+ value float64
+}
+
+func parseEncoding(r *http.Request) string {
+ acceptEncoding := r.Header.Get("Accept-Encoding")
+ if acceptEncoding == "" {
+ return ""
+ }
+ var lastQ q
+ for _, v := range strings.Split(acceptEncoding, ",") {
+ v = strings.TrimSpace(v)
+ if v == "" {
+ continue
+ }
+ vs := strings.Split(v, ";")
+ var cf acceptEncoder
+ var ok bool
+ if cf, ok = encoderMap[vs[0]]; !ok {
+ continue
+ }
+ if len(vs) == 1 {
+ return cf.name
+ }
+ if len(vs) == 2 {
+ f, _ := strconv.ParseFloat(strings.Replace(vs[1], "q=", "", -1), 64)
+ if f == 0 {
+ continue
+ }
+ if f > lastQ.value {
+ lastQ = q{cf.name, f}
+ }
+ }
+ }
+ return lastQ.name
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/context.go b/at-admin/vendor/github.com/astaxie/beego/context/context.go
new file mode 100644
index 0000000..bbd5829
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/context.go
@@ -0,0 +1,263 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+// Package context provide the context utils
+// Usage:
+//
+// import "github.com/astaxie/beego/context"
+//
+// ctx := context.Context{Request:req,ResponseWriter:rw}
+//
+// more docs http://beego.me/docs/module/context.md
+package context
+
+import (
+ "bufio"
+ "crypto/hmac"
+ "crypto/sha1"
+ "encoding/base64"
+ "errors"
+ "fmt"
+ "net"
+ "net/http"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/astaxie/beego/utils"
+)
+
+//commonly used mime-types
+const (
+ ApplicationJSON = "application/json"
+ ApplicationXML = "application/xml"
+ ApplicationYAML = "application/x-yaml"
+ TextXML = "text/xml"
+)
+
+// NewContext return the Context with Input and Output
+func NewContext() *Context {
+ return &Context{
+ Input: NewInput(),
+ Output: NewOutput(),
+ }
+}
+
+// Context Http request context struct including BeegoInput, BeegoOutput, http.Request and http.ResponseWriter.
+// BeegoInput and BeegoOutput provides some api to operate request and response more easily.
+type Context struct {
+ Input *BeegoInput
+ Output *BeegoOutput
+ Request *http.Request
+ ResponseWriter *Response
+ _xsrfToken string
+}
+
+// Reset init Context, BeegoInput and BeegoOutput
+func (ctx *Context) Reset(rw http.ResponseWriter, r *http.Request) {
+ ctx.Request = r
+ if ctx.ResponseWriter == nil {
+ ctx.ResponseWriter = &Response{}
+ }
+ ctx.ResponseWriter.reset(rw)
+ ctx.Input.Reset(ctx)
+ ctx.Output.Reset(ctx)
+ ctx._xsrfToken = ""
+}
+
+// Redirect does redirection to localurl with http header status code.
+func (ctx *Context) Redirect(status int, localurl string) {
+ http.Redirect(ctx.ResponseWriter, ctx.Request, localurl, status)
+}
+
+// Abort stops this request.
+// if beego.ErrorMaps exists, panic body.
+func (ctx *Context) Abort(status int, body string) {
+ ctx.Output.SetStatus(status)
+ panic(body)
+}
+
+// WriteString Write string to response body.
+// it sends response body.
+func (ctx *Context) WriteString(content string) {
+ ctx.ResponseWriter.Write([]byte(content))
+}
+
+// GetCookie Get cookie from request by a given key.
+// It's alias of BeegoInput.Cookie.
+func (ctx *Context) GetCookie(key string) string {
+ return ctx.Input.Cookie(key)
+}
+
+// SetCookie Set cookie for response.
+// It's alias of BeegoOutput.Cookie.
+func (ctx *Context) SetCookie(name string, value string, others ...interface{}) {
+ ctx.Output.Cookie(name, value, others...)
+}
+
+// GetSecureCookie Get secure cookie from request by a given key.
+func (ctx *Context) GetSecureCookie(Secret, key string) (string, bool) {
+ val := ctx.Input.Cookie(key)
+ if val == "" {
+ return "", false
+ }
+
+ parts := strings.SplitN(val, "|", 3)
+
+ if len(parts) != 3 {
+ return "", false
+ }
+
+ vs := parts[0]
+ timestamp := parts[1]
+ sig := parts[2]
+
+ h := hmac.New(sha1.New, []byte(Secret))
+ fmt.Fprintf(h, "%s%s", vs, timestamp)
+
+ if fmt.Sprintf("%02x", h.Sum(nil)) != sig {
+ return "", false
+ }
+ res, _ := base64.URLEncoding.DecodeString(vs)
+ return string(res), true
+}
+
+// SetSecureCookie Set Secure cookie for response.
+func (ctx *Context) SetSecureCookie(Secret, name, value string, others ...interface{}) {
+ vs := base64.URLEncoding.EncodeToString([]byte(value))
+ timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+ h := hmac.New(sha1.New, []byte(Secret))
+ fmt.Fprintf(h, "%s%s", vs, timestamp)
+ sig := fmt.Sprintf("%02x", h.Sum(nil))
+ cookie := strings.Join([]string{vs, timestamp, sig}, "|")
+ ctx.Output.Cookie(name, cookie, others...)
+}
+
+// XSRFToken creates a xsrf token string and returns.
+func (ctx *Context) XSRFToken(key string, expire int64) string {
+ if ctx._xsrfToken == "" {
+ token, ok := ctx.GetSecureCookie(key, "_xsrf")
+ if !ok {
+ token = string(utils.RandomCreateBytes(32))
+ ctx.SetSecureCookie(key, "_xsrf", token, expire)
+ }
+ ctx._xsrfToken = token
+ }
+ return ctx._xsrfToken
+}
+
+// CheckXSRFCookie checks xsrf token in this request is valid or not.
+// the token can provided in request header "X-Xsrftoken" and "X-CsrfToken"
+// or in form field value named as "_xsrf".
+func (ctx *Context) CheckXSRFCookie() bool {
+ token := ctx.Input.Query("_xsrf")
+ if token == "" {
+ token = ctx.Request.Header.Get("X-Xsrftoken")
+ }
+ if token == "" {
+ token = ctx.Request.Header.Get("X-Csrftoken")
+ }
+ if token == "" {
+ ctx.Abort(403, "'_xsrf' argument missing from POST")
+ return false
+ }
+ if ctx._xsrfToken != token {
+ ctx.Abort(403, "XSRF cookie does not match POST argument")
+ return false
+ }
+ return true
+}
+
+// RenderMethodResult renders the return value of a controller method to the output
+func (ctx *Context) RenderMethodResult(result interface{}) {
+ if result != nil {
+ renderer, ok := result.(Renderer)
+ if !ok {
+ err, ok := result.(error)
+ if ok {
+ renderer = errorRenderer(err)
+ } else {
+ renderer = jsonRenderer(result)
+ }
+ }
+ renderer.Render(ctx)
+ }
+}
+
+//Response is a wrapper for the http.ResponseWriter
+//started set to true if response was written to then don't execute other handler
+type Response struct {
+ http.ResponseWriter
+ Started bool
+ Status int
+ Elapsed time.Duration
+}
+
+func (r *Response) reset(rw http.ResponseWriter) {
+ r.ResponseWriter = rw
+ r.Status = 0
+ r.Started = false
+}
+
+// Write writes the data to the connection as part of an HTTP reply,
+// and sets `started` to true.
+// started means the response has sent out.
+func (r *Response) Write(p []byte) (int, error) {
+ r.Started = true
+ return r.ResponseWriter.Write(p)
+}
+
+// WriteHeader sends an HTTP response header with status code,
+// and sets `started` to true.
+func (r *Response) WriteHeader(code int) {
+ if r.Status > 0 {
+ //prevent multiple response.WriteHeader calls
+ return
+ }
+ r.Status = code
+ r.Started = true
+ r.ResponseWriter.WriteHeader(code)
+}
+
+// Hijack hijacker for http
+func (r *Response) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+ hj, ok := r.ResponseWriter.(http.Hijacker)
+ if !ok {
+ return nil, nil, errors.New("webserver doesn't support hijacking")
+ }
+ return hj.Hijack()
+}
+
+// Flush http.Flusher
+func (r *Response) Flush() {
+ if f, ok := r.ResponseWriter.(http.Flusher); ok {
+ f.Flush()
+ }
+}
+
+// CloseNotify http.CloseNotifier
+func (r *Response) CloseNotify() <-chan bool {
+ if cn, ok := r.ResponseWriter.(http.CloseNotifier); ok {
+ return cn.CloseNotify()
+ }
+ return nil
+}
+
+// Pusher http.Pusher
+func (r *Response) Pusher() (pusher http.Pusher) {
+ if pusher, ok := r.ResponseWriter.(http.Pusher); ok {
+ return pusher
+ }
+ return nil
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/input.go b/at-admin/vendor/github.com/astaxie/beego/context/input.go
new file mode 100644
index 0000000..7604061
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/input.go
@@ -0,0 +1,676 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package context
+
+import (
+ "bytes"
+ "compress/gzip"
+ "errors"
+ "io"
+ "io/ioutil"
+ "net"
+ "net/http"
+ "net/url"
+ "reflect"
+ "regexp"
+ "strconv"
+ "strings"
+ "sync"
+
+ "github.com/astaxie/beego/session"
+)
+
+// Regexes for checking the accept headers
+// TODO make sure these are correct
+var (
+ acceptsHTMLRegex = regexp.MustCompile(`(text/html|application/xhtml\+xml)(?:,|$)`)
+ acceptsXMLRegex = regexp.MustCompile(`(application/xml|text/xml)(?:,|$)`)
+ acceptsJSONRegex = regexp.MustCompile(`(application/json)(?:,|$)`)
+ acceptsYAMLRegex = regexp.MustCompile(`(application/x-yaml)(?:,|$)`)
+ maxParam = 50
+)
+
+// BeegoInput operates the http request header, data, cookie and body.
+// it also contains router params and current session.
+type BeegoInput struct {
+ Context *Context
+ CruSession session.Store
+ pnames []string
+ pvalues []string
+ data map[interface{}]interface{} // store some values in this context when calling context in filter or controller.
+ dataLock sync.RWMutex
+ RequestBody []byte
+ RunMethod string
+ RunController reflect.Type
+}
+
+// NewInput return BeegoInput generated by Context.
+func NewInput() *BeegoInput {
+ return &BeegoInput{
+ pnames: make([]string, 0, maxParam),
+ pvalues: make([]string, 0, maxParam),
+ data: make(map[interface{}]interface{}),
+ }
+}
+
+// Reset init the BeegoInput
+func (input *BeegoInput) Reset(ctx *Context) {
+ input.Context = ctx
+ input.CruSession = nil
+ input.pnames = input.pnames[:0]
+ input.pvalues = input.pvalues[:0]
+ input.data = nil
+ input.RequestBody = []byte{}
+}
+
+// Protocol returns request protocol name, such as HTTP/1.1 .
+func (input *BeegoInput) Protocol() string {
+ return input.Context.Request.Proto
+}
+
+// URI returns full request url with query string, fragment.
+func (input *BeegoInput) URI() string {
+ return input.Context.Request.RequestURI
+}
+
+// URL returns request url path (without query string, fragment).
+func (input *BeegoInput) URL() string {
+ return input.Context.Request.URL.Path
+}
+
+// Site returns base site url as scheme://domain type.
+func (input *BeegoInput) Site() string {
+ return input.Scheme() + "://" + input.Domain()
+}
+
+// Scheme returns request scheme as "http" or "https".
+func (input *BeegoInput) Scheme() string {
+ if scheme := input.Header("X-Forwarded-Proto"); scheme != "" {
+ return scheme
+ }
+ if input.Context.Request.URL.Scheme != "" {
+ return input.Context.Request.URL.Scheme
+ }
+ if input.Context.Request.TLS == nil {
+ return "http"
+ }
+ return "https"
+}
+
+// Domain returns host name.
+// Alias of Host method.
+func (input *BeegoInput) Domain() string {
+ return input.Host()
+}
+
+// Host returns host name.
+// if no host info in request, return localhost.
+func (input *BeegoInput) Host() string {
+ if input.Context.Request.Host != "" {
+ if hostPart, _, err := net.SplitHostPort(input.Context.Request.Host); err == nil {
+ return hostPart
+ }
+ return input.Context.Request.Host
+ }
+ return "localhost"
+}
+
+// Method returns http request method.
+func (input *BeegoInput) Method() string {
+ return input.Context.Request.Method
+}
+
+// Is returns boolean of this request is on given method, such as Is("POST").
+func (input *BeegoInput) Is(method string) bool {
+ return input.Method() == method
+}
+
+// IsGet Is this a GET method request?
+func (input *BeegoInput) IsGet() bool {
+ return input.Is("GET")
+}
+
+// IsPost Is this a POST method request?
+func (input *BeegoInput) IsPost() bool {
+ return input.Is("POST")
+}
+
+// IsHead Is this a Head method request?
+func (input *BeegoInput) IsHead() bool {
+ return input.Is("HEAD")
+}
+
+// IsOptions Is this a OPTIONS method request?
+func (input *BeegoInput) IsOptions() bool {
+ return input.Is("OPTIONS")
+}
+
+// IsPut Is this a PUT method request?
+func (input *BeegoInput) IsPut() bool {
+ return input.Is("PUT")
+}
+
+// IsDelete Is this a DELETE method request?
+func (input *BeegoInput) IsDelete() bool {
+ return input.Is("DELETE")
+}
+
+// IsPatch Is this a PATCH method request?
+func (input *BeegoInput) IsPatch() bool {
+ return input.Is("PATCH")
+}
+
+// IsAjax returns boolean of this request is generated by ajax.
+func (input *BeegoInput) IsAjax() bool {
+ return input.Header("X-Requested-With") == "XMLHttpRequest"
+}
+
+// IsSecure returns boolean of this request is in https.
+func (input *BeegoInput) IsSecure() bool {
+ return input.Scheme() == "https"
+}
+
+// IsWebsocket returns boolean of this request is in webSocket.
+func (input *BeegoInput) IsWebsocket() bool {
+ return input.Header("Upgrade") == "websocket"
+}
+
+// IsUpload returns boolean of whether file uploads in this request or not..
+func (input *BeegoInput) IsUpload() bool {
+ return strings.Contains(input.Header("Content-Type"), "multipart/form-data")
+}
+
+// AcceptsHTML Checks if request accepts html response
+func (input *BeegoInput) AcceptsHTML() bool {
+ return acceptsHTMLRegex.MatchString(input.Header("Accept"))
+}
+
+// AcceptsXML Checks if request accepts xml response
+func (input *BeegoInput) AcceptsXML() bool {
+ return acceptsXMLRegex.MatchString(input.Header("Accept"))
+}
+
+// AcceptsJSON Checks if request accepts json response
+func (input *BeegoInput) AcceptsJSON() bool {
+ return acceptsJSONRegex.MatchString(input.Header("Accept"))
+}
+
+// AcceptsYAML Checks if request accepts json response
+func (input *BeegoInput) AcceptsYAML() bool {
+ return acceptsYAMLRegex.MatchString(input.Header("Accept"))
+}
+
+// IP returns request client ip.
+// if in proxy, return first proxy id.
+// if error, return RemoteAddr.
+func (input *BeegoInput) IP() string {
+ ips := input.Proxy()
+ if len(ips) > 0 && ips[0] != "" {
+ rip, _, err := net.SplitHostPort(ips[0])
+ if err != nil {
+ rip = ips[0]
+ }
+ return rip
+ }
+ if ip, _, err := net.SplitHostPort(input.Context.Request.RemoteAddr); err == nil {
+ return ip
+ }
+ return input.Context.Request.RemoteAddr
+}
+
+// Proxy returns proxy client ips slice.
+func (input *BeegoInput) Proxy() []string {
+ if ips := input.Header("X-Forwarded-For"); ips != "" {
+ return strings.Split(ips, ",")
+ }
+ return []string{}
+}
+
+// Referer returns http referer header.
+func (input *BeegoInput) Referer() string {
+ return input.Header("Referer")
+}
+
+// Refer returns http referer header.
+func (input *BeegoInput) Refer() string {
+ return input.Referer()
+}
+
+// SubDomains returns sub domain string.
+// if aa.bb.domain.com, returns aa.bb .
+func (input *BeegoInput) SubDomains() string {
+ parts := strings.Split(input.Host(), ".")
+ if len(parts) >= 3 {
+ return strings.Join(parts[:len(parts)-2], ".")
+ }
+ return ""
+}
+
+// Port returns request client port.
+// when error or empty, return 80.
+func (input *BeegoInput) Port() int {
+ if _, portPart, err := net.SplitHostPort(input.Context.Request.Host); err == nil {
+ port, _ := strconv.Atoi(portPart)
+ return port
+ }
+ return 80
+}
+
+// UserAgent returns request client user agent string.
+func (input *BeegoInput) UserAgent() string {
+ return input.Header("User-Agent")
+}
+
+// ParamsLen return the length of the params
+func (input *BeegoInput) ParamsLen() int {
+ return len(input.pnames)
+}
+
+// Param returns router param by a given key.
+func (input *BeegoInput) Param(key string) string {
+ for i, v := range input.pnames {
+ if v == key && i <= len(input.pvalues) {
+ return input.pvalues[i]
+ }
+ }
+ return ""
+}
+
+// Params returns the map[key]value.
+func (input *BeegoInput) Params() map[string]string {
+ m := make(map[string]string)
+ for i, v := range input.pnames {
+ if i <= len(input.pvalues) {
+ m[v] = input.pvalues[i]
+ }
+ }
+ return m
+}
+
+// SetParam will set the param with key and value
+func (input *BeegoInput) SetParam(key, val string) {
+ // check if already exists
+ for i, v := range input.pnames {
+ if v == key && i <= len(input.pvalues) {
+ input.pvalues[i] = val
+ return
+ }
+ }
+ input.pvalues = append(input.pvalues, val)
+ input.pnames = append(input.pnames, key)
+}
+
+// ResetParams clears any of the input's Params
+// This function is used to clear parameters so they may be reset between filter
+// passes.
+func (input *BeegoInput) ResetParams() {
+ input.pnames = input.pnames[:0]
+ input.pvalues = input.pvalues[:0]
+}
+
+// Query returns input data item string by a given string.
+func (input *BeegoInput) Query(key string) string {
+ if val := input.Param(key); val != "" {
+ return val
+ }
+ if input.Context.Request.Form == nil {
+ input.Context.Request.ParseForm()
+ }
+ return input.Context.Request.Form.Get(key)
+}
+
+// Header returns request header item string by a given string.
+// if non-existed, return empty string.
+func (input *BeegoInput) Header(key string) string {
+ return input.Context.Request.Header.Get(key)
+}
+
+// Cookie returns request cookie item string by a given key.
+// if non-existed, return empty string.
+func (input *BeegoInput) Cookie(key string) string {
+ ck, err := input.Context.Request.Cookie(key)
+ if err != nil {
+ return ""
+ }
+ return ck.Value
+}
+
+// Session returns current session item value by a given key.
+// if non-existed, return nil.
+func (input *BeegoInput) Session(key interface{}) interface{} {
+ return input.CruSession.Get(key)
+}
+
+// CopyBody returns the raw request body data as bytes.
+func (input *BeegoInput) CopyBody(MaxMemory int64) []byte {
+ if input.Context.Request.Body == nil {
+ return []byte{}
+ }
+
+ var requestbody []byte
+ safe := &io.LimitedReader{R: input.Context.Request.Body, N: MaxMemory}
+ if input.Header("Content-Encoding") == "gzip" {
+ reader, err := gzip.NewReader(safe)
+ if err != nil {
+ return nil
+ }
+ requestbody, _ = ioutil.ReadAll(reader)
+ } else {
+ requestbody, _ = ioutil.ReadAll(safe)
+ }
+
+ input.Context.Request.Body.Close()
+ bf := bytes.NewBuffer(requestbody)
+ input.Context.Request.Body = http.MaxBytesReader(input.Context.ResponseWriter, ioutil.NopCloser(bf), MaxMemory)
+ input.RequestBody = requestbody
+ return requestbody
+}
+
+// Data return the implicit data in the input
+func (input *BeegoInput) Data() map[interface{}]interface{} {
+ input.dataLock.Lock()
+ defer input.dataLock.Unlock()
+ if input.data == nil {
+ input.data = make(map[interface{}]interface{})
+ }
+ return input.data
+}
+
+// GetData returns the stored data in this context.
+func (input *BeegoInput) GetData(key interface{}) interface{} {
+ input.dataLock.Lock()
+ defer input.dataLock.Unlock()
+ if v, ok := input.data[key]; ok {
+ return v
+ }
+ return nil
+}
+
+// SetData stores data with given key in this context.
+// This data are only available in this context.
+func (input *BeegoInput) SetData(key, val interface{}) {
+ input.dataLock.Lock()
+ defer input.dataLock.Unlock()
+ if input.data == nil {
+ input.data = make(map[interface{}]interface{})
+ }
+ input.data[key] = val
+}
+
+// ParseFormOrMulitForm parseForm or parseMultiForm based on Content-type
+func (input *BeegoInput) ParseFormOrMulitForm(maxMemory int64) error {
+ // Parse the body depending on the content type.
+ if strings.Contains(input.Header("Content-Type"), "multipart/form-data") {
+ if err := input.Context.Request.ParseMultipartForm(maxMemory); err != nil {
+ return errors.New("Error parsing request body:" + err.Error())
+ }
+ } else if err := input.Context.Request.ParseForm(); err != nil {
+ return errors.New("Error parsing request body:" + err.Error())
+ }
+ return nil
+}
+
+// Bind data from request.Form[key] to dest
+// like /?id=123&isok=true&ft=1.2&ol[0]=1&ol[1]=2&ul[]=str&ul[]=array&user.Name=astaxie
+// var id int beegoInput.Bind(&id, "id") id ==123
+// var isok bool beegoInput.Bind(&isok, "isok") isok ==true
+// var ft float64 beegoInput.Bind(&ft, "ft") ft ==1.2
+// ol := make([]int, 0, 2) beegoInput.Bind(&ol, "ol") ol ==[1 2]
+// ul := make([]string, 0, 2) beegoInput.Bind(&ul, "ul") ul ==[str array]
+// user struct{Name} beegoInput.Bind(&user, "user") user == {Name:"astaxie"}
+func (input *BeegoInput) Bind(dest interface{}, key string) error {
+ value := reflect.ValueOf(dest)
+ if value.Kind() != reflect.Ptr {
+ return errors.New("beego: non-pointer passed to Bind: " + key)
+ }
+ value = value.Elem()
+ if !value.CanSet() {
+ return errors.New("beego: non-settable variable passed to Bind: " + key)
+ }
+ typ := value.Type()
+ // Get real type if dest define with interface{}.
+ // e.g var dest interface{} dest=1.0
+ if value.Kind() == reflect.Interface {
+ typ = value.Elem().Type()
+ }
+ rv := input.bind(key, typ)
+ if !rv.IsValid() {
+ return errors.New("beego: reflect value is empty")
+ }
+ value.Set(rv)
+ return nil
+}
+
+func (input *BeegoInput) bind(key string, typ reflect.Type) reflect.Value {
+ if input.Context.Request.Form == nil {
+ input.Context.Request.ParseForm()
+ }
+ rv := reflect.Zero(typ)
+ switch typ.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ val := input.Query(key)
+ if len(val) == 0 {
+ return rv
+ }
+ rv = input.bindInt(val, typ)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ val := input.Query(key)
+ if len(val) == 0 {
+ return rv
+ }
+ rv = input.bindUint(val, typ)
+ case reflect.Float32, reflect.Float64:
+ val := input.Query(key)
+ if len(val) == 0 {
+ return rv
+ }
+ rv = input.bindFloat(val, typ)
+ case reflect.String:
+ val := input.Query(key)
+ if len(val) == 0 {
+ return rv
+ }
+ rv = input.bindString(val, typ)
+ case reflect.Bool:
+ val := input.Query(key)
+ if len(val) == 0 {
+ return rv
+ }
+ rv = input.bindBool(val, typ)
+ case reflect.Slice:
+ rv = input.bindSlice(&input.Context.Request.Form, key, typ)
+ case reflect.Struct:
+ rv = input.bindStruct(&input.Context.Request.Form, key, typ)
+ case reflect.Ptr:
+ rv = input.bindPoint(key, typ)
+ case reflect.Map:
+ rv = input.bindMap(&input.Context.Request.Form, key, typ)
+ }
+ return rv
+}
+
+func (input *BeegoInput) bindValue(val string, typ reflect.Type) reflect.Value {
+ rv := reflect.Zero(typ)
+ switch typ.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ rv = input.bindInt(val, typ)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ rv = input.bindUint(val, typ)
+ case reflect.Float32, reflect.Float64:
+ rv = input.bindFloat(val, typ)
+ case reflect.String:
+ rv = input.bindString(val, typ)
+ case reflect.Bool:
+ rv = input.bindBool(val, typ)
+ case reflect.Slice:
+ rv = input.bindSlice(&url.Values{"": {val}}, "", typ)
+ case reflect.Struct:
+ rv = input.bindStruct(&url.Values{"": {val}}, "", typ)
+ case reflect.Ptr:
+ rv = input.bindPoint(val, typ)
+ case reflect.Map:
+ rv = input.bindMap(&url.Values{"": {val}}, "", typ)
+ }
+ return rv
+}
+
+func (input *BeegoInput) bindInt(val string, typ reflect.Type) reflect.Value {
+ intValue, err := strconv.ParseInt(val, 10, 64)
+ if err != nil {
+ return reflect.Zero(typ)
+ }
+ pValue := reflect.New(typ)
+ pValue.Elem().SetInt(intValue)
+ return pValue.Elem()
+}
+
+func (input *BeegoInput) bindUint(val string, typ reflect.Type) reflect.Value {
+ uintValue, err := strconv.ParseUint(val, 10, 64)
+ if err != nil {
+ return reflect.Zero(typ)
+ }
+ pValue := reflect.New(typ)
+ pValue.Elem().SetUint(uintValue)
+ return pValue.Elem()
+}
+
+func (input *BeegoInput) bindFloat(val string, typ reflect.Type) reflect.Value {
+ floatValue, err := strconv.ParseFloat(val, 64)
+ if err != nil {
+ return reflect.Zero(typ)
+ }
+ pValue := reflect.New(typ)
+ pValue.Elem().SetFloat(floatValue)
+ return pValue.Elem()
+}
+
+func (input *BeegoInput) bindString(val string, typ reflect.Type) reflect.Value {
+ return reflect.ValueOf(val)
+}
+
+func (input *BeegoInput) bindBool(val string, typ reflect.Type) reflect.Value {
+ val = strings.TrimSpace(strings.ToLower(val))
+ switch val {
+ case "true", "on", "1":
+ return reflect.ValueOf(true)
+ }
+ return reflect.ValueOf(false)
+}
+
+type sliceValue struct {
+ index int // Index extracted from brackets. If -1, no index was provided.
+ value reflect.Value // the bound value for this slice element.
+}
+
+func (input *BeegoInput) bindSlice(params *url.Values, key string, typ reflect.Type) reflect.Value {
+ maxIndex := -1
+ numNoIndex := 0
+ sliceValues := []sliceValue{}
+ for reqKey, vals := range *params {
+ if !strings.HasPrefix(reqKey, key+"[") {
+ continue
+ }
+ // Extract the index, and the index where a sub-key starts. (e.g. field[0].subkey)
+ index := -1
+ leftBracket, rightBracket := len(key), strings.Index(reqKey[len(key):], "]")+len(key)
+ if rightBracket > leftBracket+1 {
+ index, _ = strconv.Atoi(reqKey[leftBracket+1 : rightBracket])
+ }
+ subKeyIndex := rightBracket + 1
+
+ // Handle the indexed case.
+ if index > -1 {
+ if index > maxIndex {
+ maxIndex = index
+ }
+ sliceValues = append(sliceValues, sliceValue{
+ index: index,
+ value: input.bind(reqKey[:subKeyIndex], typ.Elem()),
+ })
+ continue
+ }
+
+ // It's an un-indexed element. (e.g. element[])
+ numNoIndex += len(vals)
+ for _, val := range vals {
+ // Unindexed values can only be direct-bound.
+ sliceValues = append(sliceValues, sliceValue{
+ index: -1,
+ value: input.bindValue(val, typ.Elem()),
+ })
+ }
+ }
+ resultArray := reflect.MakeSlice(typ, maxIndex+1, maxIndex+1+numNoIndex)
+ for _, sv := range sliceValues {
+ if sv.index != -1 {
+ resultArray.Index(sv.index).Set(sv.value)
+ } else {
+ resultArray = reflect.Append(resultArray, sv.value)
+ }
+ }
+ return resultArray
+}
+
+func (input *BeegoInput) bindStruct(params *url.Values, key string, typ reflect.Type) reflect.Value {
+ result := reflect.New(typ).Elem()
+ fieldValues := make(map[string]reflect.Value)
+ for reqKey, val := range *params {
+ var fieldName string
+ if strings.HasPrefix(reqKey, key+".") {
+ fieldName = reqKey[len(key)+1:]
+ } else if strings.HasPrefix(reqKey, key+"[") && reqKey[len(reqKey)-1] == ']' {
+ fieldName = reqKey[len(key)+1 : len(reqKey)-1]
+ } else {
+ continue
+ }
+
+ if _, ok := fieldValues[fieldName]; !ok {
+ // Time to bind this field. Get it and make sure we can set it.
+ fieldValue := result.FieldByName(fieldName)
+ if !fieldValue.IsValid() {
+ continue
+ }
+ if !fieldValue.CanSet() {
+ continue
+ }
+ boundVal := input.bindValue(val[0], fieldValue.Type())
+ fieldValue.Set(boundVal)
+ fieldValues[fieldName] = boundVal
+ }
+ }
+
+ return result
+}
+
+func (input *BeegoInput) bindPoint(key string, typ reflect.Type) reflect.Value {
+ return input.bind(key, typ.Elem()).Addr()
+}
+
+func (input *BeegoInput) bindMap(params *url.Values, key string, typ reflect.Type) reflect.Value {
+ var (
+ result = reflect.MakeMap(typ)
+ keyType = typ.Key()
+ valueType = typ.Elem()
+ )
+ for paramName, values := range *params {
+ if !strings.HasPrefix(paramName, key+"[") || paramName[len(paramName)-1] != ']' {
+ continue
+ }
+
+ key := paramName[len(key)+1 : len(paramName)-1]
+ result.SetMapIndex(input.bindValue(key, keyType), input.bindValue(values[0], valueType))
+ }
+ return result
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/output.go b/at-admin/vendor/github.com/astaxie/beego/context/output.go
new file mode 100644
index 0000000..238dcf4
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/output.go
@@ -0,0 +1,408 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package context
+
+import (
+ "bytes"
+ "encoding/json"
+ "encoding/xml"
+ "errors"
+ "fmt"
+ "html/template"
+ "io"
+ "mime"
+ "net/http"
+ "net/url"
+ "os"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "time"
+
+ yaml "gopkg.in/yaml.v2"
+)
+
+// BeegoOutput does work for sending response header.
+type BeegoOutput struct {
+ Context *Context
+ Status int
+ EnableGzip bool
+}
+
+// NewOutput returns new BeegoOutput.
+// it contains nothing now.
+func NewOutput() *BeegoOutput {
+ return &BeegoOutput{}
+}
+
+// Reset init BeegoOutput
+func (output *BeegoOutput) Reset(ctx *Context) {
+ output.Context = ctx
+ output.Status = 0
+}
+
+// Header sets response header item string via given key.
+func (output *BeegoOutput) Header(key, val string) {
+ output.Context.ResponseWriter.Header().Set(key, val)
+}
+
+// Body sets response body content.
+// if EnableGzip, compress content string.
+// it sends out response body directly.
+func (output *BeegoOutput) Body(content []byte) error {
+ var encoding string
+ var buf = &bytes.Buffer{}
+ if output.EnableGzip {
+ encoding = ParseEncoding(output.Context.Request)
+ }
+ if b, n, _ := WriteBody(encoding, buf, content); b {
+ output.Header("Content-Encoding", n)
+ output.Header("Content-Length", strconv.Itoa(buf.Len()))
+ } else {
+ output.Header("Content-Length", strconv.Itoa(len(content)))
+ }
+ // Write status code if it has been set manually
+ // Set it to 0 afterwards to prevent "multiple response.WriteHeader calls"
+ if output.Status != 0 {
+ output.Context.ResponseWriter.WriteHeader(output.Status)
+ output.Status = 0
+ } else {
+ output.Context.ResponseWriter.Started = true
+ }
+ io.Copy(output.Context.ResponseWriter, buf)
+ return nil
+}
+
+// Cookie sets cookie value via given key.
+// others are ordered as cookie's max age time, path,domain, secure and httponly.
+func (output *BeegoOutput) Cookie(name string, value string, others ...interface{}) {
+ var b bytes.Buffer
+ fmt.Fprintf(&b, "%s=%s", sanitizeName(name), sanitizeValue(value))
+
+ //fix cookie not work in IE
+ if len(others) > 0 {
+ var maxAge int64
+
+ switch v := others[0].(type) {
+ case int:
+ maxAge = int64(v)
+ case int32:
+ maxAge = int64(v)
+ case int64:
+ maxAge = v
+ }
+
+ switch {
+ case maxAge > 0:
+ fmt.Fprintf(&b, "; Expires=%s; Max-Age=%d", time.Now().Add(time.Duration(maxAge)*time.Second).UTC().Format(time.RFC1123), maxAge)
+ case maxAge < 0:
+ fmt.Fprintf(&b, "; Max-Age=0")
+ }
+ }
+
+ // the settings below
+ // Path, Domain, Secure, HttpOnly
+ // can use nil skip set
+
+ // default "/"
+ if len(others) > 1 {
+ if v, ok := others[1].(string); ok && len(v) > 0 {
+ fmt.Fprintf(&b, "; Path=%s", sanitizeValue(v))
+ }
+ } else {
+ fmt.Fprintf(&b, "; Path=%s", "/")
+ }
+
+ // default empty
+ if len(others) > 2 {
+ if v, ok := others[2].(string); ok && len(v) > 0 {
+ fmt.Fprintf(&b, "; Domain=%s", sanitizeValue(v))
+ }
+ }
+
+ // default empty
+ if len(others) > 3 {
+ var secure bool
+ switch v := others[3].(type) {
+ case bool:
+ secure = v
+ default:
+ if others[3] != nil {
+ secure = true
+ }
+ }
+ if secure {
+ fmt.Fprintf(&b, "; Secure")
+ }
+ }
+
+ // default false. for session cookie default true
+ if len(others) > 4 {
+ if v, ok := others[4].(bool); ok && v {
+ fmt.Fprintf(&b, "; HttpOnly")
+ }
+ }
+
+ output.Context.ResponseWriter.Header().Add("Set-Cookie", b.String())
+}
+
+var cookieNameSanitizer = strings.NewReplacer("\n", "-", "\r", "-")
+
+func sanitizeName(n string) string {
+ return cookieNameSanitizer.Replace(n)
+}
+
+var cookieValueSanitizer = strings.NewReplacer("\n", " ", "\r", " ", ";", " ")
+
+func sanitizeValue(v string) string {
+ return cookieValueSanitizer.Replace(v)
+}
+
+func jsonRenderer(value interface{}) Renderer {
+ return rendererFunc(func(ctx *Context) {
+ ctx.Output.JSON(value, false, false)
+ })
+}
+
+func errorRenderer(err error) Renderer {
+ return rendererFunc(func(ctx *Context) {
+ ctx.Output.SetStatus(500)
+ ctx.Output.Body([]byte(err.Error()))
+ })
+}
+
+// JSON writes json to response body.
+// if encoding is true, it converts utf-8 to \u0000 type.
+func (output *BeegoOutput) JSON(data interface{}, hasIndent bool, encoding bool) error {
+ output.Header("Content-Type", "application/json; charset=utf-8")
+ var content []byte
+ var err error
+ if hasIndent {
+ content, err = json.MarshalIndent(data, "", " ")
+ } else {
+ content, err = json.Marshal(data)
+ }
+ if err != nil {
+ http.Error(output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+ return err
+ }
+ if encoding {
+ content = []byte(stringsToJSON(string(content)))
+ }
+ return output.Body(content)
+}
+
+// YAML writes yaml to response body.
+func (output *BeegoOutput) YAML(data interface{}) error {
+ output.Header("Content-Type", "application/x-yaml; charset=utf-8")
+ var content []byte
+ var err error
+ content, err = yaml.Marshal(data)
+ if err != nil {
+ http.Error(output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+ return err
+ }
+ return output.Body(content)
+}
+
+// JSONP writes jsonp to response body.
+func (output *BeegoOutput) JSONP(data interface{}, hasIndent bool) error {
+ output.Header("Content-Type", "application/javascript; charset=utf-8")
+ var content []byte
+ var err error
+ if hasIndent {
+ content, err = json.MarshalIndent(data, "", " ")
+ } else {
+ content, err = json.Marshal(data)
+ }
+ if err != nil {
+ http.Error(output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+ return err
+ }
+ callback := output.Context.Input.Query("callback")
+ if callback == "" {
+ return errors.New(`"callback" parameter required`)
+ }
+ callback = template.JSEscapeString(callback)
+ callbackContent := bytes.NewBufferString(" if(window." + callback + ")" + callback)
+ callbackContent.WriteString("(")
+ callbackContent.Write(content)
+ callbackContent.WriteString(");\r\n")
+ return output.Body(callbackContent.Bytes())
+}
+
+// XML writes xml string to response body.
+func (output *BeegoOutput) XML(data interface{}, hasIndent bool) error {
+ output.Header("Content-Type", "application/xml; charset=utf-8")
+ var content []byte
+ var err error
+ if hasIndent {
+ content, err = xml.MarshalIndent(data, "", " ")
+ } else {
+ content, err = xml.Marshal(data)
+ }
+ if err != nil {
+ http.Error(output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+ return err
+ }
+ return output.Body(content)
+}
+
+// ServeFormatted serve YAML, XML OR JSON, depending on the value of the Accept header
+func (output *BeegoOutput) ServeFormatted(data interface{}, hasIndent bool, hasEncode ...bool) {
+ accept := output.Context.Input.Header("Accept")
+ switch accept {
+ case ApplicationYAML:
+ output.YAML(data)
+ case ApplicationXML, TextXML:
+ output.XML(data, hasIndent)
+ default:
+ output.JSON(data, hasIndent, len(hasEncode) > 0 && hasEncode[0])
+ }
+}
+
+// Download forces response for download file.
+// it prepares the download response header automatically.
+func (output *BeegoOutput) Download(file string, filename ...string) {
+ // check get file error, file not found or other error.
+ if _, err := os.Stat(file); err != nil {
+ http.ServeFile(output.Context.ResponseWriter, output.Context.Request, file)
+ return
+ }
+
+ var fName string
+ if len(filename) > 0 && filename[0] != "" {
+ fName = filename[0]
+ } else {
+ fName = filepath.Base(file)
+ }
+ //https://tools.ietf.org/html/rfc6266#section-4.3
+ fn := url.PathEscape(fName)
+ if fName == fn {
+ fn = "filename=" + fn
+ } else {
+ /**
+ The parameters "filename" and "filename*" differ only in that
+ "filename*" uses the encoding defined in [RFC5987], allowing the use
+ of characters not present in the ISO-8859-1 character set
+ ([ISO-8859-1]).
+ */
+ fn = "filename=" + fName + "; filename*=utf-8''" + fn
+ }
+ output.Header("Content-Disposition", "attachment; "+fn)
+ output.Header("Content-Description", "File Transfer")
+ output.Header("Content-Type", "application/octet-stream")
+ output.Header("Content-Transfer-Encoding", "binary")
+ output.Header("Expires", "0")
+ output.Header("Cache-Control", "must-revalidate")
+ output.Header("Pragma", "public")
+ http.ServeFile(output.Context.ResponseWriter, output.Context.Request, file)
+}
+
+// ContentType sets the content type from ext string.
+// MIME type is given in mime package.
+func (output *BeegoOutput) ContentType(ext string) {
+ if !strings.HasPrefix(ext, ".") {
+ ext = "." + ext
+ }
+ ctype := mime.TypeByExtension(ext)
+ if ctype != "" {
+ output.Header("Content-Type", ctype)
+ }
+}
+
+// SetStatus sets response status code.
+// It writes response header directly.
+func (output *BeegoOutput) SetStatus(status int) {
+ output.Status = status
+}
+
+// IsCachable returns boolean of this request is cached.
+// HTTP 304 means cached.
+func (output *BeegoOutput) IsCachable() bool {
+ return output.Status >= 200 && output.Status < 300 || output.Status == 304
+}
+
+// IsEmpty returns boolean of this request is empty.
+// HTTP 201,204 and 304 means empty.
+func (output *BeegoOutput) IsEmpty() bool {
+ return output.Status == 201 || output.Status == 204 || output.Status == 304
+}
+
+// IsOk returns boolean of this request runs well.
+// HTTP 200 means ok.
+func (output *BeegoOutput) IsOk() bool {
+ return output.Status == 200
+}
+
+// IsSuccessful returns boolean of this request runs successfully.
+// HTTP 2xx means ok.
+func (output *BeegoOutput) IsSuccessful() bool {
+ return output.Status >= 200 && output.Status < 300
+}
+
+// IsRedirect returns boolean of this request is redirection header.
+// HTTP 301,302,307 means redirection.
+func (output *BeegoOutput) IsRedirect() bool {
+ return output.Status == 301 || output.Status == 302 || output.Status == 303 || output.Status == 307
+}
+
+// IsForbidden returns boolean of this request is forbidden.
+// HTTP 403 means forbidden.
+func (output *BeegoOutput) IsForbidden() bool {
+ return output.Status == 403
+}
+
+// IsNotFound returns boolean of this request is not found.
+// HTTP 404 means not found.
+func (output *BeegoOutput) IsNotFound() bool {
+ return output.Status == 404
+}
+
+// IsClientError returns boolean of this request client sends error data.
+// HTTP 4xx means client error.
+func (output *BeegoOutput) IsClientError() bool {
+ return output.Status >= 400 && output.Status < 500
+}
+
+// IsServerError returns boolean of this server handler errors.
+// HTTP 5xx means server internal error.
+func (output *BeegoOutput) IsServerError() bool {
+ return output.Status >= 500 && output.Status < 600
+}
+
+func stringsToJSON(str string) string {
+ var jsons bytes.Buffer
+ for _, r := range str {
+ rint := int(r)
+ if rint < 128 {
+ jsons.WriteRune(r)
+ } else {
+ jsons.WriteString("\\u")
+ if rint < 0x100 {
+ jsons.WriteString("00")
+ } else if rint < 0x1000 {
+ jsons.WriteString("0")
+ }
+ jsons.WriteString(strconv.FormatInt(int64(rint), 16))
+ }
+ }
+ return jsons.String()
+}
+
+// Session sets session item value with given key.
+func (output *BeegoOutput) Session(name interface{}, value interface{}) {
+ output.Context.Input.CruSession.Set(name, value)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/param/conv.go b/at-admin/vendor/github.com/astaxie/beego/context/param/conv.go
new file mode 100644
index 0000000..c200e00
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/param/conv.go
@@ -0,0 +1,78 @@
+package param
+
+import (
+ "fmt"
+ "reflect"
+
+ beecontext "github.com/astaxie/beego/context"
+ "github.com/astaxie/beego/logs"
+)
+
+// ConvertParams converts http method params to values that will be passed to the method controller as arguments
+func ConvertParams(methodParams []*MethodParam, methodType reflect.Type, ctx *beecontext.Context) (result []reflect.Value) {
+ result = make([]reflect.Value, 0, len(methodParams))
+ for i := 0; i < len(methodParams); i++ {
+ reflectValue := convertParam(methodParams[i], methodType.In(i), ctx)
+ result = append(result, reflectValue)
+ }
+ return
+}
+
+func convertParam(param *MethodParam, paramType reflect.Type, ctx *beecontext.Context) (result reflect.Value) {
+ paramValue := getParamValue(param, ctx)
+ if paramValue == "" {
+ if param.required {
+ ctx.Abort(400, fmt.Sprintf("Missing parameter %s", param.name))
+ } else {
+ paramValue = param.defaultValue
+ }
+ }
+
+ reflectValue, err := parseValue(param, paramValue, paramType)
+ if err != nil {
+ logs.Debug(fmt.Sprintf("Error converting param %s to type %s. Value: %v, Error: %s", param.name, paramType, paramValue, err))
+ ctx.Abort(400, fmt.Sprintf("Invalid parameter %s. Can not convert %v to type %s", param.name, paramValue, paramType))
+ }
+
+ return reflectValue
+}
+
+func getParamValue(param *MethodParam, ctx *beecontext.Context) string {
+ switch param.in {
+ case body:
+ return string(ctx.Input.RequestBody)
+ case header:
+ return ctx.Input.Header(param.name)
+ case path:
+ return ctx.Input.Query(":" + param.name)
+ default:
+ return ctx.Input.Query(param.name)
+ }
+}
+
+func parseValue(param *MethodParam, paramValue string, paramType reflect.Type) (result reflect.Value, err error) {
+ if paramValue == "" {
+ return reflect.Zero(paramType), nil
+ }
+ parser := getParser(param, paramType)
+ value, err := parser.parse(paramValue, paramType)
+ if err != nil {
+ return result, err
+ }
+
+ return safeConvert(reflect.ValueOf(value), paramType)
+}
+
+func safeConvert(value reflect.Value, t reflect.Type) (result reflect.Value, err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ var ok bool
+ err, ok = r.(error)
+ if !ok {
+ err = fmt.Errorf("%v", r)
+ }
+ }
+ }()
+ result = value.Convert(t)
+ return
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/param/methodparams.go b/at-admin/vendor/github.com/astaxie/beego/context/param/methodparams.go
new file mode 100644
index 0000000..cd6708a
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/param/methodparams.go
@@ -0,0 +1,69 @@
+package param
+
+import (
+ "fmt"
+ "strings"
+)
+
+//MethodParam keeps param information to be auto passed to controller methods
+type MethodParam struct {
+ name string
+ in paramType
+ required bool
+ defaultValue string
+}
+
+type paramType byte
+
+const (
+ param paramType = iota
+ path
+ body
+ header
+)
+
+//New creates a new MethodParam with name and specific options
+func New(name string, opts ...MethodParamOption) *MethodParam {
+ return newParam(name, nil, opts)
+}
+
+func newParam(name string, parser paramParser, opts []MethodParamOption) (param *MethodParam) {
+ param = &MethodParam{name: name}
+ for _, option := range opts {
+ option(param)
+ }
+ return
+}
+
+//Make creates an array of MethodParmas or an empty array
+func Make(list ...*MethodParam) []*MethodParam {
+ if len(list) > 0 {
+ return list
+ }
+ return nil
+}
+
+func (mp *MethodParam) String() string {
+ options := []string{}
+ result := "param.New(\"" + mp.name + "\""
+ if mp.required {
+ options = append(options, "param.IsRequired")
+ }
+ switch mp.in {
+ case path:
+ options = append(options, "param.InPath")
+ case body:
+ options = append(options, "param.InBody")
+ case header:
+ options = append(options, "param.InHeader")
+ }
+ if mp.defaultValue != "" {
+ options = append(options, fmt.Sprintf(`param.Default("%s")`, mp.defaultValue))
+ }
+ if len(options) > 0 {
+ result += ", "
+ }
+ result += strings.Join(options, ", ")
+ result += ")"
+ return result
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/param/options.go b/at-admin/vendor/github.com/astaxie/beego/context/param/options.go
new file mode 100644
index 0000000..3d5ba01
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/param/options.go
@@ -0,0 +1,37 @@
+package param
+
+import (
+ "fmt"
+)
+
+// MethodParamOption defines a func which apply options on a MethodParam
+type MethodParamOption func(*MethodParam)
+
+// IsRequired indicates that this param is required and can not be omitted from the http request
+var IsRequired MethodParamOption = func(p *MethodParam) {
+ p.required = true
+}
+
+// InHeader indicates that this param is passed via an http header
+var InHeader MethodParamOption = func(p *MethodParam) {
+ p.in = header
+}
+
+// InPath indicates that this param is part of the URL path
+var InPath MethodParamOption = func(p *MethodParam) {
+ p.in = path
+}
+
+// InBody indicates that this param is passed as an http request body
+var InBody MethodParamOption = func(p *MethodParam) {
+ p.in = body
+}
+
+// Default provides a default value for the http param
+func Default(defaultValue interface{}) MethodParamOption {
+ return func(p *MethodParam) {
+ if defaultValue != nil {
+ p.defaultValue = fmt.Sprint(defaultValue)
+ }
+ }
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/param/parsers.go b/at-admin/vendor/github.com/astaxie/beego/context/param/parsers.go
new file mode 100644
index 0000000..421aecf
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/param/parsers.go
@@ -0,0 +1,149 @@
+package param
+
+import (
+ "encoding/json"
+ "reflect"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type paramParser interface {
+ parse(value string, toType reflect.Type) (interface{}, error)
+}
+
+func getParser(param *MethodParam, t reflect.Type) paramParser {
+ switch t.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
+ reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return intParser{}
+ case reflect.Slice:
+ if t.Elem().Kind() == reflect.Uint8 { //treat []byte as string
+ return stringParser{}
+ }
+ if param.in == body {
+ return jsonParser{}
+ }
+ elemParser := getParser(param, t.Elem())
+ if elemParser == (jsonParser{}) {
+ return elemParser
+ }
+ return sliceParser(elemParser)
+ case reflect.Bool:
+ return boolParser{}
+ case reflect.String:
+ return stringParser{}
+ case reflect.Float32, reflect.Float64:
+ return floatParser{}
+ case reflect.Ptr:
+ elemParser := getParser(param, t.Elem())
+ if elemParser == (jsonParser{}) {
+ return elemParser
+ }
+ return ptrParser(elemParser)
+ default:
+ if t.PkgPath() == "time" && t.Name() == "Time" {
+ return timeParser{}
+ }
+ return jsonParser{}
+ }
+}
+
+type parserFunc func(value string, toType reflect.Type) (interface{}, error)
+
+func (f parserFunc) parse(value string, toType reflect.Type) (interface{}, error) {
+ return f(value, toType)
+}
+
+type boolParser struct {
+}
+
+func (p boolParser) parse(value string, toType reflect.Type) (interface{}, error) {
+ return strconv.ParseBool(value)
+}
+
+type stringParser struct {
+}
+
+func (p stringParser) parse(value string, toType reflect.Type) (interface{}, error) {
+ return value, nil
+}
+
+type intParser struct {
+}
+
+func (p intParser) parse(value string, toType reflect.Type) (interface{}, error) {
+ return strconv.Atoi(value)
+}
+
+type floatParser struct {
+}
+
+func (p floatParser) parse(value string, toType reflect.Type) (interface{}, error) {
+ if toType.Kind() == reflect.Float32 {
+ res, err := strconv.ParseFloat(value, 32)
+ if err != nil {
+ return nil, err
+ }
+ return float32(res), nil
+ }
+ return strconv.ParseFloat(value, 64)
+}
+
+type timeParser struct {
+}
+
+func (p timeParser) parse(value string, toType reflect.Type) (result interface{}, err error) {
+ result, err = time.Parse(time.RFC3339, value)
+ if err != nil {
+ result, err = time.Parse("2006-01-02", value)
+ }
+ return
+}
+
+type jsonParser struct {
+}
+
+func (p jsonParser) parse(value string, toType reflect.Type) (interface{}, error) {
+ pResult := reflect.New(toType)
+ v := pResult.Interface()
+ err := json.Unmarshal([]byte(value), v)
+ if err != nil {
+ return nil, err
+ }
+ return pResult.Elem().Interface(), nil
+}
+
+func sliceParser(elemParser paramParser) paramParser {
+ return parserFunc(func(value string, toType reflect.Type) (interface{}, error) {
+ values := strings.Split(value, ",")
+ result := reflect.MakeSlice(toType, 0, len(values))
+ elemType := toType.Elem()
+ for _, v := range values {
+ parsedValue, err := elemParser.parse(v, elemType)
+ if err != nil {
+ return nil, err
+ }
+ result = reflect.Append(result, reflect.ValueOf(parsedValue))
+ }
+ return result.Interface(), nil
+ })
+}
+
+func ptrParser(elemParser paramParser) paramParser {
+ return parserFunc(func(value string, toType reflect.Type) (interface{}, error) {
+ parsedValue, err := elemParser.parse(value, toType.Elem())
+ if err != nil {
+ return nil, err
+ }
+ newValPtr := reflect.New(toType.Elem())
+ newVal := reflect.Indirect(newValPtr)
+ convertedVal, err := safeConvert(reflect.ValueOf(parsedValue), toType.Elem())
+ if err != nil {
+ return nil, err
+ }
+
+ newVal.Set(convertedVal)
+ return newValPtr.Interface(), nil
+ })
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/renderer.go b/at-admin/vendor/github.com/astaxie/beego/context/renderer.go
new file mode 100644
index 0000000..36a7cb5
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/renderer.go
@@ -0,0 +1,12 @@
+package context
+
+// Renderer defines an http response renderer
+type Renderer interface {
+ Render(ctx *Context)
+}
+
+type rendererFunc func(ctx *Context)
+
+func (f rendererFunc) Render(ctx *Context) {
+ f(ctx)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/context/response.go b/at-admin/vendor/github.com/astaxie/beego/context/response.go
new file mode 100644
index 0000000..9c3c715
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/context/response.go
@@ -0,0 +1,27 @@
+package context
+
+import (
+ "strconv"
+
+ "net/http"
+)
+
+const (
+ //BadRequest indicates http error 400
+ BadRequest StatusCode = http.StatusBadRequest
+
+ //NotFound indicates http error 404
+ NotFound StatusCode = http.StatusNotFound
+)
+
+// StatusCode sets the http response status code
+type StatusCode int
+
+func (s StatusCode) Error() string {
+ return strconv.Itoa(int(s))
+}
+
+// Render sets the http status code
+func (s StatusCode) Render(ctx *Context) {
+ ctx.Output.SetStatus(int(s))
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/controller.go b/at-admin/vendor/github.com/astaxie/beego/controller.go
new file mode 100644
index 0000000..0e8853b
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/controller.go
@@ -0,0 +1,706 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "html/template"
+ "io"
+ "mime/multipart"
+ "net/http"
+ "net/url"
+ "os"
+ "reflect"
+ "strconv"
+ "strings"
+
+ "github.com/astaxie/beego/context"
+ "github.com/astaxie/beego/context/param"
+ "github.com/astaxie/beego/session"
+)
+
+var (
+ // ErrAbort custom error when user stop request handler manually.
+ ErrAbort = errors.New("user stop run")
+ // GlobalControllerRouter store comments with controller. pkgpath+controller:comments
+ GlobalControllerRouter = make(map[string][]ControllerComments)
+)
+
+// ControllerFilter store the filter for controller
+type ControllerFilter struct {
+ Pattern string
+ Pos int
+ Filter FilterFunc
+ ReturnOnOutput bool
+ ResetParams bool
+}
+
+// ControllerFilterComments store the comment for controller level filter
+type ControllerFilterComments struct {
+ Pattern string
+ Pos int
+ Filter string // NOQA
+ ReturnOnOutput bool
+ ResetParams bool
+}
+
+// ControllerImportComments store the import comment for controller needed
+type ControllerImportComments struct {
+ ImportPath string
+ ImportAlias string
+}
+
+// ControllerComments store the comment for the controller method
+type ControllerComments struct {
+ Method string
+ Router string
+ Filters []*ControllerFilter
+ ImportComments []*ControllerImportComments
+ FilterComments []*ControllerFilterComments
+ AllowHTTPMethods []string
+ Params []map[string]string
+ MethodParams []*param.MethodParam
+}
+
+// ControllerCommentsSlice implements the sort interface
+type ControllerCommentsSlice []ControllerComments
+
+func (p ControllerCommentsSlice) Len() int { return len(p) }
+func (p ControllerCommentsSlice) Less(i, j int) bool { return p[i].Router < p[j].Router }
+func (p ControllerCommentsSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+
+// Controller defines some basic http request handler operations, such as
+// http context, template and view, session and xsrf.
+type Controller struct {
+ // context data
+ Ctx *context.Context
+ Data map[interface{}]interface{}
+
+ // route controller info
+ controllerName string
+ actionName string
+ methodMapping map[string]func() //method:routertree
+ AppController interface{}
+
+ // template data
+ TplName string
+ ViewPath string
+ Layout string
+ LayoutSections map[string]string // the key is the section name and the value is the template name
+ TplPrefix string
+ TplExt string
+ EnableRender bool
+
+ // xsrf data
+ _xsrfToken string
+ XSRFExpire int
+ EnableXSRF bool
+
+ // session
+ CruSession session.Store
+}
+
+// ControllerInterface is an interface to uniform all controller handler.
+type ControllerInterface interface {
+ Init(ct *context.Context, controllerName, actionName string, app interface{})
+ Prepare()
+ Get()
+ Post()
+ Delete()
+ Put()
+ Head()
+ Patch()
+ Options()
+ Trace()
+ Finish()
+ Render() error
+ XSRFToken() string
+ CheckXSRFCookie() bool
+ HandlerFunc(fn string) bool
+ URLMapping()
+}
+
+// Init generates default values of controller operations.
+func (c *Controller) Init(ctx *context.Context, controllerName, actionName string, app interface{}) {
+ c.Layout = ""
+ c.TplName = ""
+ c.controllerName = controllerName
+ c.actionName = actionName
+ c.Ctx = ctx
+ c.TplExt = "tpl"
+ c.AppController = app
+ c.EnableRender = true
+ c.EnableXSRF = true
+ c.Data = ctx.Input.Data()
+ c.methodMapping = make(map[string]func())
+}
+
+// Prepare runs after Init before request function execution.
+func (c *Controller) Prepare() {}
+
+// Finish runs after request function execution.
+func (c *Controller) Finish() {}
+
+// Get adds a request function to handle GET request.
+func (c *Controller) Get() {
+ http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", http.StatusMethodNotAllowed)
+}
+
+// Post adds a request function to handle POST request.
+func (c *Controller) Post() {
+ http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", http.StatusMethodNotAllowed)
+}
+
+// Delete adds a request function to handle DELETE request.
+func (c *Controller) Delete() {
+ http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", http.StatusMethodNotAllowed)
+}
+
+// Put adds a request function to handle PUT request.
+func (c *Controller) Put() {
+ http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", http.StatusMethodNotAllowed)
+}
+
+// Head adds a request function to handle HEAD request.
+func (c *Controller) Head() {
+ http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", http.StatusMethodNotAllowed)
+}
+
+// Patch adds a request function to handle PATCH request.
+func (c *Controller) Patch() {
+ http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", http.StatusMethodNotAllowed)
+}
+
+// Options adds a request function to handle OPTIONS request.
+func (c *Controller) Options() {
+ http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", http.StatusMethodNotAllowed)
+}
+
+// Trace adds a request function to handle Trace request.
+// this method SHOULD NOT be overridden.
+// https://tools.ietf.org/html/rfc7231#section-4.3.8
+// The TRACE method requests a remote, application-level loop-back of
+// the request message. The final recipient of the request SHOULD
+// reflect the message received, excluding some fields described below,
+// back to the client as the message body of a 200 (OK) response with a
+// Content-Type of "message/http" (Section 8.3.1 of [RFC7230]).
+func (c *Controller) Trace() {
+ ts := func(h http.Header) (hs string) {
+ for k, v := range h {
+ hs += fmt.Sprintf("\r\n%s: %s", k, v)
+ }
+ return
+ }
+ hs := fmt.Sprintf("\r\nTRACE %s %s%s\r\n", c.Ctx.Request.RequestURI, c.Ctx.Request.Proto, ts(c.Ctx.Request.Header))
+ c.Ctx.Output.Header("Content-Type", "message/http")
+ c.Ctx.Output.Header("Content-Length", fmt.Sprint(len(hs)))
+ c.Ctx.Output.Header("Cache-Control", "no-cache, no-store, must-revalidate")
+ c.Ctx.WriteString(hs)
+}
+
+// HandlerFunc call function with the name
+func (c *Controller) HandlerFunc(fnname string) bool {
+ if v, ok := c.methodMapping[fnname]; ok {
+ v()
+ return true
+ }
+ return false
+}
+
+// URLMapping register the internal Controller router.
+func (c *Controller) URLMapping() {}
+
+// Mapping the method to function
+func (c *Controller) Mapping(method string, fn func()) {
+ c.methodMapping[method] = fn
+}
+
+// Render sends the response with rendered template bytes as text/html type.
+func (c *Controller) Render() error {
+ if !c.EnableRender {
+ return nil
+ }
+ rb, err := c.RenderBytes()
+ if err != nil {
+ return err
+ }
+
+ if c.Ctx.ResponseWriter.Header().Get("Content-Type") == "" {
+ c.Ctx.Output.Header("Content-Type", "text/html; charset=utf-8")
+ }
+
+ return c.Ctx.Output.Body(rb)
+}
+
+// RenderString returns the rendered template string. Do not send out response.
+func (c *Controller) RenderString() (string, error) {
+ b, e := c.RenderBytes()
+ return string(b), e
+}
+
+// RenderBytes returns the bytes of rendered template string. Do not send out response.
+func (c *Controller) RenderBytes() ([]byte, error) {
+ buf, err := c.renderTemplate()
+ //if the controller has set layout, then first get the tplName's content set the content to the layout
+ if err == nil && c.Layout != "" {
+ c.Data["LayoutContent"] = template.HTML(buf.String())
+
+ if c.LayoutSections != nil {
+ for sectionName, sectionTpl := range c.LayoutSections {
+ if sectionTpl == "" {
+ c.Data[sectionName] = ""
+ continue
+ }
+ buf.Reset()
+ err = ExecuteViewPathTemplate(&buf, sectionTpl, c.viewPath(), c.Data)
+ if err != nil {
+ return nil, err
+ }
+ c.Data[sectionName] = template.HTML(buf.String())
+ }
+ }
+
+ buf.Reset()
+ ExecuteViewPathTemplate(&buf, c.Layout, c.viewPath(), c.Data)
+ }
+ return buf.Bytes(), err
+}
+
+func (c *Controller) renderTemplate() (bytes.Buffer, error) {
+ var buf bytes.Buffer
+ if c.TplName == "" {
+ c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
+ }
+ if c.TplPrefix != "" {
+ c.TplName = c.TplPrefix + c.TplName
+ }
+ if BConfig.RunMode == DEV {
+ buildFiles := []string{c.TplName}
+ if c.Layout != "" {
+ buildFiles = append(buildFiles, c.Layout)
+ if c.LayoutSections != nil {
+ for _, sectionTpl := range c.LayoutSections {
+ if sectionTpl == "" {
+ continue
+ }
+ buildFiles = append(buildFiles, sectionTpl)
+ }
+ }
+ }
+ BuildTemplate(c.viewPath(), buildFiles...)
+ }
+ return buf, ExecuteViewPathTemplate(&buf, c.TplName, c.viewPath(), c.Data)
+}
+
+func (c *Controller) viewPath() string {
+ if c.ViewPath == "" {
+ return BConfig.WebConfig.ViewsPath
+ }
+ return c.ViewPath
+}
+
+// Redirect sends the redirection response to url with status code.
+func (c *Controller) Redirect(url string, code int) {
+ LogAccess(c.Ctx, nil, code)
+ c.Ctx.Redirect(code, url)
+}
+
+// SetData set the data depending on the accepted
+func (c *Controller) SetData(data interface{}) {
+ accept := c.Ctx.Input.Header("Accept")
+ switch accept {
+ case context.ApplicationYAML:
+ c.Data["yaml"] = data
+ case context.ApplicationXML, context.TextXML:
+ c.Data["xml"] = data
+ default:
+ c.Data["json"] = data
+ }
+}
+
+// Abort stops controller handler and show the error data if code is defined in ErrorMap or code string.
+func (c *Controller) Abort(code string) {
+ status, err := strconv.Atoi(code)
+ if err != nil {
+ status = 200
+ }
+ c.CustomAbort(status, code)
+}
+
+// CustomAbort stops controller handler and show the error data, it's similar Aborts, but support status code and body.
+func (c *Controller) CustomAbort(status int, body string) {
+ // first panic from ErrorMaps, it is user defined error functions.
+ if _, ok := ErrorMaps[body]; ok {
+ c.Ctx.Output.Status = status
+ panic(body)
+ }
+ // last panic user string
+ c.Ctx.ResponseWriter.WriteHeader(status)
+ c.Ctx.ResponseWriter.Write([]byte(body))
+ panic(ErrAbort)
+}
+
+// StopRun makes panic of USERSTOPRUN error and go to recover function if defined.
+func (c *Controller) StopRun() {
+ panic(ErrAbort)
+}
+
+// URLFor does another controller handler in this request function.
+// it goes to this controller method if endpoint is not clear.
+func (c *Controller) URLFor(endpoint string, values ...interface{}) string {
+ if len(endpoint) == 0 {
+ return ""
+ }
+ if endpoint[0] == '.' {
+ return URLFor(reflect.Indirect(reflect.ValueOf(c.AppController)).Type().Name()+endpoint, values...)
+ }
+ return URLFor(endpoint, values...)
+}
+
+// ServeJSON sends a json response with encoding charset.
+func (c *Controller) ServeJSON(encoding ...bool) {
+ var (
+ hasIndent = BConfig.RunMode != PROD
+ hasEncoding = len(encoding) > 0 && encoding[0]
+ )
+
+ c.Ctx.Output.JSON(c.Data["json"], hasIndent, hasEncoding)
+}
+
+// ServeJSONP sends a jsonp response.
+func (c *Controller) ServeJSONP() {
+ hasIndent := BConfig.RunMode != PROD
+ c.Ctx.Output.JSONP(c.Data["jsonp"], hasIndent)
+}
+
+// ServeXML sends xml response.
+func (c *Controller) ServeXML() {
+ hasIndent := BConfig.RunMode != PROD
+ c.Ctx.Output.XML(c.Data["xml"], hasIndent)
+}
+
+// ServeYAML sends yaml response.
+func (c *Controller) ServeYAML() {
+ c.Ctx.Output.YAML(c.Data["yaml"])
+}
+
+// ServeFormatted serve YAML, XML OR JSON, depending on the value of the Accept header
+func (c *Controller) ServeFormatted(encoding ...bool) {
+ hasIndent := BConfig.RunMode != PROD
+ hasEncoding := len(encoding) > 0 && encoding[0]
+ c.Ctx.Output.ServeFormatted(c.Data, hasIndent, hasEncoding)
+}
+
+// Input returns the input data map from POST or PUT request body and query string.
+func (c *Controller) Input() url.Values {
+ if c.Ctx.Request.Form == nil {
+ c.Ctx.Request.ParseForm()
+ }
+ return c.Ctx.Request.Form
+}
+
+// ParseForm maps input data map to obj struct.
+func (c *Controller) ParseForm(obj interface{}) error {
+ return ParseForm(c.Input(), obj)
+}
+
+// GetString returns the input value by key string or the default value while it's present and input is blank
+func (c *Controller) GetString(key string, def ...string) string {
+ if v := c.Ctx.Input.Query(key); v != "" {
+ return v
+ }
+ if len(def) > 0 {
+ return def[0]
+ }
+ return ""
+}
+
+// GetStrings returns the input string slice by key string or the default value while it's present and input is blank
+// it's designed for multi-value input field such as checkbox(input[type=checkbox]), multi-selection.
+func (c *Controller) GetStrings(key string, def ...[]string) []string {
+ var defv []string
+ if len(def) > 0 {
+ defv = def[0]
+ }
+
+ if f := c.Input(); f == nil {
+ return defv
+ } else if vs := f[key]; len(vs) > 0 {
+ return vs
+ }
+
+ return defv
+}
+
+// GetInt returns input as an int or the default value while it's present and input is blank
+func (c *Controller) GetInt(key string, def ...int) (int, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ return strconv.Atoi(strv)
+}
+
+// GetInt8 return input as an int8 or the default value while it's present and input is blank
+func (c *Controller) GetInt8(key string, def ...int8) (int8, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ i64, err := strconv.ParseInt(strv, 10, 8)
+ return int8(i64), err
+}
+
+// GetUint8 return input as an uint8 or the default value while it's present and input is blank
+func (c *Controller) GetUint8(key string, def ...uint8) (uint8, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ u64, err := strconv.ParseUint(strv, 10, 8)
+ return uint8(u64), err
+}
+
+// GetInt16 returns input as an int16 or the default value while it's present and input is blank
+func (c *Controller) GetInt16(key string, def ...int16) (int16, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ i64, err := strconv.ParseInt(strv, 10, 16)
+ return int16(i64), err
+}
+
+// GetUint16 returns input as an uint16 or the default value while it's present and input is blank
+func (c *Controller) GetUint16(key string, def ...uint16) (uint16, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ u64, err := strconv.ParseUint(strv, 10, 16)
+ return uint16(u64), err
+}
+
+// GetInt32 returns input as an int32 or the default value while it's present and input is blank
+func (c *Controller) GetInt32(key string, def ...int32) (int32, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ i64, err := strconv.ParseInt(strv, 10, 32)
+ return int32(i64), err
+}
+
+// GetUint32 returns input as an uint32 or the default value while it's present and input is blank
+func (c *Controller) GetUint32(key string, def ...uint32) (uint32, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ u64, err := strconv.ParseUint(strv, 10, 32)
+ return uint32(u64), err
+}
+
+// GetInt64 returns input value as int64 or the default value while it's present and input is blank.
+func (c *Controller) GetInt64(key string, def ...int64) (int64, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ return strconv.ParseInt(strv, 10, 64)
+}
+
+// GetUint64 returns input value as uint64 or the default value while it's present and input is blank.
+func (c *Controller) GetUint64(key string, def ...uint64) (uint64, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ return strconv.ParseUint(strv, 10, 64)
+}
+
+// GetBool returns input value as bool or the default value while it's present and input is blank.
+func (c *Controller) GetBool(key string, def ...bool) (bool, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ return strconv.ParseBool(strv)
+}
+
+// GetFloat returns input value as float64 or the default value while it's present and input is blank.
+func (c *Controller) GetFloat(key string, def ...float64) (float64, error) {
+ strv := c.Ctx.Input.Query(key)
+ if len(strv) == 0 && len(def) > 0 {
+ return def[0], nil
+ }
+ return strconv.ParseFloat(strv, 64)
+}
+
+// GetFile returns the file data in file upload field named as key.
+// it returns the first one of multi-uploaded files.
+func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader, error) {
+ return c.Ctx.Request.FormFile(key)
+}
+
+// GetFiles return multi-upload files
+// files, err:=c.GetFiles("myfiles")
+// if err != nil {
+// http.Error(w, err.Error(), http.StatusNoContent)
+// return
+// }
+// for i, _ := range files {
+// //for each fileheader, get a handle to the actual file
+// file, err := files[i].Open()
+// defer file.Close()
+// if err != nil {
+// http.Error(w, err.Error(), http.StatusInternalServerError)
+// return
+// }
+// //create destination file making sure the path is writeable.
+// dst, err := os.Create("upload/" + files[i].Filename)
+// defer dst.Close()
+// if err != nil {
+// http.Error(w, err.Error(), http.StatusInternalServerError)
+// return
+// }
+// //copy the uploaded file to the destination file
+// if _, err := io.Copy(dst, file); err != nil {
+// http.Error(w, err.Error(), http.StatusInternalServerError)
+// return
+// }
+// }
+func (c *Controller) GetFiles(key string) ([]*multipart.FileHeader, error) {
+ if files, ok := c.Ctx.Request.MultipartForm.File[key]; ok {
+ return files, nil
+ }
+ return nil, http.ErrMissingFile
+}
+
+// SaveToFile saves uploaded file to new path.
+// it only operates the first one of mutil-upload form file field.
+func (c *Controller) SaveToFile(fromfile, tofile string) error {
+ file, _, err := c.Ctx.Request.FormFile(fromfile)
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+ f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ io.Copy(f, file)
+ return nil
+}
+
+// StartSession starts session and load old session data info this controller.
+func (c *Controller) StartSession() session.Store {
+ if c.CruSession == nil {
+ c.CruSession = c.Ctx.Input.CruSession
+ }
+ return c.CruSession
+}
+
+// SetSession puts value into session.
+func (c *Controller) SetSession(name interface{}, value interface{}) {
+ if c.CruSession == nil {
+ c.StartSession()
+ }
+ c.CruSession.Set(name, value)
+}
+
+// GetSession gets value from session.
+func (c *Controller) GetSession(name interface{}) interface{} {
+ if c.CruSession == nil {
+ c.StartSession()
+ }
+ return c.CruSession.Get(name)
+}
+
+// DelSession removes value from session.
+func (c *Controller) DelSession(name interface{}) {
+ if c.CruSession == nil {
+ c.StartSession()
+ }
+ c.CruSession.Delete(name)
+}
+
+// SessionRegenerateID regenerates session id for this session.
+// the session data have no changes.
+func (c *Controller) SessionRegenerateID() {
+ if c.CruSession != nil {
+ c.CruSession.SessionRelease(c.Ctx.ResponseWriter)
+ }
+ c.CruSession = GlobalSessions.SessionRegenerateID(c.Ctx.ResponseWriter, c.Ctx.Request)
+ c.Ctx.Input.CruSession = c.CruSession
+}
+
+// DestroySession cleans session data and session cookie.
+func (c *Controller) DestroySession() {
+ c.Ctx.Input.CruSession.Flush()
+ c.Ctx.Input.CruSession = nil
+ GlobalSessions.SessionDestroy(c.Ctx.ResponseWriter, c.Ctx.Request)
+}
+
+// IsAjax returns this request is ajax or not.
+func (c *Controller) IsAjax() bool {
+ return c.Ctx.Input.IsAjax()
+}
+
+// GetSecureCookie returns decoded cookie value from encoded browser cookie values.
+func (c *Controller) GetSecureCookie(Secret, key string) (string, bool) {
+ return c.Ctx.GetSecureCookie(Secret, key)
+}
+
+// SetSecureCookie puts value into cookie after encoded the value.
+func (c *Controller) SetSecureCookie(Secret, name, value string, others ...interface{}) {
+ c.Ctx.SetSecureCookie(Secret, name, value, others...)
+}
+
+// XSRFToken creates a CSRF token string and returns.
+func (c *Controller) XSRFToken() string {
+ if c._xsrfToken == "" {
+ expire := int64(BConfig.WebConfig.XSRFExpire)
+ if c.XSRFExpire > 0 {
+ expire = int64(c.XSRFExpire)
+ }
+ c._xsrfToken = c.Ctx.XSRFToken(BConfig.WebConfig.XSRFKey, expire)
+ }
+ return c._xsrfToken
+}
+
+// CheckXSRFCookie checks xsrf token in this request is valid or not.
+// the token can provided in request header "X-Xsrftoken" and "X-CsrfToken"
+// or in form field value named as "_xsrf".
+func (c *Controller) CheckXSRFCookie() bool {
+ if !c.EnableXSRF {
+ return true
+ }
+ return c.Ctx.CheckXSRFCookie()
+}
+
+// XSRFFormHTML writes an input field contains xsrf token value.
+func (c *Controller) XSRFFormHTML() string {
+ return ` `
+}
+
+// GetControllerAndAction gets the executing controller name and action name.
+func (c *Controller) GetControllerAndAction() (string, string) {
+ return c.controllerName, c.actionName
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/doc.go b/at-admin/vendor/github.com/astaxie/beego/doc.go
new file mode 100644
index 0000000..8825bd2
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/doc.go
@@ -0,0 +1,17 @@
+/*
+Package beego provide a MVC framework
+beego: an open-source, high-performance, modular, full-stack web framework
+
+It is used for rapid development of RESTful APIs, web apps and backend services in Go.
+beego is inspired by Tornado, Sinatra and Flask with the added benefit of some Go-specific features such as interfaces and struct embedding.
+
+ package main
+ import "github.com/astaxie/beego"
+
+ func main() {
+ beego.Run()
+ }
+
+more information: http://beego.me
+*/
+package beego
diff --git a/at-admin/vendor/github.com/astaxie/beego/error.go b/at-admin/vendor/github.com/astaxie/beego/error.go
new file mode 100644
index 0000000..e5e9fd4
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/error.go
@@ -0,0 +1,474 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "fmt"
+ "html/template"
+ "net/http"
+ "reflect"
+ "runtime"
+ "strconv"
+ "strings"
+
+ "github.com/astaxie/beego/context"
+ "github.com/astaxie/beego/utils"
+)
+
+const (
+ errorTypeHandler = iota
+ errorTypeController
+)
+
+var tpl = `
+
+
+
+
+ beego application error
+
+
+
+
+
+
+
+
+ Request Method: {{.RequestMethod}}
+
+
+ Request URL: {{.RequestURL}}
+
+
+ RemoteAddr: {{.RemoteAddr }}
+
+
+
+
+
+
+
+`
+
+// render default application error page with error and stack string.
+func showErr(err interface{}, ctx *context.Context, stack string) {
+ t, _ := template.New("beegoerrortemp").Parse(tpl)
+ data := map[string]string{
+ "AppError": fmt.Sprintf("%s:%v", BConfig.AppName, err),
+ "RequestMethod": ctx.Input.Method(),
+ "RequestURL": ctx.Input.URI(),
+ "RemoteAddr": ctx.Input.IP(),
+ "Stack": stack,
+ "BeegoVersion": VERSION,
+ "GoVersion": runtime.Version(),
+ }
+ t.Execute(ctx.ResponseWriter, data)
+}
+
+var errtpl = `
+
+
+
+
+ {{.Title}}
+
+
+
+
+
+
+
{{.Title}}
+
+
+ {{.Content}}
+
Go Home
+
+
Powered by beego {{.BeegoVersion}}
+
+
+
+
+
+`
+
+type errorInfo struct {
+ controllerType reflect.Type
+ handler http.HandlerFunc
+ method string
+ errorType int
+}
+
+// ErrorMaps holds map of http handlers for each error string.
+// there is 10 kinds default error(40x and 50x)
+var ErrorMaps = make(map[string]*errorInfo, 10)
+
+// show 401 unauthorized error.
+func unauthorized(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 401,
+ " The page you have requested can't be authorized."+
+ " Perhaps you are here because:"+
+ ""+
+ " The credentials you supplied are incorrect"+
+ " There are errors in the website address"+
+ " ",
+ )
+}
+
+// show 402 Payment Required
+func paymentRequired(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 402,
+ " The page you have requested Payment Required."+
+ " Perhaps you are here because:"+
+ ""+
+ " The credentials you supplied are incorrect"+
+ " There are errors in the website address"+
+ " ",
+ )
+}
+
+// show 403 forbidden error.
+func forbidden(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 403,
+ " The page you have requested is forbidden."+
+ " Perhaps you are here because:"+
+ ""+
+ " Your address may be blocked"+
+ " The site may be disabled"+
+ " You need to log in"+
+ " ",
+ )
+}
+
+// show 422 missing xsrf token
+func missingxsrf(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 422,
+ " The page you have requested is forbidden."+
+ " Perhaps you are here because:"+
+ ""+
+ " '_xsrf' argument missing from POST"+
+ " ",
+ )
+}
+
+// show 417 invalid xsrf token
+func invalidxsrf(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 417,
+ " The page you have requested is forbidden."+
+ " Perhaps you are here because:"+
+ ""+
+ " expected XSRF not found"+
+ " ",
+ )
+}
+
+// show 404 not found error.
+func notFound(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 404,
+ " The page you have requested has flown the coop."+
+ " Perhaps you are here because:"+
+ ""+
+ " The page has moved"+
+ " The page no longer exists"+
+ " You were looking for your puppy and got lost"+
+ " You like 404 pages"+
+ " ",
+ )
+}
+
+// show 405 Method Not Allowed
+func methodNotAllowed(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 405,
+ " The method you have requested Not Allowed."+
+ " Perhaps you are here because:"+
+ ""+
+ " The method specified in the Request-Line is not allowed for the resource identified by the Request-URI"+
+ " The response MUST include an Allow header containing a list of valid methods for the requested resource."+
+ " ",
+ )
+}
+
+// show 500 internal server error.
+func internalServerError(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 500,
+ " The page you have requested is down right now."+
+ ""+
+ " Please try again later and report the error to the website administrator"+
+ " ",
+ )
+}
+
+// show 501 Not Implemented.
+func notImplemented(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 501,
+ " The page you have requested is Not Implemented."+
+ ""+
+ " Please try again later and report the error to the website administrator"+
+ " ",
+ )
+}
+
+// show 502 Bad Gateway.
+func badGateway(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 502,
+ " The page you have requested is down right now."+
+ ""+
+ " The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request."+
+ " Please try again later and report the error to the website administrator"+
+ " ",
+ )
+}
+
+// show 503 service unavailable error.
+func serviceUnavailable(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 503,
+ " The page you have requested is unavailable."+
+ " Perhaps you are here because:"+
+ ""+
+ " The page is overloaded"+
+ " Please try again later."+
+ " ",
+ )
+}
+
+// show 504 Gateway Timeout.
+func gatewayTimeout(rw http.ResponseWriter, r *http.Request) {
+ responseError(rw, r,
+ 504,
+ " The page you have requested is unavailable"+
+ " Perhaps you are here because:"+
+ ""+
+ " The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URI."+
+ " Please try again later."+
+ " ",
+ )
+}
+
+func responseError(rw http.ResponseWriter, r *http.Request, errCode int, errContent string) {
+ t, _ := template.New("beegoerrortemp").Parse(errtpl)
+ data := M{
+ "Title": http.StatusText(errCode),
+ "BeegoVersion": VERSION,
+ "Content": template.HTML(errContent),
+ }
+ t.Execute(rw, data)
+}
+
+// ErrorHandler registers http.HandlerFunc to each http err code string.
+// usage:
+// beego.ErrorHandler("404",NotFound)
+// beego.ErrorHandler("500",InternalServerError)
+func ErrorHandler(code string, h http.HandlerFunc) *App {
+ ErrorMaps[code] = &errorInfo{
+ errorType: errorTypeHandler,
+ handler: h,
+ method: code,
+ }
+ return BeeApp
+}
+
+// ErrorController registers ControllerInterface to each http err code string.
+// usage:
+// beego.ErrorController(&controllers.ErrorController{})
+func ErrorController(c ControllerInterface) *App {
+ reflectVal := reflect.ValueOf(c)
+ rt := reflectVal.Type()
+ ct := reflect.Indirect(reflectVal).Type()
+ for i := 0; i < rt.NumMethod(); i++ {
+ methodName := rt.Method(i).Name
+ if !utils.InSlice(methodName, exceptMethod) && strings.HasPrefix(methodName, "Error") {
+ errName := strings.TrimPrefix(methodName, "Error")
+ ErrorMaps[errName] = &errorInfo{
+ errorType: errorTypeController,
+ controllerType: ct,
+ method: methodName,
+ }
+ }
+ }
+ return BeeApp
+}
+
+// Exception Write HttpStatus with errCode and Exec error handler if exist.
+func Exception(errCode uint64, ctx *context.Context) {
+ exception(strconv.FormatUint(errCode, 10), ctx)
+}
+
+// show error string as simple text message.
+// if error string is empty, show 503 or 500 error as default.
+func exception(errCode string, ctx *context.Context) {
+ atoi := func(code string) int {
+ v, err := strconv.Atoi(code)
+ if err == nil {
+ return v
+ }
+ if ctx.Output.Status == 0 {
+ return 503
+ }
+ return ctx.Output.Status
+ }
+
+ for _, ec := range []string{errCode, "503", "500"} {
+ if h, ok := ErrorMaps[ec]; ok {
+ executeError(h, ctx, atoi(ec))
+ return
+ }
+ }
+ //if 50x error has been removed from errorMap
+ ctx.ResponseWriter.WriteHeader(atoi(errCode))
+ ctx.WriteString(errCode)
+}
+
+func executeError(err *errorInfo, ctx *context.Context, code int) {
+ //make sure to log the error in the access log
+ LogAccess(ctx, nil, code)
+
+ if err.errorType == errorTypeHandler {
+ ctx.ResponseWriter.WriteHeader(code)
+ err.handler(ctx.ResponseWriter, ctx.Request)
+ return
+ }
+ if err.errorType == errorTypeController {
+ ctx.Output.SetStatus(code)
+ //Invoke the request handler
+ vc := reflect.New(err.controllerType)
+ execController, ok := vc.Interface().(ControllerInterface)
+ if !ok {
+ panic("controller is not ControllerInterface")
+ }
+ //call the controller init function
+ execController.Init(ctx, err.controllerType.Name(), err.method, vc.Interface())
+
+ //call prepare function
+ execController.Prepare()
+
+ execController.URLMapping()
+
+ method := vc.MethodByName(err.method)
+ method.Call([]reflect.Value{})
+
+ //render template
+ if BConfig.WebConfig.AutoRender {
+ if err := execController.Render(); err != nil {
+ panic(err)
+ }
+ }
+
+ // finish all runrouter. release resource
+ execController.Finish()
+ }
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/filter.go b/at-admin/vendor/github.com/astaxie/beego/filter.go
new file mode 100644
index 0000000..9cc6e91
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/filter.go
@@ -0,0 +1,44 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import "github.com/astaxie/beego/context"
+
+// FilterFunc defines a filter function which is invoked before the controller handler is executed.
+type FilterFunc func(*context.Context)
+
+// FilterRouter defines a filter operation which is invoked before the controller handler is executed.
+// It can match the URL against a pattern, and execute a filter function
+// when a request with a matching URL arrives.
+type FilterRouter struct {
+ filterFunc FilterFunc
+ tree *Tree
+ pattern string
+ returnOnOutput bool
+ resetParams bool
+}
+
+// ValidRouter checks if the current request is matched by this filter.
+// If the request is matched, the values of the URL parameters defined
+// by the filter pattern are also returned.
+func (f *FilterRouter) ValidRouter(url string, ctx *context.Context) bool {
+ isOk := f.tree.Match(url, ctx)
+ if isOk != nil {
+ if b, ok := isOk.(bool); ok {
+ return b
+ }
+ }
+ return false
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/flash.go b/at-admin/vendor/github.com/astaxie/beego/flash.go
new file mode 100644
index 0000000..a6485a1
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/flash.go
@@ -0,0 +1,110 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "fmt"
+ "net/url"
+ "strings"
+)
+
+// FlashData is a tools to maintain data when using across request.
+type FlashData struct {
+ Data map[string]string
+}
+
+// NewFlash return a new empty FlashData struct.
+func NewFlash() *FlashData {
+ return &FlashData{
+ Data: make(map[string]string),
+ }
+}
+
+// Set message to flash
+func (fd *FlashData) Set(key string, msg string, args ...interface{}) {
+ if len(args) == 0 {
+ fd.Data[key] = msg
+ } else {
+ fd.Data[key] = fmt.Sprintf(msg, args...)
+ }
+}
+
+// Success writes success message to flash.
+func (fd *FlashData) Success(msg string, args ...interface{}) {
+ if len(args) == 0 {
+ fd.Data["success"] = msg
+ } else {
+ fd.Data["success"] = fmt.Sprintf(msg, args...)
+ }
+}
+
+// Notice writes notice message to flash.
+func (fd *FlashData) Notice(msg string, args ...interface{}) {
+ if len(args) == 0 {
+ fd.Data["notice"] = msg
+ } else {
+ fd.Data["notice"] = fmt.Sprintf(msg, args...)
+ }
+}
+
+// Warning writes warning message to flash.
+func (fd *FlashData) Warning(msg string, args ...interface{}) {
+ if len(args) == 0 {
+ fd.Data["warning"] = msg
+ } else {
+ fd.Data["warning"] = fmt.Sprintf(msg, args...)
+ }
+}
+
+// Error writes error message to flash.
+func (fd *FlashData) Error(msg string, args ...interface{}) {
+ if len(args) == 0 {
+ fd.Data["error"] = msg
+ } else {
+ fd.Data["error"] = fmt.Sprintf(msg, args...)
+ }
+}
+
+// Store does the saving operation of flash data.
+// the data are encoded and saved in cookie.
+func (fd *FlashData) Store(c *Controller) {
+ c.Data["flash"] = fd.Data
+ var flashValue string
+ for key, value := range fd.Data {
+ flashValue += "\x00" + key + "\x23" + BConfig.WebConfig.FlashSeparator + "\x23" + value + "\x00"
+ }
+ c.Ctx.SetCookie(BConfig.WebConfig.FlashName, url.QueryEscape(flashValue), 0, "/")
+}
+
+// ReadFromRequest parsed flash data from encoded values in cookie.
+func ReadFromRequest(c *Controller) *FlashData {
+ flash := NewFlash()
+ if cookie, err := c.Ctx.Request.Cookie(BConfig.WebConfig.FlashName); err == nil {
+ v, _ := url.QueryUnescape(cookie.Value)
+ vals := strings.Split(v, "\x00")
+ for _, v := range vals {
+ if len(v) > 0 {
+ kv := strings.Split(v, "\x23"+BConfig.WebConfig.FlashSeparator+"\x23")
+ if len(kv) == 2 {
+ flash.Data[kv[0]] = kv[1]
+ }
+ }
+ }
+ //read one time then delete it
+ c.Ctx.SetCookie(BConfig.WebConfig.FlashName, "", -1, "/")
+ }
+ c.Data["flash"] = flash.Data
+ return flash
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/fs.go b/at-admin/vendor/github.com/astaxie/beego/fs.go
new file mode 100644
index 0000000..41cc6f6
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/fs.go
@@ -0,0 +1,74 @@
+package beego
+
+import (
+ "net/http"
+ "os"
+ "path/filepath"
+)
+
+type FileSystem struct {
+}
+
+func (d FileSystem) Open(name string) (http.File, error) {
+ return os.Open(name)
+}
+
+// Walk walks the file tree rooted at root in filesystem, calling walkFn for each file or
+// directory in the tree, including root. All errors that arise visiting files
+// and directories are filtered by walkFn.
+func Walk(fs http.FileSystem, root string, walkFn filepath.WalkFunc) error {
+
+ f, err := fs.Open(root)
+ if err != nil {
+ return err
+ }
+ info, err := f.Stat()
+ if err != nil {
+ err = walkFn(root, nil, err)
+ } else {
+ err = walk(fs, root, info, walkFn)
+ }
+ if err == filepath.SkipDir {
+ return nil
+ }
+ return err
+}
+
+// walk recursively descends path, calling walkFn.
+func walk(fs http.FileSystem, path string, info os.FileInfo, walkFn filepath.WalkFunc) error {
+ var err error
+ if !info.IsDir() {
+ return walkFn(path, info, nil)
+ }
+
+ dir, err := fs.Open(path)
+ if err != nil {
+ if err1 := walkFn(path, info, err); err1 != nil {
+ return err1
+ }
+ return err
+ }
+ defer dir.Close()
+ dirs, err := dir.Readdir(-1)
+ err1 := walkFn(path, info, err)
+ // If err != nil, walk can't walk into this directory.
+ // err1 != nil means walkFn want walk to skip this directory or stop walking.
+ // Therefore, if one of err and err1 isn't nil, walk will return.
+ if err != nil || err1 != nil {
+ // The caller's behavior is controlled by the return value, which is decided
+ // by walkFn. walkFn may ignore err and return nil.
+ // If walkFn returns SkipDir, it will be handled by the caller.
+ // So walk should return whatever walkFn returns.
+ return err1
+ }
+
+ for _, fileInfo := range dirs {
+ filename := filepath.Join(path, fileInfo.Name())
+ if err = walk(fs, filename, fileInfo, walkFn); err != nil {
+ if !fileInfo.IsDir() || err != filepath.SkipDir {
+ return err
+ }
+ }
+ }
+ return nil
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/go.mod b/at-admin/vendor/github.com/astaxie/beego/go.mod
new file mode 100644
index 0000000..fbdec12
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/go.mod
@@ -0,0 +1,39 @@
+module github.com/astaxie/beego
+
+require (
+ github.com/Knetic/govaluate v3.0.0+incompatible // indirect
+ github.com/OwnLocal/goes v1.0.0
+ github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd
+ github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542
+ github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737
+ github.com/casbin/casbin v1.7.0
+ github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58
+ github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb
+ github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c // indirect
+ github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a // indirect
+ github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76 // indirect
+ github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 // indirect
+ github.com/elazarl/go-bindata-assetfs v1.0.0
+ github.com/go-redis/redis v6.14.2+incompatible
+ github.com/go-sql-driver/mysql v1.4.1
+ github.com/gogo/protobuf v1.1.1
+ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
+ github.com/gomodule/redigo v2.0.0+incompatible
+ github.com/lib/pq v1.0.0
+ github.com/mattn/go-sqlite3 v1.10.0
+ github.com/pelletier/go-toml v1.2.0 // indirect
+ github.com/pkg/errors v0.8.0 // indirect
+ github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect
+ github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373
+ github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d // indirect
+ github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec
+ github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c // indirect
+ github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b // indirect
+ golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85
+ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a // indirect
+ gopkg.in/yaml.v2 v2.2.1
+)
+
+replace golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85
+
+replace gopkg.in/yaml.v2 v2.2.1 => github.com/go-yaml/yaml v0.0.0-20180328195020-5420a8b6744d
diff --git a/at-admin/vendor/github.com/astaxie/beego/go.sum b/at-admin/vendor/github.com/astaxie/beego/go.sum
new file mode 100644
index 0000000..ab23316
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/go.sum
@@ -0,0 +1,68 @@
+github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg=
+github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM=
+github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd h1:jZtX5jh5IOMu0fpOTC3ayh6QGSPJ/KWOv1lgPvbRw1M=
+github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
+github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542 h1:nYXb+3jF6Oq/j8R/y90XrKpreCxIalBWfeyeKymgOPk=
+github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
+github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff h1:/kO0p2RTGLB8R5gub7ps0GmYpB2O8LXEoPq8tzFDCUI=
+github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff/go.mod h1:PhH1ZhyCzHKt4uAasyx+ljRCgoezetRNf59CUtwUkqY=
+github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737 h1:rRISKWyXfVxvoa702s91Zl5oREZTrR3yv+tXrrX7G/g=
+github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
+github.com/casbin/casbin v1.7.0 h1:PuzlE8w0JBg/DhIqnkF1Dewf3z+qmUZMVN07PonvVUQ=
+github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
+github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb h1:w3RapLhkA5+km9Z8vUkC6VCaskduJXvXwJg5neKnfDU=
+github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
+github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c h1:K4FIibkr4//ziZKOKmt4RL0YImuTjLLBtwElf+F2lSQ=
+github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
+github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a h1:Y5XsLCEhtEI8qbD9RP3Qlv5FXdTDHxZM9UPUnMRgBp8=
+github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
+github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76 h1:Lgdd/Qp96Qj8jqLpq2cI1I1X7BJnu06efS+XkhRoLUQ=
+github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
+github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 h1:aaQcKT9WumO6JEJcRyTqFVq4XUZiUcKR2/GI31TOcz8=
+github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
+github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
+github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0=
+github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
+github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-yaml/yaml v0.0.0-20180328195020-5420a8b6744d h1:xy93KVe+KrIIwWDEAfQBdIfsiHJkepbYsDr+VY3g9/o=
+github.com/go-yaml/yaml v0.0.0-20180328195020-5420a8b6744d/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85 h1:B7ZbAFz7NOmvpUE5RGtu3u0WIizy5GdvbNpEf4RPnWs=
+github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:uZvAcrsnNaCxlh1HorK5dUQHGmEKPh2H/Rl1kehswPo=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
+github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM=
+github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
+github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373 h1:p6IxqQMjab30l4lb9mmkIkkcE1yv6o0SKbPhW5pxqHI=
+github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
+github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d h1:NVwnfyR3rENtlz62bcrkXME3INVUa4lcdGt+opvxExs=
+github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
+github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec h1:q6XVwXmKvCRHRqesF3cSv6lNqqHi0QWOvgDlSohg8UA=
+github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
+github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c h1:3eGShk3EQf5gJCYW+WzA0TEJQd37HLOmlYF7N0YJwv0=
+github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b h1:0Ve0/CCjiAiyKddUMUn3RwIGlq2iTW4GuVzyoKBYO/8=
+github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
+golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 h1:et7+NAX3lLIk5qUCTA9QelBjGE/NkhzYw/mhnr0s7nI=
+golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/at-admin/vendor/github.com/astaxie/beego/grace/grace.go b/at-admin/vendor/github.com/astaxie/beego/grace/grace.go
new file mode 100644
index 0000000..fb0cb7b
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/grace/grace.go
@@ -0,0 +1,166 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+// Package grace use to hot reload
+// Description: http://grisha.org/blog/2014/06/03/graceful-restart-in-golang/
+//
+// Usage:
+//
+// import(
+// "log"
+// "net/http"
+// "os"
+//
+// "github.com/astaxie/beego/grace"
+// )
+//
+// func handler(w http.ResponseWriter, r *http.Request) {
+// w.Write([]byte("WORLD!"))
+// }
+//
+// func main() {
+// mux := http.NewServeMux()
+// mux.HandleFunc("/hello", handler)
+//
+// err := grace.ListenAndServe("localhost:8080", mux)
+// if err != nil {
+// log.Println(err)
+// }
+// log.Println("Server on 8080 stopped")
+// os.Exit(0)
+// }
+package grace
+
+import (
+ "flag"
+ "net/http"
+ "os"
+ "strings"
+ "sync"
+ "syscall"
+ "time"
+)
+
+const (
+ // PreSignal is the position to add filter before signal
+ PreSignal = iota
+ // PostSignal is the position to add filter after signal
+ PostSignal
+ // StateInit represent the application inited
+ StateInit
+ // StateRunning represent the application is running
+ StateRunning
+ // StateShuttingDown represent the application is shutting down
+ StateShuttingDown
+ // StateTerminate represent the application is killed
+ StateTerminate
+)
+
+var (
+ regLock *sync.Mutex
+ runningServers map[string]*Server
+ runningServersOrder []string
+ socketPtrOffsetMap map[string]uint
+ runningServersForked bool
+
+ // DefaultReadTimeOut is the HTTP read timeout
+ DefaultReadTimeOut time.Duration
+ // DefaultWriteTimeOut is the HTTP Write timeout
+ DefaultWriteTimeOut time.Duration
+ // DefaultMaxHeaderBytes is the Max HTTP Header size, default is 0, no limit
+ DefaultMaxHeaderBytes int
+ // DefaultTimeout is the shutdown server's timeout. default is 60s
+ DefaultTimeout = 60 * time.Second
+
+ isChild bool
+ socketOrder string
+
+ hookableSignals []os.Signal
+)
+
+func init() {
+ flag.BoolVar(&isChild, "graceful", false, "listen on open fd (after forking)")
+ flag.StringVar(&socketOrder, "socketorder", "", "previous initialization order - used when more than one listener was started")
+
+ regLock = &sync.Mutex{}
+ runningServers = make(map[string]*Server)
+ runningServersOrder = []string{}
+ socketPtrOffsetMap = make(map[string]uint)
+
+ hookableSignals = []os.Signal{
+ syscall.SIGHUP,
+ syscall.SIGINT,
+ syscall.SIGTERM,
+ }
+}
+
+// NewServer returns a new graceServer.
+func NewServer(addr string, handler http.Handler) (srv *Server) {
+ regLock.Lock()
+ defer regLock.Unlock()
+
+ if !flag.Parsed() {
+ flag.Parse()
+ }
+ if len(socketOrder) > 0 {
+ for i, addr := range strings.Split(socketOrder, ",") {
+ socketPtrOffsetMap[addr] = uint(i)
+ }
+ } else {
+ socketPtrOffsetMap[addr] = uint(len(runningServersOrder))
+ }
+
+ srv = &Server{
+ sigChan: make(chan os.Signal),
+ isChild: isChild,
+ SignalHooks: map[int]map[os.Signal][]func(){
+ PreSignal: {
+ syscall.SIGHUP: {},
+ syscall.SIGINT: {},
+ syscall.SIGTERM: {},
+ },
+ PostSignal: {
+ syscall.SIGHUP: {},
+ syscall.SIGINT: {},
+ syscall.SIGTERM: {},
+ },
+ },
+ state: StateInit,
+ Network: "tcp",
+ terminalChan: make(chan error), //no cache channel
+ }
+ srv.Server = &http.Server{
+ Addr: addr,
+ ReadTimeout: DefaultReadTimeOut,
+ WriteTimeout: DefaultWriteTimeOut,
+ MaxHeaderBytes: DefaultMaxHeaderBytes,
+ Handler: handler,
+ }
+
+ runningServersOrder = append(runningServersOrder, addr)
+ runningServers[addr] = srv
+ return srv
+}
+
+// ListenAndServe refer http.ListenAndServe
+func ListenAndServe(addr string, handler http.Handler) error {
+ server := NewServer(addr, handler)
+ return server.ListenAndServe()
+}
+
+// ListenAndServeTLS refer http.ListenAndServeTLS
+func ListenAndServeTLS(addr string, certFile string, keyFile string, handler http.Handler) error {
+ server := NewServer(addr, handler)
+ return server.ListenAndServeTLS(certFile, keyFile)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/grace/server.go b/at-admin/vendor/github.com/astaxie/beego/grace/server.go
new file mode 100644
index 0000000..1ce8bc7
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/grace/server.go
@@ -0,0 +1,353 @@
+package grace
+
+import (
+ "context"
+ "crypto/tls"
+ "crypto/x509"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "net"
+ "net/http"
+ "os"
+ "os/exec"
+ "os/signal"
+ "strings"
+ "syscall"
+ "time"
+)
+
+// Server embedded http.Server
+type Server struct {
+ *http.Server
+ ln net.Listener
+ SignalHooks map[int]map[os.Signal][]func()
+ sigChan chan os.Signal
+ isChild bool
+ state uint8
+ Network string
+ terminalChan chan error
+}
+
+// Serve accepts incoming connections on the Listener l,
+// creating a new service goroutine for each.
+// The service goroutines read requests and then call srv.Handler to reply to them.
+func (srv *Server) Serve() (err error) {
+ srv.state = StateRunning
+ defer func() { srv.state = StateTerminate }()
+
+ // When Shutdown is called, Serve, ListenAndServe, and ListenAndServeTLS
+ // immediately return ErrServerClosed. Make sure the program doesn't exit
+ // and waits instead for Shutdown to return.
+ if err = srv.Server.Serve(srv.ln); err != nil && err != http.ErrServerClosed {
+ log.Println(syscall.Getpid(), "Server.Serve() error:", err)
+ return err
+ }
+
+ log.Println(syscall.Getpid(), srv.ln.Addr(), "Listener closed.")
+ // wait for Shutdown to return
+ return <-srv.terminalChan
+}
+
+// ListenAndServe listens on the TCP network address srv.Addr and then calls Serve
+// to handle requests on incoming connections. If srv.Addr is blank, ":http" is
+// used.
+func (srv *Server) ListenAndServe() (err error) {
+ addr := srv.Addr
+ if addr == "" {
+ addr = ":http"
+ }
+
+ go srv.handleSignals()
+
+ srv.ln, err = srv.getListener(addr)
+ if err != nil {
+ log.Println(err)
+ return err
+ }
+
+ if srv.isChild {
+ process, err := os.FindProcess(os.Getppid())
+ if err != nil {
+ log.Println(err)
+ return err
+ }
+ err = process.Signal(syscall.SIGTERM)
+ if err != nil {
+ return err
+ }
+ }
+
+ log.Println(os.Getpid(), srv.Addr)
+ return srv.Serve()
+}
+
+// ListenAndServeTLS listens on the TCP network address srv.Addr and then calls
+// Serve to handle requests on incoming TLS connections.
+//
+// Filenames containing a certificate and matching private key for the server must
+// be provided. If the certificate is signed by a certificate authority, the
+// certFile should be the concatenation of the server's certificate followed by the
+// CA's certificate.
+//
+// If srv.Addr is blank, ":https" is used.
+func (srv *Server) ListenAndServeTLS(certFile, keyFile string) (err error) {
+ addr := srv.Addr
+ if addr == "" {
+ addr = ":https"
+ }
+
+ if srv.TLSConfig == nil {
+ srv.TLSConfig = &tls.Config{}
+ }
+ if srv.TLSConfig.NextProtos == nil {
+ srv.TLSConfig.NextProtos = []string{"http/1.1"}
+ }
+
+ srv.TLSConfig.Certificates = make([]tls.Certificate, 1)
+ srv.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
+ if err != nil {
+ return
+ }
+
+ go srv.handleSignals()
+
+ ln, err := srv.getListener(addr)
+ if err != nil {
+ log.Println(err)
+ return err
+ }
+ srv.ln = tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, srv.TLSConfig)
+
+ if srv.isChild {
+ process, err := os.FindProcess(os.Getppid())
+ if err != nil {
+ log.Println(err)
+ return err
+ }
+ err = process.Signal(syscall.SIGTERM)
+ if err != nil {
+ return err
+ }
+ }
+
+ log.Println(os.Getpid(), srv.Addr)
+ return srv.Serve()
+}
+
+// ListenAndServeMutualTLS listens on the TCP network address srv.Addr and then calls
+// Serve to handle requests on incoming mutual TLS connections.
+func (srv *Server) ListenAndServeMutualTLS(certFile, keyFile, trustFile string) (err error) {
+ addr := srv.Addr
+ if addr == "" {
+ addr = ":https"
+ }
+
+ if srv.TLSConfig == nil {
+ srv.TLSConfig = &tls.Config{}
+ }
+ if srv.TLSConfig.NextProtos == nil {
+ srv.TLSConfig.NextProtos = []string{"http/1.1"}
+ }
+
+ srv.TLSConfig.Certificates = make([]tls.Certificate, 1)
+ srv.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
+ if err != nil {
+ return
+ }
+ srv.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert
+ pool := x509.NewCertPool()
+ data, err := ioutil.ReadFile(trustFile)
+ if err != nil {
+ log.Println(err)
+ return err
+ }
+ pool.AppendCertsFromPEM(data)
+ srv.TLSConfig.ClientCAs = pool
+ log.Println("Mutual HTTPS")
+ go srv.handleSignals()
+
+ ln, err := srv.getListener(addr)
+ if err != nil {
+ log.Println(err)
+ return err
+ }
+ srv.ln = tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, srv.TLSConfig)
+
+ if srv.isChild {
+ process, err := os.FindProcess(os.Getppid())
+ if err != nil {
+ log.Println(err)
+ return err
+ }
+ err = process.Kill()
+ if err != nil {
+ return err
+ }
+ }
+
+ log.Println(os.Getpid(), srv.Addr)
+ return srv.Serve()
+}
+
+// getListener either opens a new socket to listen on, or takes the acceptor socket
+// it got passed when restarted.
+func (srv *Server) getListener(laddr string) (l net.Listener, err error) {
+ if srv.isChild {
+ var ptrOffset uint
+ if len(socketPtrOffsetMap) > 0 {
+ ptrOffset = socketPtrOffsetMap[laddr]
+ log.Println("laddr", laddr, "ptr offset", socketPtrOffsetMap[laddr])
+ }
+
+ f := os.NewFile(uintptr(3+ptrOffset), "")
+ l, err = net.FileListener(f)
+ if err != nil {
+ err = fmt.Errorf("net.FileListener error: %v", err)
+ return
+ }
+ } else {
+ l, err = net.Listen(srv.Network, laddr)
+ if err != nil {
+ err = fmt.Errorf("net.Listen error: %v", err)
+ return
+ }
+ }
+ return
+}
+
+type tcpKeepAliveListener struct {
+ *net.TCPListener
+}
+
+func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
+ tc, err := ln.AcceptTCP()
+ if err != nil {
+ return
+ }
+ tc.SetKeepAlive(true)
+ tc.SetKeepAlivePeriod(3 * time.Minute)
+ return tc, nil
+}
+
+// handleSignals listens for os Signals and calls any hooked in function that the
+// user had registered with the signal.
+func (srv *Server) handleSignals() {
+ var sig os.Signal
+
+ signal.Notify(
+ srv.sigChan,
+ hookableSignals...,
+ )
+
+ pid := syscall.Getpid()
+ for {
+ sig = <-srv.sigChan
+ srv.signalHooks(PreSignal, sig)
+ switch sig {
+ case syscall.SIGHUP:
+ log.Println(pid, "Received SIGHUP. forking.")
+ err := srv.fork()
+ if err != nil {
+ log.Println("Fork err:", err)
+ }
+ case syscall.SIGINT:
+ log.Println(pid, "Received SIGINT.")
+ srv.shutdown()
+ case syscall.SIGTERM:
+ log.Println(pid, "Received SIGTERM.")
+ srv.shutdown()
+ default:
+ log.Printf("Received %v: nothing i care about...\n", sig)
+ }
+ srv.signalHooks(PostSignal, sig)
+ }
+}
+
+func (srv *Server) signalHooks(ppFlag int, sig os.Signal) {
+ if _, notSet := srv.SignalHooks[ppFlag][sig]; !notSet {
+ return
+ }
+ for _, f := range srv.SignalHooks[ppFlag][sig] {
+ f()
+ }
+}
+
+// shutdown closes the listener so that no new connections are accepted. it also
+// starts a goroutine that will serverTimeout (stop all running requests) the server
+// after DefaultTimeout.
+func (srv *Server) shutdown() {
+ if srv.state != StateRunning {
+ return
+ }
+
+ srv.state = StateShuttingDown
+ log.Println(syscall.Getpid(), "Waiting for connections to finish...")
+ ctx := context.Background()
+ if DefaultTimeout >= 0 {
+ var cancel context.CancelFunc
+ ctx, cancel = context.WithTimeout(context.Background(), DefaultTimeout)
+ defer cancel()
+ }
+ srv.terminalChan <- srv.Server.Shutdown(ctx)
+}
+
+func (srv *Server) fork() (err error) {
+ regLock.Lock()
+ defer regLock.Unlock()
+ if runningServersForked {
+ return
+ }
+ runningServersForked = true
+
+ var files = make([]*os.File, len(runningServers))
+ var orderArgs = make([]string, len(runningServers))
+ for _, srvPtr := range runningServers {
+ f, _ := srvPtr.ln.(*net.TCPListener).File()
+ files[socketPtrOffsetMap[srvPtr.Server.Addr]] = f
+ orderArgs[socketPtrOffsetMap[srvPtr.Server.Addr]] = srvPtr.Server.Addr
+ }
+
+ log.Println(files)
+ path := os.Args[0]
+ var args []string
+ if len(os.Args) > 1 {
+ for _, arg := range os.Args[1:] {
+ if arg == "-graceful" {
+ break
+ }
+ args = append(args, arg)
+ }
+ }
+ args = append(args, "-graceful")
+ if len(runningServers) > 1 {
+ args = append(args, fmt.Sprintf(`-socketorder=%s`, strings.Join(orderArgs, ",")))
+ log.Println(args)
+ }
+ cmd := exec.Command(path, args...)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.ExtraFiles = files
+ err = cmd.Start()
+ if err != nil {
+ log.Fatalf("Restart: Failed to launch, error: %v", err)
+ }
+
+ return
+}
+
+// RegisterSignalHook registers a function to be run PreSignal or PostSignal for a given signal.
+func (srv *Server) RegisterSignalHook(ppFlag int, sig os.Signal, f func()) (err error) {
+ if ppFlag != PreSignal && ppFlag != PostSignal {
+ err = fmt.Errorf("Invalid ppFlag argument. Must be either grace.PreSignal or grace.PostSignal")
+ return
+ }
+ for _, s := range hookableSignals {
+ if s == sig {
+ srv.SignalHooks[ppFlag][sig] = append(srv.SignalHooks[ppFlag][sig], f)
+ return
+ }
+ }
+ err = fmt.Errorf("Signal '%v' is not supported", sig)
+ return
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/hooks.go b/at-admin/vendor/github.com/astaxie/beego/hooks.go
new file mode 100644
index 0000000..b8671d3
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/hooks.go
@@ -0,0 +1,103 @@
+package beego
+
+import (
+ "encoding/json"
+ "mime"
+ "net/http"
+ "path/filepath"
+
+ "github.com/astaxie/beego/context"
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/session"
+)
+
+// register MIME type with content type
+func registerMime() error {
+ for k, v := range mimemaps {
+ mime.AddExtensionType(k, v)
+ }
+ return nil
+}
+
+// register default error http handlers, 404,401,403,500 and 503.
+func registerDefaultErrorHandler() error {
+ m := map[string]func(http.ResponseWriter, *http.Request){
+ "401": unauthorized,
+ "402": paymentRequired,
+ "403": forbidden,
+ "404": notFound,
+ "405": methodNotAllowed,
+ "500": internalServerError,
+ "501": notImplemented,
+ "502": badGateway,
+ "503": serviceUnavailable,
+ "504": gatewayTimeout,
+ "417": invalidxsrf,
+ "422": missingxsrf,
+ }
+ for e, h := range m {
+ if _, ok := ErrorMaps[e]; !ok {
+ ErrorHandler(e, h)
+ }
+ }
+ return nil
+}
+
+func registerSession() error {
+ if BConfig.WebConfig.Session.SessionOn {
+ var err error
+ sessionConfig := AppConfig.String("sessionConfig")
+ conf := new(session.ManagerConfig)
+ if sessionConfig == "" {
+ conf.CookieName = BConfig.WebConfig.Session.SessionName
+ conf.EnableSetCookie = BConfig.WebConfig.Session.SessionAutoSetCookie
+ conf.Gclifetime = BConfig.WebConfig.Session.SessionGCMaxLifetime
+ conf.Secure = BConfig.Listen.EnableHTTPS
+ conf.CookieLifeTime = BConfig.WebConfig.Session.SessionCookieLifeTime
+ conf.ProviderConfig = filepath.ToSlash(BConfig.WebConfig.Session.SessionProviderConfig)
+ conf.DisableHTTPOnly = BConfig.WebConfig.Session.SessionDisableHTTPOnly
+ conf.Domain = BConfig.WebConfig.Session.SessionDomain
+ conf.EnableSidInHTTPHeader = BConfig.WebConfig.Session.SessionEnableSidInHTTPHeader
+ conf.SessionNameInHTTPHeader = BConfig.WebConfig.Session.SessionNameInHTTPHeader
+ conf.EnableSidInURLQuery = BConfig.WebConfig.Session.SessionEnableSidInURLQuery
+ } else {
+ if err = json.Unmarshal([]byte(sessionConfig), conf); err != nil {
+ return err
+ }
+ }
+ if GlobalSessions, err = session.NewManager(BConfig.WebConfig.Session.SessionProvider, conf); err != nil {
+ return err
+ }
+ go GlobalSessions.GC()
+ }
+ return nil
+}
+
+func registerTemplate() error {
+ defer lockViewPaths()
+ if err := AddViewPath(BConfig.WebConfig.ViewsPath); err != nil {
+ if BConfig.RunMode == DEV {
+ logs.Warn(err)
+ }
+ return err
+ }
+ return nil
+}
+
+func registerAdmin() error {
+ if BConfig.Listen.EnableAdmin {
+ go beeAdminApp.Run()
+ }
+ return nil
+}
+
+func registerGzip() error {
+ if BConfig.EnableGzip {
+ context.InitGzip(
+ AppConfig.DefaultInt("gzipMinLength", -1),
+ AppConfig.DefaultInt("gzipCompressLevel", -1),
+ AppConfig.DefaultStrings("includedMethods", []string{"GET"}),
+ )
+ }
+ return nil
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/log.go b/at-admin/vendor/github.com/astaxie/beego/log.go
new file mode 100644
index 0000000..cc4c0f8
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/log.go
@@ -0,0 +1,127 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "strings"
+
+ "github.com/astaxie/beego/logs"
+)
+
+// Log levels to control the logging output.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+const (
+ LevelEmergency = iota
+ LevelAlert
+ LevelCritical
+ LevelError
+ LevelWarning
+ LevelNotice
+ LevelInformational
+ LevelDebug
+)
+
+// BeeLogger references the used application logger.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+var BeeLogger = logs.GetBeeLogger()
+
+// SetLevel sets the global log level used by the simple logger.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func SetLevel(l int) {
+ logs.SetLevel(l)
+}
+
+// SetLogFuncCall set the CallDepth, default is 3
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func SetLogFuncCall(b bool) {
+ logs.SetLogFuncCall(b)
+}
+
+// SetLogger sets a new logger.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func SetLogger(adaptername string, config string) error {
+ return logs.SetLogger(adaptername, config)
+}
+
+// Emergency logs a message at emergency level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Emergency(v ...interface{}) {
+ logs.Emergency(generateFmtStr(len(v)), v...)
+}
+
+// Alert logs a message at alert level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Alert(v ...interface{}) {
+ logs.Alert(generateFmtStr(len(v)), v...)
+}
+
+// Critical logs a message at critical level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Critical(v ...interface{}) {
+ logs.Critical(generateFmtStr(len(v)), v...)
+}
+
+// Error logs a message at error level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Error(v ...interface{}) {
+ logs.Error(generateFmtStr(len(v)), v...)
+}
+
+// Warning logs a message at warning level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Warning(v ...interface{}) {
+ logs.Warning(generateFmtStr(len(v)), v...)
+}
+
+// Warn compatibility alias for Warning()
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Warn(v ...interface{}) {
+ logs.Warn(generateFmtStr(len(v)), v...)
+}
+
+// Notice logs a message at notice level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Notice(v ...interface{}) {
+ logs.Notice(generateFmtStr(len(v)), v...)
+}
+
+// Informational logs a message at info level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Informational(v ...interface{}) {
+ logs.Informational(generateFmtStr(len(v)), v...)
+}
+
+// Info compatibility alias for Warning()
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Info(v ...interface{}) {
+ logs.Info(generateFmtStr(len(v)), v...)
+}
+
+// Debug logs a message at debug level.
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Debug(v ...interface{}) {
+ logs.Debug(generateFmtStr(len(v)), v...)
+}
+
+// Trace logs a message at trace level.
+// compatibility alias for Warning()
+// Deprecated: use github.com/astaxie/beego/logs instead.
+func Trace(v ...interface{}) {
+ logs.Trace(generateFmtStr(len(v)), v...)
+}
+
+func generateFmtStr(n int) string {
+ return strings.Repeat("%v ", n)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/README.md b/at-admin/vendor/github.com/astaxie/beego/logs/README.md
new file mode 100644
index 0000000..c05bcc0
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/README.md
@@ -0,0 +1,72 @@
+## logs
+logs is a Go logs manager. It can use many logs adapters. The repo is inspired by `database/sql` .
+
+
+## How to install?
+
+ go get github.com/astaxie/beego/logs
+
+
+## What adapters are supported?
+
+As of now this logs support console, file,smtp and conn.
+
+
+## How to use it?
+
+First you must import it
+
+```golang
+import (
+ "github.com/astaxie/beego/logs"
+)
+```
+
+Then init a Log (example with console adapter)
+
+```golang
+log := logs.NewLogger(10000)
+log.SetLogger("console", "")
+```
+
+> the first params stand for how many channel
+
+Use it like this:
+
+```golang
+log.Trace("trace")
+log.Info("info")
+log.Warn("warning")
+log.Debug("debug")
+log.Critical("critical")
+```
+
+## File adapter
+
+Configure file adapter like this:
+
+```golang
+log := NewLogger(10000)
+log.SetLogger("file", `{"filename":"test.log"}`)
+```
+
+## Conn adapter
+
+Configure like this:
+
+```golang
+log := NewLogger(1000)
+log.SetLogger("conn", `{"net":"tcp","addr":":7020"}`)
+log.Info("info")
+```
+
+## Smtp adapter
+
+Configure like this:
+
+```golang
+log := NewLogger(10000)
+log.SetLogger("smtp", `{"username":"beegotest@gmail.com","password":"xxxxxxxx","host":"smtp.gmail.com:587","sendTos":["xiemengjun@gmail.com"]}`)
+log.Critical("sendmail critical")
+time.Sleep(time.Second * 30)
+```
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/accesslog.go b/at-admin/vendor/github.com/astaxie/beego/logs/accesslog.go
new file mode 100644
index 0000000..3ff9e20
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/accesslog.go
@@ -0,0 +1,83 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package logs
+
+import (
+ "bytes"
+ "strings"
+ "encoding/json"
+ "fmt"
+ "time"
+)
+
+const (
+ apacheFormatPattern = "%s - - [%s] \"%s %d %d\" %f %s %s"
+ apacheFormat = "APACHE_FORMAT"
+ jsonFormat = "JSON_FORMAT"
+)
+
+// AccessLogRecord struct for holding access log data.
+type AccessLogRecord struct {
+ RemoteAddr string `json:"remote_addr"`
+ RequestTime time.Time `json:"request_time"`
+ RequestMethod string `json:"request_method"`
+ Request string `json:"request"`
+ ServerProtocol string `json:"server_protocol"`
+ Host string `json:"host"`
+ Status int `json:"status"`
+ BodyBytesSent int64 `json:"body_bytes_sent"`
+ ElapsedTime time.Duration `json:"elapsed_time"`
+ HTTPReferrer string `json:"http_referrer"`
+ HTTPUserAgent string `json:"http_user_agent"`
+ RemoteUser string `json:"remote_user"`
+}
+
+func (r *AccessLogRecord) json() ([]byte, error) {
+ buffer := &bytes.Buffer{}
+ encoder := json.NewEncoder(buffer)
+ disableEscapeHTML(encoder)
+
+ err := encoder.Encode(r)
+ return buffer.Bytes(), err
+}
+
+func disableEscapeHTML(i interface{}) {
+ if e, ok := i.(interface {
+ SetEscapeHTML(bool)
+ }); ok {
+ e.SetEscapeHTML(false)
+ }
+}
+
+// AccessLog - Format and print access log.
+func AccessLog(r *AccessLogRecord, format string) {
+ var msg string
+ switch format {
+ case apacheFormat:
+ timeFormatted := r.RequestTime.Format("02/Jan/2006 03:04:05")
+ msg = fmt.Sprintf(apacheFormatPattern, r.RemoteAddr, timeFormatted, r.Request, r.Status, r.BodyBytesSent,
+ r.ElapsedTime.Seconds(), r.HTTPReferrer, r.HTTPUserAgent)
+ case jsonFormat:
+ fallthrough
+ default:
+ jsonData, err := r.json()
+ if err != nil {
+ msg = fmt.Sprintf(`{"Error": "%s"}`, err)
+ } else {
+ msg = string(jsonData)
+ }
+ }
+ beeLogger.writeMsg(levelLoggerImpl, strings.TrimSpace(msg))
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/conn.go b/at-admin/vendor/github.com/astaxie/beego/logs/conn.go
new file mode 100644
index 0000000..afe0cbb
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/conn.go
@@ -0,0 +1,117 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package logs
+
+import (
+ "encoding/json"
+ "io"
+ "net"
+ "time"
+)
+
+// connWriter implements LoggerInterface.
+// it writes messages in keep-live tcp connection.
+type connWriter struct {
+ lg *logWriter
+ innerWriter io.WriteCloser
+ ReconnectOnMsg bool `json:"reconnectOnMsg"`
+ Reconnect bool `json:"reconnect"`
+ Net string `json:"net"`
+ Addr string `json:"addr"`
+ Level int `json:"level"`
+}
+
+// NewConn create new ConnWrite returning as LoggerInterface.
+func NewConn() Logger {
+ conn := new(connWriter)
+ conn.Level = LevelTrace
+ return conn
+}
+
+// Init init connection writer with json config.
+// json config only need key "level".
+func (c *connWriter) Init(jsonConfig string) error {
+ return json.Unmarshal([]byte(jsonConfig), c)
+}
+
+// WriteMsg write message in connection.
+// if connection is down, try to re-connect.
+func (c *connWriter) WriteMsg(when time.Time, msg string, level int) error {
+ if level > c.Level {
+ return nil
+ }
+ if c.needToConnectOnMsg() {
+ err := c.connect()
+ if err != nil {
+ return err
+ }
+ }
+
+ if c.ReconnectOnMsg {
+ defer c.innerWriter.Close()
+ }
+
+ c.lg.writeln(when, msg)
+ return nil
+}
+
+// Flush implementing method. empty.
+func (c *connWriter) Flush() {
+
+}
+
+// Destroy destroy connection writer and close tcp listener.
+func (c *connWriter) Destroy() {
+ if c.innerWriter != nil {
+ c.innerWriter.Close()
+ }
+}
+
+func (c *connWriter) connect() error {
+ if c.innerWriter != nil {
+ c.innerWriter.Close()
+ c.innerWriter = nil
+ }
+
+ conn, err := net.Dial(c.Net, c.Addr)
+ if err != nil {
+ return err
+ }
+
+ if tcpConn, ok := conn.(*net.TCPConn); ok {
+ tcpConn.SetKeepAlive(true)
+ }
+
+ c.innerWriter = conn
+ c.lg = newLogWriter(conn)
+ return nil
+}
+
+func (c *connWriter) needToConnectOnMsg() bool {
+ if c.Reconnect {
+ c.Reconnect = false
+ return true
+ }
+
+ if c.innerWriter == nil {
+ return true
+ }
+
+ return c.ReconnectOnMsg
+}
+
+func init() {
+ Register(AdapterConn, NewConn)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/console.go b/at-admin/vendor/github.com/astaxie/beego/logs/console.go
new file mode 100644
index 0000000..3dcaee1
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/console.go
@@ -0,0 +1,99 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package logs
+
+import (
+ "encoding/json"
+ "os"
+ "strings"
+ "time"
+
+ "github.com/shiena/ansicolor"
+)
+
+// brush is a color join function
+type brush func(string) string
+
+// newBrush return a fix color Brush
+func newBrush(color string) brush {
+ pre := "\033["
+ reset := "\033[0m"
+ return func(text string) string {
+ return pre + color + "m" + text + reset
+ }
+}
+
+var colors = []brush{
+ newBrush("1;37"), // Emergency white
+ newBrush("1;36"), // Alert cyan
+ newBrush("1;35"), // Critical magenta
+ newBrush("1;31"), // Error red
+ newBrush("1;33"), // Warning yellow
+ newBrush("1;32"), // Notice green
+ newBrush("1;34"), // Informational blue
+ newBrush("1;44"), // Debug Background blue
+}
+
+// consoleWriter implements LoggerInterface and writes messages to terminal.
+type consoleWriter struct {
+ lg *logWriter
+ Level int `json:"level"`
+ Colorful bool `json:"color"` //this filed is useful only when system's terminal supports color
+}
+
+// NewConsole create ConsoleWriter returning as LoggerInterface.
+func NewConsole() Logger {
+ cw := &consoleWriter{
+ lg: newLogWriter(ansicolor.NewAnsiColorWriter(os.Stdout)),
+ Level: LevelDebug,
+ Colorful: true,
+ }
+ return cw
+}
+
+// Init init console logger.
+// jsonConfig like '{"level":LevelTrace}'.
+func (c *consoleWriter) Init(jsonConfig string) error {
+ if len(jsonConfig) == 0 {
+ return nil
+ }
+ return json.Unmarshal([]byte(jsonConfig), c)
+}
+
+// WriteMsg write message in console.
+func (c *consoleWriter) WriteMsg(when time.Time, msg string, level int) error {
+ if level > c.Level {
+ return nil
+ }
+ if c.Colorful {
+ msg = strings.Replace(msg, levelPrefix[level], colors[level](levelPrefix[level]), 1)
+ }
+ c.lg.writeln(when, msg)
+ return nil
+}
+
+// Destroy implementing method. empty.
+func (c *consoleWriter) Destroy() {
+
+}
+
+// Flush implementing method. empty.
+func (c *consoleWriter) Flush() {
+
+}
+
+func init() {
+ Register(AdapterConsole, NewConsole)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/file.go b/at-admin/vendor/github.com/astaxie/beego/logs/file.go
new file mode 100644
index 0000000..588f786
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/file.go
@@ -0,0 +1,405 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package logs
+
+import (
+ "bytes"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "path"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+)
+
+// fileLogWriter implements LoggerInterface.
+// It writes messages by lines limit, file size limit, or time frequency.
+type fileLogWriter struct {
+ sync.RWMutex // write log order by order and atomic incr maxLinesCurLines and maxSizeCurSize
+ // The opened file
+ Filename string `json:"filename"`
+ fileWriter *os.File
+
+ // Rotate at line
+ MaxLines int `json:"maxlines"`
+ maxLinesCurLines int
+
+ MaxFiles int `json:"maxfiles"`
+ MaxFilesCurFiles int
+
+ // Rotate at size
+ MaxSize int `json:"maxsize"`
+ maxSizeCurSize int
+
+ // Rotate daily
+ Daily bool `json:"daily"`
+ MaxDays int64 `json:"maxdays"`
+ dailyOpenDate int
+ dailyOpenTime time.Time
+
+ // Rotate hourly
+ Hourly bool `json:"hourly"`
+ MaxHours int64 `json:"maxhours"`
+ hourlyOpenDate int
+ hourlyOpenTime time.Time
+
+ Rotate bool `json:"rotate"`
+
+ Level int `json:"level"`
+
+ Perm string `json:"perm"`
+
+ RotatePerm string `json:"rotateperm"`
+
+ fileNameOnly, suffix string // like "project.log", project is fileNameOnly and .log is suffix
+}
+
+// newFileWriter create a FileLogWriter returning as LoggerInterface.
+func newFileWriter() Logger {
+ w := &fileLogWriter{
+ Daily: true,
+ MaxDays: 7,
+ Hourly: false,
+ MaxHours: 168,
+ Rotate: true,
+ RotatePerm: "0440",
+ Level: LevelTrace,
+ Perm: "0660",
+ MaxLines: 10000000,
+ MaxFiles: 999,
+ MaxSize: 1 << 28,
+ }
+ return w
+}
+
+// Init file logger with json config.
+// jsonConfig like:
+// {
+// "filename":"logs/beego.log",
+// "maxLines":10000,
+// "maxsize":1024,
+// "daily":true,
+// "maxDays":15,
+// "rotate":true,
+// "perm":"0600"
+// }
+func (w *fileLogWriter) Init(jsonConfig string) error {
+ err := json.Unmarshal([]byte(jsonConfig), w)
+ if err != nil {
+ return err
+ }
+ if len(w.Filename) == 0 {
+ return errors.New("jsonconfig must have filename")
+ }
+ w.suffix = filepath.Ext(w.Filename)
+ w.fileNameOnly = strings.TrimSuffix(w.Filename, w.suffix)
+ if w.suffix == "" {
+ w.suffix = ".log"
+ }
+ err = w.startLogger()
+ return err
+}
+
+// start file logger. create log file and set to locker-inside file writer.
+func (w *fileLogWriter) startLogger() error {
+ file, err := w.createLogFile()
+ if err != nil {
+ return err
+ }
+ if w.fileWriter != nil {
+ w.fileWriter.Close()
+ }
+ w.fileWriter = file
+ return w.initFd()
+}
+
+func (w *fileLogWriter) needRotateDaily(size int, day int) bool {
+ return (w.MaxLines > 0 && w.maxLinesCurLines >= w.MaxLines) ||
+ (w.MaxSize > 0 && w.maxSizeCurSize >= w.MaxSize) ||
+ (w.Daily && day != w.dailyOpenDate)
+}
+
+func (w *fileLogWriter) needRotateHourly(size int, hour int) bool {
+ return (w.MaxLines > 0 && w.maxLinesCurLines >= w.MaxLines) ||
+ (w.MaxSize > 0 && w.maxSizeCurSize >= w.MaxSize) ||
+ (w.Hourly && hour != w.hourlyOpenDate)
+
+}
+
+// WriteMsg write logger message into file.
+func (w *fileLogWriter) WriteMsg(when time.Time, msg string, level int) error {
+ if level > w.Level {
+ return nil
+ }
+ hd, d, h := formatTimeHeader(when)
+ msg = string(hd) + msg + "\n"
+ if w.Rotate {
+ w.RLock()
+ if w.needRotateHourly(len(msg), h) {
+ w.RUnlock()
+ w.Lock()
+ if w.needRotateHourly(len(msg), h) {
+ if err := w.doRotate(when); err != nil {
+ fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
+ }
+ }
+ w.Unlock()
+ } else if w.needRotateDaily(len(msg), d) {
+ w.RUnlock()
+ w.Lock()
+ if w.needRotateDaily(len(msg), d) {
+ if err := w.doRotate(when); err != nil {
+ fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
+ }
+ }
+ w.Unlock()
+ } else {
+ w.RUnlock()
+ }
+ }
+
+ w.Lock()
+ _, err := w.fileWriter.Write([]byte(msg))
+ if err == nil {
+ w.maxLinesCurLines++
+ w.maxSizeCurSize += len(msg)
+ }
+ w.Unlock()
+ return err
+}
+
+func (w *fileLogWriter) createLogFile() (*os.File, error) {
+ // Open the log file
+ perm, err := strconv.ParseInt(w.Perm, 8, 64)
+ if err != nil {
+ return nil, err
+ }
+
+ filepath := path.Dir(w.Filename)
+ os.MkdirAll(filepath, os.FileMode(perm))
+
+ fd, err := os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(perm))
+ if err == nil {
+ // Make sure file perm is user set perm cause of `os.OpenFile` will obey umask
+ os.Chmod(w.Filename, os.FileMode(perm))
+ }
+ return fd, err
+}
+
+func (w *fileLogWriter) initFd() error {
+ fd := w.fileWriter
+ fInfo, err := fd.Stat()
+ if err != nil {
+ return fmt.Errorf("get stat err: %s", err)
+ }
+ w.maxSizeCurSize = int(fInfo.Size())
+ w.dailyOpenTime = time.Now()
+ w.dailyOpenDate = w.dailyOpenTime.Day()
+ w.hourlyOpenTime = time.Now()
+ w.hourlyOpenDate = w.hourlyOpenTime.Hour()
+ w.maxLinesCurLines = 0
+ if w.Hourly {
+ go w.hourlyRotate(w.hourlyOpenTime)
+ } else if w.Daily {
+ go w.dailyRotate(w.dailyOpenTime)
+ }
+ if fInfo.Size() > 0 && w.MaxLines > 0 {
+ count, err := w.lines()
+ if err != nil {
+ return err
+ }
+ w.maxLinesCurLines = count
+ }
+ return nil
+}
+
+func (w *fileLogWriter) dailyRotate(openTime time.Time) {
+ y, m, d := openTime.Add(24 * time.Hour).Date()
+ nextDay := time.Date(y, m, d, 0, 0, 0, 0, openTime.Location())
+ tm := time.NewTimer(time.Duration(nextDay.UnixNano() - openTime.UnixNano() + 100))
+ <-tm.C
+ w.Lock()
+ if w.needRotateDaily(0, time.Now().Day()) {
+ if err := w.doRotate(time.Now()); err != nil {
+ fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
+ }
+ }
+ w.Unlock()
+}
+
+func (w *fileLogWriter) hourlyRotate(openTime time.Time) {
+ y, m, d := openTime.Add(1 * time.Hour).Date()
+ h, _, _ := openTime.Add(1 * time.Hour).Clock()
+ nextHour := time.Date(y, m, d, h, 0, 0, 0, openTime.Location())
+ tm := time.NewTimer(time.Duration(nextHour.UnixNano() - openTime.UnixNano() + 100))
+ <-tm.C
+ w.Lock()
+ if w.needRotateHourly(0, time.Now().Hour()) {
+ if err := w.doRotate(time.Now()); err != nil {
+ fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
+ }
+ }
+ w.Unlock()
+}
+
+func (w *fileLogWriter) lines() (int, error) {
+ fd, err := os.Open(w.Filename)
+ if err != nil {
+ return 0, err
+ }
+ defer fd.Close()
+
+ buf := make([]byte, 32768) // 32k
+ count := 0
+ lineSep := []byte{'\n'}
+
+ for {
+ c, err := fd.Read(buf)
+ if err != nil && err != io.EOF {
+ return count, err
+ }
+
+ count += bytes.Count(buf[:c], lineSep)
+
+ if err == io.EOF {
+ break
+ }
+ }
+
+ return count, nil
+}
+
+// DoRotate means it need to write file in new file.
+// new file name like xx.2013-01-01.log (daily) or xx.001.log (by line or size)
+func (w *fileLogWriter) doRotate(logTime time.Time) error {
+ // file exists
+ // Find the next available number
+ num := w.MaxFilesCurFiles + 1
+ fName := ""
+ format := ""
+ var openTime time.Time
+ rotatePerm, err := strconv.ParseInt(w.RotatePerm, 8, 64)
+ if err != nil {
+ return err
+ }
+
+ _, err = os.Lstat(w.Filename)
+ if err != nil {
+ //even if the file is not exist or other ,we should RESTART the logger
+ goto RESTART_LOGGER
+ }
+
+ if w.Hourly {
+ format = "2006010215"
+ openTime = w.hourlyOpenTime
+ } else if w.Daily {
+ format = "2006-01-02"
+ openTime = w.dailyOpenTime
+ }
+
+ // only when one of them be setted, then the file would be splited
+ if w.MaxLines > 0 || w.MaxSize > 0 {
+ for ; err == nil && num <= w.MaxFiles; num++ {
+ fName = w.fileNameOnly + fmt.Sprintf(".%s.%03d%s", logTime.Format(format), num, w.suffix)
+ _, err = os.Lstat(fName)
+ }
+ } else {
+ fName = w.fileNameOnly + fmt.Sprintf(".%s.%03d%s", openTime.Format(format), num, w.suffix)
+ _, err = os.Lstat(fName)
+ w.MaxFilesCurFiles = num
+ }
+
+ // return error if the last file checked still existed
+ if err == nil {
+ return fmt.Errorf("Rotate: Cannot find free log number to rename %s", w.Filename)
+ }
+
+ // close fileWriter before rename
+ w.fileWriter.Close()
+
+ // Rename the file to its new found name
+ // even if occurs error,we MUST guarantee to restart new logger
+ err = os.Rename(w.Filename, fName)
+ if err != nil {
+ goto RESTART_LOGGER
+ }
+
+ err = os.Chmod(fName, os.FileMode(rotatePerm))
+
+RESTART_LOGGER:
+
+ startLoggerErr := w.startLogger()
+ go w.deleteOldLog()
+
+ if startLoggerErr != nil {
+ return fmt.Errorf("Rotate StartLogger: %s", startLoggerErr)
+ }
+ if err != nil {
+ return fmt.Errorf("Rotate: %s", err)
+ }
+ return nil
+}
+
+func (w *fileLogWriter) deleteOldLog() {
+ dir := filepath.Dir(w.Filename)
+ filepath.Walk(dir, func(path string, info os.FileInfo, err error) (returnErr error) {
+ defer func() {
+ if r := recover(); r != nil {
+ fmt.Fprintf(os.Stderr, "Unable to delete old log '%s', error: %v\n", path, r)
+ }
+ }()
+
+ if info == nil {
+ return
+ }
+ if w.Hourly {
+ if !info.IsDir() && info.ModTime().Add(1 * time.Hour * time.Duration(w.MaxHours)).Before(time.Now()) {
+ if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) &&
+ strings.HasSuffix(filepath.Base(path), w.suffix) {
+ os.Remove(path)
+ }
+ }
+ } else if w.Daily {
+ if !info.IsDir() && info.ModTime().Add(24 * time.Hour * time.Duration(w.MaxDays)).Before(time.Now()) {
+ if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) &&
+ strings.HasSuffix(filepath.Base(path), w.suffix) {
+ os.Remove(path)
+ }
+ }
+ }
+ return
+ })
+}
+
+// Destroy close the file description, close file writer.
+func (w *fileLogWriter) Destroy() {
+ w.fileWriter.Close()
+}
+
+// Flush flush file logger.
+// there are no buffering messages in file logger in memory.
+// flush file means sync file from disk.
+func (w *fileLogWriter) Flush() {
+ w.fileWriter.Sync()
+}
+
+func init() {
+ Register(AdapterFile, newFileWriter)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/jianliao.go b/at-admin/vendor/github.com/astaxie/beego/logs/jianliao.go
new file mode 100644
index 0000000..88ba0f9
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/jianliao.go
@@ -0,0 +1,72 @@
+package logs
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/url"
+ "time"
+)
+
+// JLWriter implements beego LoggerInterface and is used to send jiaoliao webhook
+type JLWriter struct {
+ AuthorName string `json:"authorname"`
+ Title string `json:"title"`
+ WebhookURL string `json:"webhookurl"`
+ RedirectURL string `json:"redirecturl,omitempty"`
+ ImageURL string `json:"imageurl,omitempty"`
+ Level int `json:"level"`
+}
+
+// newJLWriter create jiaoliao writer.
+func newJLWriter() Logger {
+ return &JLWriter{Level: LevelTrace}
+}
+
+// Init JLWriter with json config string
+func (s *JLWriter) Init(jsonconfig string) error {
+ return json.Unmarshal([]byte(jsonconfig), s)
+}
+
+// WriteMsg write message in smtp writer.
+// it will send an email with subject and only this message.
+func (s *JLWriter) WriteMsg(when time.Time, msg string, level int) error {
+ if level > s.Level {
+ return nil
+ }
+
+ text := fmt.Sprintf("%s %s", when.Format("2006-01-02 15:04:05"), msg)
+
+ form := url.Values{}
+ form.Add("authorName", s.AuthorName)
+ form.Add("title", s.Title)
+ form.Add("text", text)
+ if s.RedirectURL != "" {
+ form.Add("redirectUrl", s.RedirectURL)
+ }
+ if s.ImageURL != "" {
+ form.Add("imageUrl", s.ImageURL)
+ }
+
+ resp, err := http.PostForm(s.WebhookURL, form)
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+ if resp.StatusCode != http.StatusOK {
+ return fmt.Errorf("Post webhook failed %s %d", resp.Status, resp.StatusCode)
+ }
+ return nil
+}
+
+// Flush implementing method. empty.
+func (s *JLWriter) Flush() {
+}
+
+// Destroy implementing method. empty.
+func (s *JLWriter) Destroy() {
+}
+
+func init() {
+ Register(AdapterJianLiao, newJLWriter)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/log.go b/at-admin/vendor/github.com/astaxie/beego/logs/log.go
new file mode 100644
index 0000000..49f3794
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/log.go
@@ -0,0 +1,665 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+// Package logs provide a general log interface
+// Usage:
+//
+// import "github.com/astaxie/beego/logs"
+//
+// log := NewLogger(10000)
+// log.SetLogger("console", "")
+//
+// > the first params stand for how many channel
+//
+// Use it like this:
+//
+// log.Trace("trace")
+// log.Info("info")
+// log.Warn("warning")
+// log.Debug("debug")
+// log.Critical("critical")
+//
+// more docs http://beego.me/docs/module/logs.md
+package logs
+
+import (
+ "fmt"
+ "log"
+ "os"
+ "path"
+ "runtime"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+)
+
+// RFC5424 log message levels.
+const (
+ LevelEmergency = iota
+ LevelAlert
+ LevelCritical
+ LevelError
+ LevelWarning
+ LevelNotice
+ LevelInformational
+ LevelDebug
+)
+
+// levelLogLogger is defined to implement log.Logger
+// the real log level will be LevelEmergency
+const levelLoggerImpl = -1
+
+// Name for adapter with beego official support
+const (
+ AdapterConsole = "console"
+ AdapterFile = "file"
+ AdapterMultiFile = "multifile"
+ AdapterMail = "smtp"
+ AdapterConn = "conn"
+ AdapterEs = "es"
+ AdapterJianLiao = "jianliao"
+ AdapterSlack = "slack"
+ AdapterAliLS = "alils"
+)
+
+// Legacy log level constants to ensure backwards compatibility.
+const (
+ LevelInfo = LevelInformational
+ LevelTrace = LevelDebug
+ LevelWarn = LevelWarning
+)
+
+type newLoggerFunc func() Logger
+
+// Logger defines the behavior of a log provider.
+type Logger interface {
+ Init(config string) error
+ WriteMsg(when time.Time, msg string, level int) error
+ Destroy()
+ Flush()
+}
+
+var adapters = make(map[string]newLoggerFunc)
+var levelPrefix = [LevelDebug + 1]string{"[M]", "[A]", "[C]", "[E]", "[W]", "[N]", "[I]", "[D]"}
+
+// Register makes a log provide available by the provided name.
+// If Register is called twice with the same name or if driver is nil,
+// it panics.
+func Register(name string, log newLoggerFunc) {
+ if log == nil {
+ panic("logs: Register provide is nil")
+ }
+ if _, dup := adapters[name]; dup {
+ panic("logs: Register called twice for provider " + name)
+ }
+ adapters[name] = log
+}
+
+// BeeLogger is default logger in beego application.
+// it can contain several providers and log message into all providers.
+type BeeLogger struct {
+ lock sync.Mutex
+ level int
+ init bool
+ enableFuncCallDepth bool
+ loggerFuncCallDepth int
+ asynchronous bool
+ prefix string
+ msgChanLen int64
+ msgChan chan *logMsg
+ signalChan chan string
+ wg sync.WaitGroup
+ outputs []*nameLogger
+}
+
+const defaultAsyncMsgLen = 1e3
+
+type nameLogger struct {
+ Logger
+ name string
+}
+
+type logMsg struct {
+ level int
+ msg string
+ when time.Time
+}
+
+var logMsgPool *sync.Pool
+
+// NewLogger returns a new BeeLogger.
+// channelLen means the number of messages in chan(used where asynchronous is true).
+// if the buffering chan is full, logger adapters write to file or other way.
+func NewLogger(channelLens ...int64) *BeeLogger {
+ bl := new(BeeLogger)
+ bl.level = LevelDebug
+ bl.loggerFuncCallDepth = 2
+ bl.msgChanLen = append(channelLens, 0)[0]
+ if bl.msgChanLen <= 0 {
+ bl.msgChanLen = defaultAsyncMsgLen
+ }
+ bl.signalChan = make(chan string, 1)
+ bl.setLogger(AdapterConsole)
+ return bl
+}
+
+// Async set the log to asynchronous and start the goroutine
+func (bl *BeeLogger) Async(msgLen ...int64) *BeeLogger {
+ bl.lock.Lock()
+ defer bl.lock.Unlock()
+ if bl.asynchronous {
+ return bl
+ }
+ bl.asynchronous = true
+ if len(msgLen) > 0 && msgLen[0] > 0 {
+ bl.msgChanLen = msgLen[0]
+ }
+ bl.msgChan = make(chan *logMsg, bl.msgChanLen)
+ logMsgPool = &sync.Pool{
+ New: func() interface{} {
+ return &logMsg{}
+ },
+ }
+ bl.wg.Add(1)
+ go bl.startLogger()
+ return bl
+}
+
+// SetLogger provides a given logger adapter into BeeLogger with config string.
+// config need to be correct JSON as string: {"interval":360}.
+func (bl *BeeLogger) setLogger(adapterName string, configs ...string) error {
+ config := append(configs, "{}")[0]
+ for _, l := range bl.outputs {
+ if l.name == adapterName {
+ return fmt.Errorf("logs: duplicate adaptername %q (you have set this logger before)", adapterName)
+ }
+ }
+
+ logAdapter, ok := adapters[adapterName]
+ if !ok {
+ return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName)
+ }
+
+ lg := logAdapter()
+ err := lg.Init(config)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, "logs.BeeLogger.SetLogger: "+err.Error())
+ return err
+ }
+ bl.outputs = append(bl.outputs, &nameLogger{name: adapterName, Logger: lg})
+ return nil
+}
+
+// SetLogger provides a given logger adapter into BeeLogger with config string.
+// config need to be correct JSON as string: {"interval":360}.
+func (bl *BeeLogger) SetLogger(adapterName string, configs ...string) error {
+ bl.lock.Lock()
+ defer bl.lock.Unlock()
+ if !bl.init {
+ bl.outputs = []*nameLogger{}
+ bl.init = true
+ }
+ return bl.setLogger(adapterName, configs...)
+}
+
+// DelLogger remove a logger adapter in BeeLogger.
+func (bl *BeeLogger) DelLogger(adapterName string) error {
+ bl.lock.Lock()
+ defer bl.lock.Unlock()
+ outputs := []*nameLogger{}
+ for _, lg := range bl.outputs {
+ if lg.name == adapterName {
+ lg.Destroy()
+ } else {
+ outputs = append(outputs, lg)
+ }
+ }
+ if len(outputs) == len(bl.outputs) {
+ return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName)
+ }
+ bl.outputs = outputs
+ return nil
+}
+
+func (bl *BeeLogger) writeToLoggers(when time.Time, msg string, level int) {
+ for _, l := range bl.outputs {
+ err := l.WriteMsg(when, msg, level)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "unable to WriteMsg to adapter:%v,error:%v\n", l.name, err)
+ }
+ }
+}
+
+func (bl *BeeLogger) Write(p []byte) (n int, err error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
+ // writeMsg will always add a '\n' character
+ if p[len(p)-1] == '\n' {
+ p = p[0 : len(p)-1]
+ }
+ // set levelLoggerImpl to ensure all log message will be write out
+ err = bl.writeMsg(levelLoggerImpl, string(p))
+ if err == nil {
+ return len(p), err
+ }
+ return 0, err
+}
+
+func (bl *BeeLogger) writeMsg(logLevel int, msg string, v ...interface{}) error {
+ if !bl.init {
+ bl.lock.Lock()
+ bl.setLogger(AdapterConsole)
+ bl.lock.Unlock()
+ }
+
+ if len(v) > 0 {
+ msg = fmt.Sprintf(msg, v...)
+ }
+
+ msg = bl.prefix + " " + msg
+
+ when := time.Now()
+ if bl.enableFuncCallDepth {
+ _, file, line, ok := runtime.Caller(bl.loggerFuncCallDepth)
+ if !ok {
+ file = "???"
+ line = 0
+ }
+ _, filename := path.Split(file)
+ msg = "[" + filename + ":" + strconv.Itoa(line) + "] " + msg
+ }
+
+ //set level info in front of filename info
+ if logLevel == levelLoggerImpl {
+ // set to emergency to ensure all log will be print out correctly
+ logLevel = LevelEmergency
+ } else {
+ msg = levelPrefix[logLevel] + " " + msg
+ }
+
+ if bl.asynchronous {
+ lm := logMsgPool.Get().(*logMsg)
+ lm.level = logLevel
+ lm.msg = msg
+ lm.when = when
+ bl.msgChan <- lm
+ } else {
+ bl.writeToLoggers(when, msg, logLevel)
+ }
+ return nil
+}
+
+// SetLevel Set log message level.
+// If message level (such as LevelDebug) is higher than logger level (such as LevelWarning),
+// log providers will not even be sent the message.
+func (bl *BeeLogger) SetLevel(l int) {
+ bl.level = l
+}
+
+// GetLevel Get Current log message level.
+func (bl *BeeLogger) GetLevel() int {
+ return bl.level
+}
+
+// SetLogFuncCallDepth set log funcCallDepth
+func (bl *BeeLogger) SetLogFuncCallDepth(d int) {
+ bl.loggerFuncCallDepth = d
+}
+
+// GetLogFuncCallDepth return log funcCallDepth for wrapper
+func (bl *BeeLogger) GetLogFuncCallDepth() int {
+ return bl.loggerFuncCallDepth
+}
+
+// EnableFuncCallDepth enable log funcCallDepth
+func (bl *BeeLogger) EnableFuncCallDepth(b bool) {
+ bl.enableFuncCallDepth = b
+}
+
+// set prefix
+func (bl *BeeLogger) SetPrefix(s string) {
+ bl.prefix = s
+}
+
+// start logger chan reading.
+// when chan is not empty, write logs.
+func (bl *BeeLogger) startLogger() {
+ gameOver := false
+ for {
+ select {
+ case bm := <-bl.msgChan:
+ bl.writeToLoggers(bm.when, bm.msg, bm.level)
+ logMsgPool.Put(bm)
+ case sg := <-bl.signalChan:
+ // Now should only send "flush" or "close" to bl.signalChan
+ bl.flush()
+ if sg == "close" {
+ for _, l := range bl.outputs {
+ l.Destroy()
+ }
+ bl.outputs = nil
+ gameOver = true
+ }
+ bl.wg.Done()
+ }
+ if gameOver {
+ break
+ }
+ }
+}
+
+// Emergency Log EMERGENCY level message.
+func (bl *BeeLogger) Emergency(format string, v ...interface{}) {
+ if LevelEmergency > bl.level {
+ return
+ }
+ bl.writeMsg(LevelEmergency, format, v...)
+}
+
+// Alert Log ALERT level message.
+func (bl *BeeLogger) Alert(format string, v ...interface{}) {
+ if LevelAlert > bl.level {
+ return
+ }
+ bl.writeMsg(LevelAlert, format, v...)
+}
+
+// Critical Log CRITICAL level message.
+func (bl *BeeLogger) Critical(format string, v ...interface{}) {
+ if LevelCritical > bl.level {
+ return
+ }
+ bl.writeMsg(LevelCritical, format, v...)
+}
+
+// Error Log ERROR level message.
+func (bl *BeeLogger) Error(format string, v ...interface{}) {
+ if LevelError > bl.level {
+ return
+ }
+ bl.writeMsg(LevelError, format, v...)
+}
+
+// Warning Log WARNING level message.
+func (bl *BeeLogger) Warning(format string, v ...interface{}) {
+ if LevelWarn > bl.level {
+ return
+ }
+ bl.writeMsg(LevelWarn, format, v...)
+}
+
+// Notice Log NOTICE level message.
+func (bl *BeeLogger) Notice(format string, v ...interface{}) {
+ if LevelNotice > bl.level {
+ return
+ }
+ bl.writeMsg(LevelNotice, format, v...)
+}
+
+// Informational Log INFORMATIONAL level message.
+func (bl *BeeLogger) Informational(format string, v ...interface{}) {
+ if LevelInfo > bl.level {
+ return
+ }
+ bl.writeMsg(LevelInfo, format, v...)
+}
+
+// Debug Log DEBUG level message.
+func (bl *BeeLogger) Debug(format string, v ...interface{}) {
+ if LevelDebug > bl.level {
+ return
+ }
+ bl.writeMsg(LevelDebug, format, v...)
+}
+
+// Warn Log WARN level message.
+// compatibility alias for Warning()
+func (bl *BeeLogger) Warn(format string, v ...interface{}) {
+ if LevelWarn > bl.level {
+ return
+ }
+ bl.writeMsg(LevelWarn, format, v...)
+}
+
+// Info Log INFO level message.
+// compatibility alias for Informational()
+func (bl *BeeLogger) Info(format string, v ...interface{}) {
+ if LevelInfo > bl.level {
+ return
+ }
+ bl.writeMsg(LevelInfo, format, v...)
+}
+
+// Trace Log TRACE level message.
+// compatibility alias for Debug()
+func (bl *BeeLogger) Trace(format string, v ...interface{}) {
+ if LevelDebug > bl.level {
+ return
+ }
+ bl.writeMsg(LevelDebug, format, v...)
+}
+
+// Flush flush all chan data.
+func (bl *BeeLogger) Flush() {
+ if bl.asynchronous {
+ bl.signalChan <- "flush"
+ bl.wg.Wait()
+ bl.wg.Add(1)
+ return
+ }
+ bl.flush()
+}
+
+// Close close logger, flush all chan data and destroy all adapters in BeeLogger.
+func (bl *BeeLogger) Close() {
+ if bl.asynchronous {
+ bl.signalChan <- "close"
+ bl.wg.Wait()
+ close(bl.msgChan)
+ } else {
+ bl.flush()
+ for _, l := range bl.outputs {
+ l.Destroy()
+ }
+ bl.outputs = nil
+ }
+ close(bl.signalChan)
+}
+
+// Reset close all outputs, and set bl.outputs to nil
+func (bl *BeeLogger) Reset() {
+ bl.Flush()
+ for _, l := range bl.outputs {
+ l.Destroy()
+ }
+ bl.outputs = nil
+}
+
+func (bl *BeeLogger) flush() {
+ if bl.asynchronous {
+ for {
+ if len(bl.msgChan) > 0 {
+ bm := <-bl.msgChan
+ bl.writeToLoggers(bm.when, bm.msg, bm.level)
+ logMsgPool.Put(bm)
+ continue
+ }
+ break
+ }
+ }
+ for _, l := range bl.outputs {
+ l.Flush()
+ }
+}
+
+// beeLogger references the used application logger.
+var beeLogger = NewLogger()
+
+// GetBeeLogger returns the default BeeLogger
+func GetBeeLogger() *BeeLogger {
+ return beeLogger
+}
+
+var beeLoggerMap = struct {
+ sync.RWMutex
+ logs map[string]*log.Logger
+}{
+ logs: map[string]*log.Logger{},
+}
+
+// GetLogger returns the default BeeLogger
+func GetLogger(prefixes ...string) *log.Logger {
+ prefix := append(prefixes, "")[0]
+ if prefix != "" {
+ prefix = fmt.Sprintf(`[%s] `, strings.ToUpper(prefix))
+ }
+ beeLoggerMap.RLock()
+ l, ok := beeLoggerMap.logs[prefix]
+ if ok {
+ beeLoggerMap.RUnlock()
+ return l
+ }
+ beeLoggerMap.RUnlock()
+ beeLoggerMap.Lock()
+ defer beeLoggerMap.Unlock()
+ l, ok = beeLoggerMap.logs[prefix]
+ if !ok {
+ l = log.New(beeLogger, prefix, 0)
+ beeLoggerMap.logs[prefix] = l
+ }
+ return l
+}
+
+// Reset will remove all the adapter
+func Reset() {
+ beeLogger.Reset()
+}
+
+// Async set the beelogger with Async mode and hold msglen messages
+func Async(msgLen ...int64) *BeeLogger {
+ return beeLogger.Async(msgLen...)
+}
+
+// SetLevel sets the global log level used by the simple logger.
+func SetLevel(l int) {
+ beeLogger.SetLevel(l)
+}
+
+// SetPrefix sets the prefix
+func SetPrefix(s string) {
+ beeLogger.SetPrefix(s)
+}
+
+// EnableFuncCallDepth enable log funcCallDepth
+func EnableFuncCallDepth(b bool) {
+ beeLogger.enableFuncCallDepth = b
+}
+
+// SetLogFuncCall set the CallDepth, default is 4
+func SetLogFuncCall(b bool) {
+ beeLogger.EnableFuncCallDepth(b)
+ beeLogger.SetLogFuncCallDepth(4)
+}
+
+// SetLogFuncCallDepth set log funcCallDepth
+func SetLogFuncCallDepth(d int) {
+ beeLogger.loggerFuncCallDepth = d
+}
+
+// SetLogger sets a new logger.
+func SetLogger(adapter string, config ...string) error {
+ return beeLogger.SetLogger(adapter, config...)
+}
+
+// Emergency logs a message at emergency level.
+func Emergency(f interface{}, v ...interface{}) {
+ beeLogger.Emergency(formatLog(f, v...))
+}
+
+// Alert logs a message at alert level.
+func Alert(f interface{}, v ...interface{}) {
+ beeLogger.Alert(formatLog(f, v...))
+}
+
+// Critical logs a message at critical level.
+func Critical(f interface{}, v ...interface{}) {
+ beeLogger.Critical(formatLog(f, v...))
+}
+
+// Error logs a message at error level.
+func Error(f interface{}, v ...interface{}) {
+ beeLogger.Error(formatLog(f, v...))
+}
+
+// Warning logs a message at warning level.
+func Warning(f interface{}, v ...interface{}) {
+ beeLogger.Warn(formatLog(f, v...))
+}
+
+// Warn compatibility alias for Warning()
+func Warn(f interface{}, v ...interface{}) {
+ beeLogger.Warn(formatLog(f, v...))
+}
+
+// Notice logs a message at notice level.
+func Notice(f interface{}, v ...interface{}) {
+ beeLogger.Notice(formatLog(f, v...))
+}
+
+// Informational logs a message at info level.
+func Informational(f interface{}, v ...interface{}) {
+ beeLogger.Info(formatLog(f, v...))
+}
+
+// Info compatibility alias for Warning()
+func Info(f interface{}, v ...interface{}) {
+ beeLogger.Info(formatLog(f, v...))
+}
+
+// Debug logs a message at debug level.
+func Debug(f interface{}, v ...interface{}) {
+ beeLogger.Debug(formatLog(f, v...))
+}
+
+// Trace logs a message at trace level.
+// compatibility alias for Warning()
+func Trace(f interface{}, v ...interface{}) {
+ beeLogger.Trace(formatLog(f, v...))
+}
+
+func formatLog(f interface{}, v ...interface{}) string {
+ var msg string
+ switch f.(type) {
+ case string:
+ msg = f.(string)
+ if len(v) == 0 {
+ return msg
+ }
+ if strings.Contains(msg, "%") && !strings.Contains(msg, "%%") {
+ //format string
+ } else {
+ //do not contain format char
+ msg += strings.Repeat(" %v", len(v))
+ }
+ default:
+ msg = fmt.Sprint(f)
+ if len(v) == 0 {
+ return msg
+ }
+ msg += strings.Repeat(" %v", len(v))
+ }
+ return fmt.Sprintf(msg, v...)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/logger.go b/at-admin/vendor/github.com/astaxie/beego/logs/logger.go
new file mode 100644
index 0000000..c7cf8a5
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/logger.go
@@ -0,0 +1,175 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package logs
+
+import (
+ "io"
+ "runtime"
+ "sync"
+ "time"
+)
+
+type logWriter struct {
+ sync.Mutex
+ writer io.Writer
+}
+
+func newLogWriter(wr io.Writer) *logWriter {
+ return &logWriter{writer: wr}
+}
+
+func (lg *logWriter) writeln(when time.Time, msg string) {
+ lg.Lock()
+ h, _, _ := formatTimeHeader(when)
+ lg.writer.Write(append(append(h, msg...), '\n'))
+ lg.Unlock()
+}
+
+const (
+ y1 = `0123456789`
+ y2 = `0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789`
+ y3 = `0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999`
+ y4 = `0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789`
+ mo1 = `000000000111`
+ mo2 = `123456789012`
+ d1 = `0000000001111111111222222222233`
+ d2 = `1234567890123456789012345678901`
+ h1 = `000000000011111111112222`
+ h2 = `012345678901234567890123`
+ mi1 = `000000000011111111112222222222333333333344444444445555555555`
+ mi2 = `012345678901234567890123456789012345678901234567890123456789`
+ s1 = `000000000011111111112222222222333333333344444444445555555555`
+ s2 = `012345678901234567890123456789012345678901234567890123456789`
+ ns1 = `0123456789`
+)
+
+func formatTimeHeader(when time.Time) ([]byte, int, int) {
+ y, mo, d := when.Date()
+ h, mi, s := when.Clock()
+ ns := when.Nanosecond() / 1000000
+ //len("2006/01/02 15:04:05.123 ")==24
+ var buf [24]byte
+
+ buf[0] = y1[y/1000%10]
+ buf[1] = y2[y/100]
+ buf[2] = y3[y-y/100*100]
+ buf[3] = y4[y-y/100*100]
+ buf[4] = '/'
+ buf[5] = mo1[mo-1]
+ buf[6] = mo2[mo-1]
+ buf[7] = '/'
+ buf[8] = d1[d-1]
+ buf[9] = d2[d-1]
+ buf[10] = ' '
+ buf[11] = h1[h]
+ buf[12] = h2[h]
+ buf[13] = ':'
+ buf[14] = mi1[mi]
+ buf[15] = mi2[mi]
+ buf[16] = ':'
+ buf[17] = s1[s]
+ buf[18] = s2[s]
+ buf[19] = '.'
+ buf[20] = ns1[ns/100]
+ buf[21] = ns1[ns%100/10]
+ buf[22] = ns1[ns%10]
+
+ buf[23] = ' '
+
+ return buf[0:], d, h
+}
+
+var (
+ green = string([]byte{27, 91, 57, 55, 59, 52, 50, 109})
+ white = string([]byte{27, 91, 57, 48, 59, 52, 55, 109})
+ yellow = string([]byte{27, 91, 57, 55, 59, 52, 51, 109})
+ red = string([]byte{27, 91, 57, 55, 59, 52, 49, 109})
+ blue = string([]byte{27, 91, 57, 55, 59, 52, 52, 109})
+ magenta = string([]byte{27, 91, 57, 55, 59, 52, 53, 109})
+ cyan = string([]byte{27, 91, 57, 55, 59, 52, 54, 109})
+
+ w32Green = string([]byte{27, 91, 52, 50, 109})
+ w32White = string([]byte{27, 91, 52, 55, 109})
+ w32Yellow = string([]byte{27, 91, 52, 51, 109})
+ w32Red = string([]byte{27, 91, 52, 49, 109})
+ w32Blue = string([]byte{27, 91, 52, 52, 109})
+ w32Magenta = string([]byte{27, 91, 52, 53, 109})
+ w32Cyan = string([]byte{27, 91, 52, 54, 109})
+
+ reset = string([]byte{27, 91, 48, 109})
+)
+
+var once sync.Once
+var colorMap map[string]string
+
+func initColor() {
+ if runtime.GOOS == "windows" {
+ green = w32Green
+ white = w32White
+ yellow = w32Yellow
+ red = w32Red
+ blue = w32Blue
+ magenta = w32Magenta
+ cyan = w32Cyan
+ }
+ colorMap = map[string]string{
+ //by color
+ "green": green,
+ "white": white,
+ "yellow": yellow,
+ "red": red,
+ //by method
+ "GET": blue,
+ "POST": cyan,
+ "PUT": yellow,
+ "DELETE": red,
+ "PATCH": green,
+ "HEAD": magenta,
+ "OPTIONS": white,
+ }
+}
+
+// ColorByStatus return color by http code
+// 2xx return Green
+// 3xx return White
+// 4xx return Yellow
+// 5xx return Red
+func ColorByStatus(code int) string {
+ once.Do(initColor)
+ switch {
+ case code >= 200 && code < 300:
+ return colorMap["green"]
+ case code >= 300 && code < 400:
+ return colorMap["white"]
+ case code >= 400 && code < 500:
+ return colorMap["yellow"]
+ default:
+ return colorMap["red"]
+ }
+}
+
+// ColorByMethod return color by http code
+func ColorByMethod(method string) string {
+ once.Do(initColor)
+ if c := colorMap[method]; c != "" {
+ return c
+ }
+ return reset
+}
+
+// ResetColor return reset color
+func ResetColor() string {
+ return reset
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/multifile.go b/at-admin/vendor/github.com/astaxie/beego/logs/multifile.go
new file mode 100644
index 0000000..9016827
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/multifile.go
@@ -0,0 +1,119 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package logs
+
+import (
+ "encoding/json"
+ "time"
+)
+
+// A filesLogWriter manages several fileLogWriter
+// filesLogWriter will write logs to the file in json configuration and write the same level log to correspond file
+// means if the file name in configuration is project.log filesLogWriter will create project.error.log/project.debug.log
+// and write the error-level logs to project.error.log and write the debug-level logs to project.debug.log
+// the rotate attribute also acts like fileLogWriter
+type multiFileLogWriter struct {
+ writers [LevelDebug + 1 + 1]*fileLogWriter // the last one for fullLogWriter
+ fullLogWriter *fileLogWriter
+ Separate []string `json:"separate"`
+}
+
+var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"}
+
+// Init file logger with json config.
+// jsonConfig like:
+// {
+// "filename":"logs/beego.log",
+// "maxLines":0,
+// "maxsize":0,
+// "daily":true,
+// "maxDays":15,
+// "rotate":true,
+// "perm":0600,
+// "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"],
+// }
+
+func (f *multiFileLogWriter) Init(config string) error {
+ writer := newFileWriter().(*fileLogWriter)
+ err := writer.Init(config)
+ if err != nil {
+ return err
+ }
+ f.fullLogWriter = writer
+ f.writers[LevelDebug+1] = writer
+
+ //unmarshal "separate" field to f.Separate
+ json.Unmarshal([]byte(config), f)
+
+ jsonMap := map[string]interface{}{}
+ json.Unmarshal([]byte(config), &jsonMap)
+
+ for i := LevelEmergency; i < LevelDebug+1; i++ {
+ for _, v := range f.Separate {
+ if v == levelNames[i] {
+ jsonMap["filename"] = f.fullLogWriter.fileNameOnly + "." + levelNames[i] + f.fullLogWriter.suffix
+ jsonMap["level"] = i
+ bs, _ := json.Marshal(jsonMap)
+ writer = newFileWriter().(*fileLogWriter)
+ err := writer.Init(string(bs))
+ if err != nil {
+ return err
+ }
+ f.writers[i] = writer
+ }
+ }
+ }
+
+ return nil
+}
+
+func (f *multiFileLogWriter) Destroy() {
+ for i := 0; i < len(f.writers); i++ {
+ if f.writers[i] != nil {
+ f.writers[i].Destroy()
+ }
+ }
+}
+
+func (f *multiFileLogWriter) WriteMsg(when time.Time, msg string, level int) error {
+ if f.fullLogWriter != nil {
+ f.fullLogWriter.WriteMsg(when, msg, level)
+ }
+ for i := 0; i < len(f.writers)-1; i++ {
+ if f.writers[i] != nil {
+ if level == f.writers[i].Level {
+ f.writers[i].WriteMsg(when, msg, level)
+ }
+ }
+ }
+ return nil
+}
+
+func (f *multiFileLogWriter) Flush() {
+ for i := 0; i < len(f.writers); i++ {
+ if f.writers[i] != nil {
+ f.writers[i].Flush()
+ }
+ }
+}
+
+// newFilesWriter create a FileLogWriter returning as LoggerInterface.
+func newFilesWriter() Logger {
+ return &multiFileLogWriter{}
+}
+
+func init() {
+ Register(AdapterMultiFile, newFilesWriter)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/slack.go b/at-admin/vendor/github.com/astaxie/beego/logs/slack.go
new file mode 100644
index 0000000..1cd2e5a
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/slack.go
@@ -0,0 +1,60 @@
+package logs
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/url"
+ "time"
+)
+
+// SLACKWriter implements beego LoggerInterface and is used to send jiaoliao webhook
+type SLACKWriter struct {
+ WebhookURL string `json:"webhookurl"`
+ Level int `json:"level"`
+}
+
+// newSLACKWriter create jiaoliao writer.
+func newSLACKWriter() Logger {
+ return &SLACKWriter{Level: LevelTrace}
+}
+
+// Init SLACKWriter with json config string
+func (s *SLACKWriter) Init(jsonconfig string) error {
+ return json.Unmarshal([]byte(jsonconfig), s)
+}
+
+// WriteMsg write message in smtp writer.
+// it will send an email with subject and only this message.
+func (s *SLACKWriter) WriteMsg(when time.Time, msg string, level int) error {
+ if level > s.Level {
+ return nil
+ }
+
+ text := fmt.Sprintf("{\"text\": \"%s %s\"}", when.Format("2006-01-02 15:04:05"), msg)
+
+ form := url.Values{}
+ form.Add("payload", text)
+
+ resp, err := http.PostForm(s.WebhookURL, form)
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+ if resp.StatusCode != http.StatusOK {
+ return fmt.Errorf("Post webhook failed %s %d", resp.Status, resp.StatusCode)
+ }
+ return nil
+}
+
+// Flush implementing method. empty.
+func (s *SLACKWriter) Flush() {
+}
+
+// Destroy implementing method. empty.
+func (s *SLACKWriter) Destroy() {
+}
+
+func init() {
+ Register(AdapterSlack, newSLACKWriter)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/logs/smtp.go b/at-admin/vendor/github.com/astaxie/beego/logs/smtp.go
new file mode 100644
index 0000000..6208d7b
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/logs/smtp.go
@@ -0,0 +1,149 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package logs
+
+import (
+ "crypto/tls"
+ "encoding/json"
+ "fmt"
+ "net"
+ "net/smtp"
+ "strings"
+ "time"
+)
+
+// SMTPWriter implements LoggerInterface and is used to send emails via given SMTP-server.
+type SMTPWriter struct {
+ Username string `json:"username"`
+ Password string `json:"password"`
+ Host string `json:"host"`
+ Subject string `json:"subject"`
+ FromAddress string `json:"fromAddress"`
+ RecipientAddresses []string `json:"sendTos"`
+ Level int `json:"level"`
+}
+
+// NewSMTPWriter create smtp writer.
+func newSMTPWriter() Logger {
+ return &SMTPWriter{Level: LevelTrace}
+}
+
+// Init smtp writer with json config.
+// config like:
+// {
+// "username":"example@gmail.com",
+// "password:"password",
+// "host":"smtp.gmail.com:465",
+// "subject":"email title",
+// "fromAddress":"from@example.com",
+// "sendTos":["email1","email2"],
+// "level":LevelError
+// }
+func (s *SMTPWriter) Init(jsonconfig string) error {
+ return json.Unmarshal([]byte(jsonconfig), s)
+}
+
+func (s *SMTPWriter) getSMTPAuth(host string) smtp.Auth {
+ if len(strings.Trim(s.Username, " ")) == 0 && len(strings.Trim(s.Password, " ")) == 0 {
+ return nil
+ }
+ return smtp.PlainAuth(
+ "",
+ s.Username,
+ s.Password,
+ host,
+ )
+}
+
+func (s *SMTPWriter) sendMail(hostAddressWithPort string, auth smtp.Auth, fromAddress string, recipients []string, msgContent []byte) error {
+ client, err := smtp.Dial(hostAddressWithPort)
+ if err != nil {
+ return err
+ }
+
+ host, _, _ := net.SplitHostPort(hostAddressWithPort)
+ tlsConn := &tls.Config{
+ InsecureSkipVerify: true,
+ ServerName: host,
+ }
+ if err = client.StartTLS(tlsConn); err != nil {
+ return err
+ }
+
+ if auth != nil {
+ if err = client.Auth(auth); err != nil {
+ return err
+ }
+ }
+
+ if err = client.Mail(fromAddress); err != nil {
+ return err
+ }
+
+ for _, rec := range recipients {
+ if err = client.Rcpt(rec); err != nil {
+ return err
+ }
+ }
+
+ w, err := client.Data()
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(msgContent)
+ if err != nil {
+ return err
+ }
+
+ err = w.Close()
+ if err != nil {
+ return err
+ }
+
+ return client.Quit()
+}
+
+// WriteMsg write message in smtp writer.
+// it will send an email with subject and only this message.
+func (s *SMTPWriter) WriteMsg(when time.Time, msg string, level int) error {
+ if level > s.Level {
+ return nil
+ }
+
+ hp := strings.Split(s.Host, ":")
+
+ // Set up authentication information.
+ auth := s.getSMTPAuth(hp[0])
+
+ // Connect to the server, authenticate, set the sender and recipient,
+ // and send the email all in one step.
+ contentType := "Content-Type: text/plain" + "; charset=UTF-8"
+ mailmsg := []byte("To: " + strings.Join(s.RecipientAddresses, ";") + "\r\nFrom: " + s.FromAddress + "<" + s.FromAddress +
+ ">\r\nSubject: " + s.Subject + "\r\n" + contentType + "\r\n\r\n" + fmt.Sprintf(".%s", when.Format("2006-01-02 15:04:05")) + msg)
+
+ return s.sendMail(s.Host, auth, s.FromAddress, s.RecipientAddresses, mailmsg)
+}
+
+// Flush implementing method. empty.
+func (s *SMTPWriter) Flush() {
+}
+
+// Destroy implementing method. empty.
+func (s *SMTPWriter) Destroy() {
+}
+
+func init() {
+ Register(AdapterMail, newSMTPWriter)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/mime.go b/at-admin/vendor/github.com/astaxie/beego/mime.go
new file mode 100644
index 0000000..ca2878a
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/mime.go
@@ -0,0 +1,556 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+var mimemaps = map[string]string{
+ ".3dm": "x-world/x-3dmf",
+ ".3dmf": "x-world/x-3dmf",
+ ".7z": "application/x-7z-compressed",
+ ".a": "application/octet-stream",
+ ".aab": "application/x-authorware-bin",
+ ".aam": "application/x-authorware-map",
+ ".aas": "application/x-authorware-seg",
+ ".abc": "text/vndabc",
+ ".ace": "application/x-ace-compressed",
+ ".acgi": "text/html",
+ ".afl": "video/animaflex",
+ ".ai": "application/postscript",
+ ".aif": "audio/aiff",
+ ".aifc": "audio/aiff",
+ ".aiff": "audio/aiff",
+ ".aim": "application/x-aim",
+ ".aip": "text/x-audiosoft-intra",
+ ".alz": "application/x-alz-compressed",
+ ".ani": "application/x-navi-animation",
+ ".aos": "application/x-nokia-9000-communicator-add-on-software",
+ ".aps": "application/mime",
+ ".apk": "application/vnd.android.package-archive",
+ ".arc": "application/x-arc-compressed",
+ ".arj": "application/arj",
+ ".art": "image/x-jg",
+ ".asf": "video/x-ms-asf",
+ ".asm": "text/x-asm",
+ ".asp": "text/asp",
+ ".asx": "application/x-mplayer2",
+ ".au": "audio/basic",
+ ".avi": "video/x-msvideo",
+ ".avs": "video/avs-video",
+ ".bcpio": "application/x-bcpio",
+ ".bin": "application/mac-binary",
+ ".bmp": "image/bmp",
+ ".boo": "application/book",
+ ".book": "application/book",
+ ".boz": "application/x-bzip2",
+ ".bsh": "application/x-bsh",
+ ".bz2": "application/x-bzip2",
+ ".bz": "application/x-bzip",
+ ".c++": "text/plain",
+ ".c": "text/x-c",
+ ".cab": "application/vnd.ms-cab-compressed",
+ ".cat": "application/vndms-pkiseccat",
+ ".cc": "text/x-c",
+ ".ccad": "application/clariscad",
+ ".cco": "application/x-cocoa",
+ ".cdf": "application/cdf",
+ ".cer": "application/pkix-cert",
+ ".cha": "application/x-chat",
+ ".chat": "application/x-chat",
+ ".chrt": "application/vnd.kde.kchart",
+ ".class": "application/java",
+ ".com": "text/plain",
+ ".conf": "text/plain",
+ ".cpio": "application/x-cpio",
+ ".cpp": "text/x-c",
+ ".cpt": "application/mac-compactpro",
+ ".crl": "application/pkcs-crl",
+ ".crt": "application/pkix-cert",
+ ".crx": "application/x-chrome-extension",
+ ".csh": "text/x-scriptcsh",
+ ".css": "text/css",
+ ".csv": "text/csv",
+ ".cxx": "text/plain",
+ ".dar": "application/x-dar",
+ ".dcr": "application/x-director",
+ ".deb": "application/x-debian-package",
+ ".deepv": "application/x-deepv",
+ ".def": "text/plain",
+ ".der": "application/x-x509-ca-cert",
+ ".dif": "video/x-dv",
+ ".dir": "application/x-director",
+ ".divx": "video/divx",
+ ".dl": "video/dl",
+ ".dmg": "application/x-apple-diskimage",
+ ".doc": "application/msword",
+ ".dot": "application/msword",
+ ".dp": "application/commonground",
+ ".drw": "application/drafting",
+ ".dump": "application/octet-stream",
+ ".dv": "video/x-dv",
+ ".dvi": "application/x-dvi",
+ ".dwf": "drawing/x-dwf=(old)",
+ ".dwg": "application/acad",
+ ".dxf": "application/dxf",
+ ".dxr": "application/x-director",
+ ".el": "text/x-scriptelisp",
+ ".elc": "application/x-bytecodeelisp=(compiled=elisp)",
+ ".eml": "message/rfc822",
+ ".env": "application/x-envoy",
+ ".eps": "application/postscript",
+ ".es": "application/x-esrehber",
+ ".etx": "text/x-setext",
+ ".evy": "application/envoy",
+ ".exe": "application/octet-stream",
+ ".f77": "text/x-fortran",
+ ".f90": "text/x-fortran",
+ ".f": "text/x-fortran",
+ ".fdf": "application/vndfdf",
+ ".fif": "application/fractals",
+ ".fli": "video/fli",
+ ".flo": "image/florian",
+ ".flv": "video/x-flv",
+ ".flx": "text/vndfmiflexstor",
+ ".fmf": "video/x-atomic3d-feature",
+ ".for": "text/x-fortran",
+ ".fpx": "image/vndfpx",
+ ".frl": "application/freeloader",
+ ".funk": "audio/make",
+ ".g3": "image/g3fax",
+ ".g": "text/plain",
+ ".gif": "image/gif",
+ ".gl": "video/gl",
+ ".gsd": "audio/x-gsm",
+ ".gsm": "audio/x-gsm",
+ ".gsp": "application/x-gsp",
+ ".gss": "application/x-gss",
+ ".gtar": "application/x-gtar",
+ ".gz": "application/x-compressed",
+ ".gzip": "application/x-gzip",
+ ".h": "text/x-h",
+ ".hdf": "application/x-hdf",
+ ".help": "application/x-helpfile",
+ ".hgl": "application/vndhp-hpgl",
+ ".hh": "text/x-h",
+ ".hlb": "text/x-script",
+ ".hlp": "application/hlp",
+ ".hpg": "application/vndhp-hpgl",
+ ".hpgl": "application/vndhp-hpgl",
+ ".hqx": "application/binhex",
+ ".hta": "application/hta",
+ ".htc": "text/x-component",
+ ".htm": "text/html",
+ ".html": "text/html",
+ ".htmls": "text/html",
+ ".htt": "text/webviewhtml",
+ ".htx": "text/html",
+ ".ice": "x-conference/x-cooltalk",
+ ".ico": "image/x-icon",
+ ".ics": "text/calendar",
+ ".icz": "text/calendar",
+ ".idc": "text/plain",
+ ".ief": "image/ief",
+ ".iefs": "image/ief",
+ ".iges": "application/iges",
+ ".igs": "application/iges",
+ ".ima": "application/x-ima",
+ ".imap": "application/x-httpd-imap",
+ ".inf": "application/inf",
+ ".ins": "application/x-internett-signup",
+ ".ip": "application/x-ip2",
+ ".isu": "video/x-isvideo",
+ ".it": "audio/it",
+ ".iv": "application/x-inventor",
+ ".ivr": "i-world/i-vrml",
+ ".ivy": "application/x-livescreen",
+ ".jam": "audio/x-jam",
+ ".jav": "text/x-java-source",
+ ".java": "text/x-java-source",
+ ".jcm": "application/x-java-commerce",
+ ".jfif-tbnl": "image/jpeg",
+ ".jfif": "image/jpeg",
+ ".jnlp": "application/x-java-jnlp-file",
+ ".jpe": "image/jpeg",
+ ".jpeg": "image/jpeg",
+ ".jpg": "image/jpeg",
+ ".jps": "image/x-jps",
+ ".js": "application/javascript",
+ ".json": "application/json",
+ ".jut": "image/jutvision",
+ ".kar": "audio/midi",
+ ".karbon": "application/vnd.kde.karbon",
+ ".kfo": "application/vnd.kde.kformula",
+ ".flw": "application/vnd.kde.kivio",
+ ".kml": "application/vnd.google-earth.kml+xml",
+ ".kmz": "application/vnd.google-earth.kmz",
+ ".kon": "application/vnd.kde.kontour",
+ ".kpr": "application/vnd.kde.kpresenter",
+ ".kpt": "application/vnd.kde.kpresenter",
+ ".ksp": "application/vnd.kde.kspread",
+ ".kwd": "application/vnd.kde.kword",
+ ".kwt": "application/vnd.kde.kword",
+ ".ksh": "text/x-scriptksh",
+ ".la": "audio/nspaudio",
+ ".lam": "audio/x-liveaudio",
+ ".latex": "application/x-latex",
+ ".lha": "application/lha",
+ ".lhx": "application/octet-stream",
+ ".list": "text/plain",
+ ".lma": "audio/nspaudio",
+ ".log": "text/plain",
+ ".lsp": "text/x-scriptlisp",
+ ".lst": "text/plain",
+ ".lsx": "text/x-la-asf",
+ ".ltx": "application/x-latex",
+ ".lzh": "application/octet-stream",
+ ".lzx": "application/lzx",
+ ".m1v": "video/mpeg",
+ ".m2a": "audio/mpeg",
+ ".m2v": "video/mpeg",
+ ".m3u": "audio/x-mpegurl",
+ ".m": "text/x-m",
+ ".man": "application/x-troff-man",
+ ".manifest": "text/cache-manifest",
+ ".map": "application/x-navimap",
+ ".mar": "text/plain",
+ ".mbd": "application/mbedlet",
+ ".mc$": "application/x-magic-cap-package-10",
+ ".mcd": "application/mcad",
+ ".mcf": "text/mcf",
+ ".mcp": "application/netmc",
+ ".me": "application/x-troff-me",
+ ".mht": "message/rfc822",
+ ".mhtml": "message/rfc822",
+ ".mid": "application/x-midi",
+ ".midi": "application/x-midi",
+ ".mif": "application/x-frame",
+ ".mime": "message/rfc822",
+ ".mjf": "audio/x-vndaudioexplosionmjuicemediafile",
+ ".mjpg": "video/x-motion-jpeg",
+ ".mm": "application/base64",
+ ".mme": "application/base64",
+ ".mod": "audio/mod",
+ ".moov": "video/quicktime",
+ ".mov": "video/quicktime",
+ ".movie": "video/x-sgi-movie",
+ ".mp2": "audio/mpeg",
+ ".mp3": "audio/mpeg3",
+ ".mp4": "video/mp4",
+ ".mpa": "audio/mpeg",
+ ".mpc": "application/x-project",
+ ".mpe": "video/mpeg",
+ ".mpeg": "video/mpeg",
+ ".mpg": "video/mpeg",
+ ".mpga": "audio/mpeg",
+ ".mpp": "application/vndms-project",
+ ".mpt": "application/x-project",
+ ".mpv": "application/x-project",
+ ".mpx": "application/x-project",
+ ".mrc": "application/marc",
+ ".ms": "application/x-troff-ms",
+ ".mv": "video/x-sgi-movie",
+ ".my": "audio/make",
+ ".mzz": "application/x-vndaudioexplosionmzz",
+ ".nap": "image/naplps",
+ ".naplps": "image/naplps",
+ ".nc": "application/x-netcdf",
+ ".ncm": "application/vndnokiaconfiguration-message",
+ ".nif": "image/x-niff",
+ ".niff": "image/x-niff",
+ ".nix": "application/x-mix-transfer",
+ ".nsc": "application/x-conference",
+ ".nvd": "application/x-navidoc",
+ ".o": "application/octet-stream",
+ ".oda": "application/oda",
+ ".odb": "application/vnd.oasis.opendocument.database",
+ ".odc": "application/vnd.oasis.opendocument.chart",
+ ".odf": "application/vnd.oasis.opendocument.formula",
+ ".odg": "application/vnd.oasis.opendocument.graphics",
+ ".odi": "application/vnd.oasis.opendocument.image",
+ ".odm": "application/vnd.oasis.opendocument.text-master",
+ ".odp": "application/vnd.oasis.opendocument.presentation",
+ ".ods": "application/vnd.oasis.opendocument.spreadsheet",
+ ".odt": "application/vnd.oasis.opendocument.text",
+ ".oga": "audio/ogg",
+ ".ogg": "audio/ogg",
+ ".ogv": "video/ogg",
+ ".omc": "application/x-omc",
+ ".omcd": "application/x-omcdatamaker",
+ ".omcr": "application/x-omcregerator",
+ ".otc": "application/vnd.oasis.opendocument.chart-template",
+ ".otf": "application/vnd.oasis.opendocument.formula-template",
+ ".otg": "application/vnd.oasis.opendocument.graphics-template",
+ ".oth": "application/vnd.oasis.opendocument.text-web",
+ ".oti": "application/vnd.oasis.opendocument.image-template",
+ ".otm": "application/vnd.oasis.opendocument.text-master",
+ ".otp": "application/vnd.oasis.opendocument.presentation-template",
+ ".ots": "application/vnd.oasis.opendocument.spreadsheet-template",
+ ".ott": "application/vnd.oasis.opendocument.text-template",
+ ".p10": "application/pkcs10",
+ ".p12": "application/pkcs-12",
+ ".p7a": "application/x-pkcs7-signature",
+ ".p7c": "application/pkcs7-mime",
+ ".p7m": "application/pkcs7-mime",
+ ".p7r": "application/x-pkcs7-certreqresp",
+ ".p7s": "application/pkcs7-signature",
+ ".p": "text/x-pascal",
+ ".part": "application/pro_eng",
+ ".pas": "text/pascal",
+ ".pbm": "image/x-portable-bitmap",
+ ".pcl": "application/vndhp-pcl",
+ ".pct": "image/x-pict",
+ ".pcx": "image/x-pcx",
+ ".pdb": "chemical/x-pdb",
+ ".pdf": "application/pdf",
+ ".pfunk": "audio/make",
+ ".pgm": "image/x-portable-graymap",
+ ".pic": "image/pict",
+ ".pict": "image/pict",
+ ".pkg": "application/x-newton-compatible-pkg",
+ ".pko": "application/vndms-pkipko",
+ ".pl": "text/x-scriptperl",
+ ".plx": "application/x-pixclscript",
+ ".pm4": "application/x-pagemaker",
+ ".pm5": "application/x-pagemaker",
+ ".pm": "text/x-scriptperl-module",
+ ".png": "image/png",
+ ".pnm": "application/x-portable-anymap",
+ ".pot": "application/mspowerpoint",
+ ".pov": "model/x-pov",
+ ".ppa": "application/vndms-powerpoint",
+ ".ppm": "image/x-portable-pixmap",
+ ".pps": "application/mspowerpoint",
+ ".ppt": "application/mspowerpoint",
+ ".ppz": "application/mspowerpoint",
+ ".pre": "application/x-freelance",
+ ".prt": "application/pro_eng",
+ ".ps": "application/postscript",
+ ".psd": "application/octet-stream",
+ ".pvu": "paleovu/x-pv",
+ ".pwz": "application/vndms-powerpoint",
+ ".py": "text/x-scriptphyton",
+ ".pyc": "application/x-bytecodepython",
+ ".qcp": "audio/vndqcelp",
+ ".qd3": "x-world/x-3dmf",
+ ".qd3d": "x-world/x-3dmf",
+ ".qif": "image/x-quicktime",
+ ".qt": "video/quicktime",
+ ".qtc": "video/x-qtc",
+ ".qti": "image/x-quicktime",
+ ".qtif": "image/x-quicktime",
+ ".ra": "audio/x-pn-realaudio",
+ ".ram": "audio/x-pn-realaudio",
+ ".rar": "application/x-rar-compressed",
+ ".ras": "application/x-cmu-raster",
+ ".rast": "image/cmu-raster",
+ ".rexx": "text/x-scriptrexx",
+ ".rf": "image/vndrn-realflash",
+ ".rgb": "image/x-rgb",
+ ".rm": "application/vndrn-realmedia",
+ ".rmi": "audio/mid",
+ ".rmm": "audio/x-pn-realaudio",
+ ".rmp": "audio/x-pn-realaudio",
+ ".rng": "application/ringing-tones",
+ ".rnx": "application/vndrn-realplayer",
+ ".roff": "application/x-troff",
+ ".rp": "image/vndrn-realpix",
+ ".rpm": "audio/x-pn-realaudio-plugin",
+ ".rt": "text/vndrn-realtext",
+ ".rtf": "text/richtext",
+ ".rtx": "text/richtext",
+ ".rv": "video/vndrn-realvideo",
+ ".s": "text/x-asm",
+ ".s3m": "audio/s3m",
+ ".s7z": "application/x-7z-compressed",
+ ".saveme": "application/octet-stream",
+ ".sbk": "application/x-tbook",
+ ".scm": "text/x-scriptscheme",
+ ".sdml": "text/plain",
+ ".sdp": "application/sdp",
+ ".sdr": "application/sounder",
+ ".sea": "application/sea",
+ ".set": "application/set",
+ ".sgm": "text/x-sgml",
+ ".sgml": "text/x-sgml",
+ ".sh": "text/x-scriptsh",
+ ".shar": "application/x-bsh",
+ ".shtml": "text/x-server-parsed-html",
+ ".sid": "audio/x-psid",
+ ".skd": "application/x-koan",
+ ".skm": "application/x-koan",
+ ".skp": "application/x-koan",
+ ".skt": "application/x-koan",
+ ".sit": "application/x-stuffit",
+ ".sitx": "application/x-stuffitx",
+ ".sl": "application/x-seelogo",
+ ".smi": "application/smil",
+ ".smil": "application/smil",
+ ".snd": "audio/basic",
+ ".sol": "application/solids",
+ ".spc": "text/x-speech",
+ ".spl": "application/futuresplash",
+ ".spr": "application/x-sprite",
+ ".sprite": "application/x-sprite",
+ ".spx": "audio/ogg",
+ ".src": "application/x-wais-source",
+ ".ssi": "text/x-server-parsed-html",
+ ".ssm": "application/streamingmedia",
+ ".sst": "application/vndms-pkicertstore",
+ ".step": "application/step",
+ ".stl": "application/sla",
+ ".stp": "application/step",
+ ".sv4cpio": "application/x-sv4cpio",
+ ".sv4crc": "application/x-sv4crc",
+ ".svf": "image/vnddwg",
+ ".svg": "image/svg+xml",
+ ".svr": "application/x-world",
+ ".swf": "application/x-shockwave-flash",
+ ".t": "application/x-troff",
+ ".talk": "text/x-speech",
+ ".tar": "application/x-tar",
+ ".tbk": "application/toolbook",
+ ".tcl": "text/x-scripttcl",
+ ".tcsh": "text/x-scripttcsh",
+ ".tex": "application/x-tex",
+ ".texi": "application/x-texinfo",
+ ".texinfo": "application/x-texinfo",
+ ".text": "text/plain",
+ ".tgz": "application/gnutar",
+ ".tif": "image/tiff",
+ ".tiff": "image/tiff",
+ ".tr": "application/x-troff",
+ ".tsi": "audio/tsp-audio",
+ ".tsp": "application/dsptype",
+ ".tsv": "text/tab-separated-values",
+ ".turbot": "image/florian",
+ ".txt": "text/plain",
+ ".uil": "text/x-uil",
+ ".uni": "text/uri-list",
+ ".unis": "text/uri-list",
+ ".unv": "application/i-deas",
+ ".uri": "text/uri-list",
+ ".uris": "text/uri-list",
+ ".ustar": "application/x-ustar",
+ ".uu": "text/x-uuencode",
+ ".uue": "text/x-uuencode",
+ ".vcd": "application/x-cdlink",
+ ".vcf": "text/x-vcard",
+ ".vcard": "text/x-vcard",
+ ".vcs": "text/x-vcalendar",
+ ".vda": "application/vda",
+ ".vdo": "video/vdo",
+ ".vew": "application/groupwise",
+ ".viv": "video/vivo",
+ ".vivo": "video/vivo",
+ ".vmd": "application/vocaltec-media-desc",
+ ".vmf": "application/vocaltec-media-file",
+ ".voc": "audio/voc",
+ ".vos": "video/vosaic",
+ ".vox": "audio/voxware",
+ ".vqe": "audio/x-twinvq-plugin",
+ ".vqf": "audio/x-twinvq",
+ ".vql": "audio/x-twinvq-plugin",
+ ".vrml": "application/x-vrml",
+ ".vrt": "x-world/x-vrt",
+ ".vsd": "application/x-visio",
+ ".vst": "application/x-visio",
+ ".vsw": "application/x-visio",
+ ".w60": "application/wordperfect60",
+ ".w61": "application/wordperfect61",
+ ".w6w": "application/msword",
+ ".wav": "audio/wav",
+ ".wb1": "application/x-qpro",
+ ".wbmp": "image/vnd.wap.wbmp",
+ ".web": "application/vndxara",
+ ".wiz": "application/msword",
+ ".wk1": "application/x-123",
+ ".wmf": "windows/metafile",
+ ".wml": "text/vnd.wap.wml",
+ ".wmlc": "application/vnd.wap.wmlc",
+ ".wmls": "text/vnd.wap.wmlscript",
+ ".wmlsc": "application/vnd.wap.wmlscriptc",
+ ".word": "application/msword",
+ ".wp5": "application/wordperfect",
+ ".wp6": "application/wordperfect",
+ ".wp": "application/wordperfect",
+ ".wpd": "application/wordperfect",
+ ".wq1": "application/x-lotus",
+ ".wri": "application/mswrite",
+ ".wrl": "application/x-world",
+ ".wrz": "model/vrml",
+ ".wsc": "text/scriplet",
+ ".wsrc": "application/x-wais-source",
+ ".wtk": "application/x-wintalk",
+ ".x-png": "image/png",
+ ".xbm": "image/x-xbitmap",
+ ".xdr": "video/x-amt-demorun",
+ ".xgz": "xgl/drawing",
+ ".xif": "image/vndxiff",
+ ".xl": "application/excel",
+ ".xla": "application/excel",
+ ".xlb": "application/excel",
+ ".xlc": "application/excel",
+ ".xld": "application/excel",
+ ".xlk": "application/excel",
+ ".xll": "application/excel",
+ ".xlm": "application/excel",
+ ".xls": "application/excel",
+ ".xlt": "application/excel",
+ ".xlv": "application/excel",
+ ".xlw": "application/excel",
+ ".xm": "audio/xm",
+ ".xml": "text/xml",
+ ".xmz": "xgl/movie",
+ ".xpix": "application/x-vndls-xpix",
+ ".xpm": "image/x-xpixmap",
+ ".xsr": "video/x-amt-showrun",
+ ".xwd": "image/x-xwd",
+ ".xyz": "chemical/x-pdb",
+ ".z": "application/x-compress",
+ ".zip": "application/zip",
+ ".zoo": "application/octet-stream",
+ ".zsh": "text/x-scriptzsh",
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+ ".docm": "application/vnd.ms-word.document.macroEnabled.12",
+ ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
+ ".dotm": "application/vnd.ms-word.template.macroEnabled.12",
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+ ".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12",
+ ".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
+ ".xltm": "application/vnd.ms-excel.template.macroEnabled.12",
+ ".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
+ ".xlam": "application/vnd.ms-excel.addin.macroEnabled.12",
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+ ".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
+ ".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
+ ".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
+ ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
+ ".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12",
+ ".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12",
+ ".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide",
+ ".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12",
+ ".thmx": "application/vnd.ms-officetheme",
+ ".onetoc": "application/onenote",
+ ".onetoc2": "application/onenote",
+ ".onetmp": "application/onenote",
+ ".onepkg": "application/onenote",
+ ".key": "application/x-iwork-keynote-sffkey",
+ ".kth": "application/x-iwork-keynote-sffkth",
+ ".nmbtemplate": "application/x-iwork-numbers-sfftemplate",
+ ".numbers": "application/x-iwork-numbers-sffnumbers",
+ ".pages": "application/x-iwork-pages-sffpages",
+ ".template": "application/x-iwork-pages-sfftemplate",
+ ".xpi": "application/x-xpinstall",
+ ".oex": "application/x-opera-extension",
+ ".mustache": "text/html",
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/namespace.go b/at-admin/vendor/github.com/astaxie/beego/namespace.go
new file mode 100644
index 0000000..4952c9d
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/namespace.go
@@ -0,0 +1,396 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "net/http"
+ "strings"
+
+ beecontext "github.com/astaxie/beego/context"
+)
+
+type namespaceCond func(*beecontext.Context) bool
+
+// LinkNamespace used as link action
+type LinkNamespace func(*Namespace)
+
+// Namespace is store all the info
+type Namespace struct {
+ prefix string
+ handlers *ControllerRegister
+}
+
+// NewNamespace get new Namespace
+func NewNamespace(prefix string, params ...LinkNamespace) *Namespace {
+ ns := &Namespace{
+ prefix: prefix,
+ handlers: NewControllerRegister(),
+ }
+ for _, p := range params {
+ p(ns)
+ }
+ return ns
+}
+
+// Cond set condition function
+// if cond return true can run this namespace, else can't
+// usage:
+// ns.Cond(func (ctx *context.Context) bool{
+// if ctx.Input.Domain() == "api.beego.me" {
+// return true
+// }
+// return false
+// })
+// Cond as the first filter
+func (n *Namespace) Cond(cond namespaceCond) *Namespace {
+ fn := func(ctx *beecontext.Context) {
+ if !cond(ctx) {
+ exception("405", ctx)
+ }
+ }
+ if v := n.handlers.filters[BeforeRouter]; len(v) > 0 {
+ mr := new(FilterRouter)
+ mr.tree = NewTree()
+ mr.pattern = "*"
+ mr.filterFunc = fn
+ mr.tree.AddRouter("*", true)
+ n.handlers.filters[BeforeRouter] = append([]*FilterRouter{mr}, v...)
+ } else {
+ n.handlers.InsertFilter("*", BeforeRouter, fn)
+ }
+ return n
+}
+
+// Filter add filter in the Namespace
+// action has before & after
+// FilterFunc
+// usage:
+// Filter("before", func (ctx *context.Context){
+// _, ok := ctx.Input.Session("uid").(int)
+// if !ok && ctx.Request.RequestURI != "/login" {
+// ctx.Redirect(302, "/login")
+// }
+// })
+func (n *Namespace) Filter(action string, filter ...FilterFunc) *Namespace {
+ var a int
+ if action == "before" {
+ a = BeforeRouter
+ } else if action == "after" {
+ a = FinishRouter
+ }
+ for _, f := range filter {
+ n.handlers.InsertFilter("*", a, f)
+ }
+ return n
+}
+
+// Router same as beego.Rourer
+// refer: https://godoc.org/github.com/astaxie/beego#Router
+func (n *Namespace) Router(rootpath string, c ControllerInterface, mappingMethods ...string) *Namespace {
+ n.handlers.Add(rootpath, c, mappingMethods...)
+ return n
+}
+
+// AutoRouter same as beego.AutoRouter
+// refer: https://godoc.org/github.com/astaxie/beego#AutoRouter
+func (n *Namespace) AutoRouter(c ControllerInterface) *Namespace {
+ n.handlers.AddAuto(c)
+ return n
+}
+
+// AutoPrefix same as beego.AutoPrefix
+// refer: https://godoc.org/github.com/astaxie/beego#AutoPrefix
+func (n *Namespace) AutoPrefix(prefix string, c ControllerInterface) *Namespace {
+ n.handlers.AddAutoPrefix(prefix, c)
+ return n
+}
+
+// Get same as beego.Get
+// refer: https://godoc.org/github.com/astaxie/beego#Get
+func (n *Namespace) Get(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Get(rootpath, f)
+ return n
+}
+
+// Post same as beego.Post
+// refer: https://godoc.org/github.com/astaxie/beego#Post
+func (n *Namespace) Post(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Post(rootpath, f)
+ return n
+}
+
+// Delete same as beego.Delete
+// refer: https://godoc.org/github.com/astaxie/beego#Delete
+func (n *Namespace) Delete(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Delete(rootpath, f)
+ return n
+}
+
+// Put same as beego.Put
+// refer: https://godoc.org/github.com/astaxie/beego#Put
+func (n *Namespace) Put(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Put(rootpath, f)
+ return n
+}
+
+// Head same as beego.Head
+// refer: https://godoc.org/github.com/astaxie/beego#Head
+func (n *Namespace) Head(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Head(rootpath, f)
+ return n
+}
+
+// Options same as beego.Options
+// refer: https://godoc.org/github.com/astaxie/beego#Options
+func (n *Namespace) Options(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Options(rootpath, f)
+ return n
+}
+
+// Patch same as beego.Patch
+// refer: https://godoc.org/github.com/astaxie/beego#Patch
+func (n *Namespace) Patch(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Patch(rootpath, f)
+ return n
+}
+
+// Any same as beego.Any
+// refer: https://godoc.org/github.com/astaxie/beego#Any
+func (n *Namespace) Any(rootpath string, f FilterFunc) *Namespace {
+ n.handlers.Any(rootpath, f)
+ return n
+}
+
+// Handler same as beego.Handler
+// refer: https://godoc.org/github.com/astaxie/beego#Handler
+func (n *Namespace) Handler(rootpath string, h http.Handler) *Namespace {
+ n.handlers.Handler(rootpath, h)
+ return n
+}
+
+// Include add include class
+// refer: https://godoc.org/github.com/astaxie/beego#Include
+func (n *Namespace) Include(cList ...ControllerInterface) *Namespace {
+ n.handlers.Include(cList...)
+ return n
+}
+
+// Namespace add nest Namespace
+// usage:
+//ns := beego.NewNamespace(“/v1”).
+//Namespace(
+// beego.NewNamespace("/shop").
+// Get("/:id", func(ctx *context.Context) {
+// ctx.Output.Body([]byte("shopinfo"))
+// }),
+// beego.NewNamespace("/order").
+// Get("/:id", func(ctx *context.Context) {
+// ctx.Output.Body([]byte("orderinfo"))
+// }),
+// beego.NewNamespace("/crm").
+// Get("/:id", func(ctx *context.Context) {
+// ctx.Output.Body([]byte("crminfo"))
+// }),
+//)
+func (n *Namespace) Namespace(ns ...*Namespace) *Namespace {
+ for _, ni := range ns {
+ for k, v := range ni.handlers.routers {
+ if _, ok := n.handlers.routers[k]; ok {
+ addPrefix(v, ni.prefix)
+ n.handlers.routers[k].AddTree(ni.prefix, v)
+ } else {
+ t := NewTree()
+ t.AddTree(ni.prefix, v)
+ addPrefix(t, ni.prefix)
+ n.handlers.routers[k] = t
+ }
+ }
+ if ni.handlers.enableFilter {
+ for pos, filterList := range ni.handlers.filters {
+ for _, mr := range filterList {
+ t := NewTree()
+ t.AddTree(ni.prefix, mr.tree)
+ mr.tree = t
+ n.handlers.insertFilterRouter(pos, mr)
+ }
+ }
+ }
+ }
+ return n
+}
+
+// AddNamespace register Namespace into beego.Handler
+// support multi Namespace
+func AddNamespace(nl ...*Namespace) {
+ for _, n := range nl {
+ for k, v := range n.handlers.routers {
+ if _, ok := BeeApp.Handlers.routers[k]; ok {
+ addPrefix(v, n.prefix)
+ BeeApp.Handlers.routers[k].AddTree(n.prefix, v)
+ } else {
+ t := NewTree()
+ t.AddTree(n.prefix, v)
+ addPrefix(t, n.prefix)
+ BeeApp.Handlers.routers[k] = t
+ }
+ }
+ if n.handlers.enableFilter {
+ for pos, filterList := range n.handlers.filters {
+ for _, mr := range filterList {
+ t := NewTree()
+ t.AddTree(n.prefix, mr.tree)
+ mr.tree = t
+ BeeApp.Handlers.insertFilterRouter(pos, mr)
+ }
+ }
+ }
+ }
+}
+
+func addPrefix(t *Tree, prefix string) {
+ for _, v := range t.fixrouters {
+ addPrefix(v, prefix)
+ }
+ if t.wildcard != nil {
+ addPrefix(t.wildcard, prefix)
+ }
+ for _, l := range t.leaves {
+ if c, ok := l.runObject.(*ControllerInfo); ok {
+ if !strings.HasPrefix(c.pattern, prefix) {
+ c.pattern = prefix + c.pattern
+ }
+ }
+ }
+}
+
+// NSCond is Namespace Condition
+func NSCond(cond namespaceCond) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Cond(cond)
+ }
+}
+
+// NSBefore Namespace BeforeRouter filter
+func NSBefore(filterList ...FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Filter("before", filterList...)
+ }
+}
+
+// NSAfter add Namespace FinishRouter filter
+func NSAfter(filterList ...FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Filter("after", filterList...)
+ }
+}
+
+// NSInclude Namespace Include ControllerInterface
+func NSInclude(cList ...ControllerInterface) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Include(cList...)
+ }
+}
+
+// NSRouter call Namespace Router
+func NSRouter(rootpath string, c ControllerInterface, mappingMethods ...string) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Router(rootpath, c, mappingMethods...)
+ }
+}
+
+// NSGet call Namespace Get
+func NSGet(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Get(rootpath, f)
+ }
+}
+
+// NSPost call Namespace Post
+func NSPost(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Post(rootpath, f)
+ }
+}
+
+// NSHead call Namespace Head
+func NSHead(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Head(rootpath, f)
+ }
+}
+
+// NSPut call Namespace Put
+func NSPut(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Put(rootpath, f)
+ }
+}
+
+// NSDelete call Namespace Delete
+func NSDelete(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Delete(rootpath, f)
+ }
+}
+
+// NSAny call Namespace Any
+func NSAny(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Any(rootpath, f)
+ }
+}
+
+// NSOptions call Namespace Options
+func NSOptions(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Options(rootpath, f)
+ }
+}
+
+// NSPatch call Namespace Patch
+func NSPatch(rootpath string, f FilterFunc) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Patch(rootpath, f)
+ }
+}
+
+// NSAutoRouter call Namespace AutoRouter
+func NSAutoRouter(c ControllerInterface) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.AutoRouter(c)
+ }
+}
+
+// NSAutoPrefix call Namespace AutoPrefix
+func NSAutoPrefix(prefix string, c ControllerInterface) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.AutoPrefix(prefix, c)
+ }
+}
+
+// NSNamespace add sub Namespace
+func NSNamespace(prefix string, params ...LinkNamespace) LinkNamespace {
+ return func(ns *Namespace) {
+ n := NewNamespace(prefix, params...)
+ ns.Namespace(n)
+ }
+}
+
+// NSHandler add handler
+func NSHandler(rootpath string, h http.Handler) LinkNamespace {
+ return func(ns *Namespace) {
+ ns.Handler(rootpath, h)
+ }
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/parser.go b/at-admin/vendor/github.com/astaxie/beego/parser.go
new file mode 100644
index 0000000..5e6b911
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/parser.go
@@ -0,0 +1,591 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+ "unicode"
+
+ "github.com/astaxie/beego/context/param"
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/utils"
+)
+
+var globalRouterTemplate = `package {{.routersDir}}
+
+import (
+ "github.com/astaxie/beego"
+ "github.com/astaxie/beego/context/param"{{.globalimport}}
+)
+
+func init() {
+{{.globalinfo}}
+}
+`
+
+var (
+ lastupdateFilename = "lastupdate.tmp"
+ commentFilename string
+ pkgLastupdate map[string]int64
+ genInfoList map[string][]ControllerComments
+
+ routerHooks = map[string]int{
+ "beego.BeforeStatic": BeforeStatic,
+ "beego.BeforeRouter": BeforeRouter,
+ "beego.BeforeExec": BeforeExec,
+ "beego.AfterExec": AfterExec,
+ "beego.FinishRouter": FinishRouter,
+ }
+
+ routerHooksMapping = map[int]string{
+ BeforeStatic: "beego.BeforeStatic",
+ BeforeRouter: "beego.BeforeRouter",
+ BeforeExec: "beego.BeforeExec",
+ AfterExec: "beego.AfterExec",
+ FinishRouter: "beego.FinishRouter",
+ }
+)
+
+const commentPrefix = "commentsRouter_"
+
+func init() {
+ pkgLastupdate = make(map[string]int64)
+}
+
+func parserPkg(pkgRealpath, pkgpath string) error {
+ rep := strings.NewReplacer("\\", "_", "/", "_", ".", "_")
+ commentFilename, _ = filepath.Rel(AppPath, pkgRealpath)
+ commentFilename = commentPrefix + rep.Replace(commentFilename) + ".go"
+ if !compareFile(pkgRealpath) {
+ logs.Info(pkgRealpath + " no changed")
+ return nil
+ }
+ genInfoList = make(map[string][]ControllerComments)
+ fileSet := token.NewFileSet()
+ astPkgs, err := parser.ParseDir(fileSet, pkgRealpath, func(info os.FileInfo) bool {
+ name := info.Name()
+ return !info.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
+ }, parser.ParseComments)
+
+ if err != nil {
+ return err
+ }
+ for _, pkg := range astPkgs {
+ for _, fl := range pkg.Files {
+ for _, d := range fl.Decls {
+ switch specDecl := d.(type) {
+ case *ast.FuncDecl:
+ if specDecl.Recv != nil {
+ exp, ok := specDecl.Recv.List[0].Type.(*ast.StarExpr) // Check that the type is correct first beforing throwing to parser
+ if ok {
+ parserComments(specDecl, fmt.Sprint(exp.X), pkgpath)
+ }
+ }
+ }
+ }
+ }
+ }
+ genRouterCode(pkgRealpath)
+ savetoFile(pkgRealpath)
+ return nil
+}
+
+type parsedComment struct {
+ routerPath string
+ methods []string
+ params map[string]parsedParam
+ filters []parsedFilter
+ imports []parsedImport
+}
+
+type parsedImport struct {
+ importPath string
+ importAlias string
+}
+
+type parsedFilter struct {
+ pattern string
+ pos int
+ filter string
+ params []bool
+}
+
+type parsedParam struct {
+ name string
+ datatype string
+ location string
+ defValue string
+ required bool
+}
+
+func parserComments(f *ast.FuncDecl, controllerName, pkgpath string) error {
+ if f.Doc != nil {
+ parsedComments, err := parseComment(f.Doc.List)
+ if err != nil {
+ return err
+ }
+ for _, parsedComment := range parsedComments {
+ if parsedComment.routerPath != "" {
+ key := pkgpath + ":" + controllerName
+ cc := ControllerComments{}
+ cc.Method = f.Name.String()
+ cc.Router = parsedComment.routerPath
+ cc.AllowHTTPMethods = parsedComment.methods
+ cc.MethodParams = buildMethodParams(f.Type.Params.List, parsedComment)
+ cc.FilterComments = buildFilters(parsedComment.filters)
+ cc.ImportComments = buildImports(parsedComment.imports)
+ genInfoList[key] = append(genInfoList[key], cc)
+ }
+ }
+ }
+ return nil
+}
+
+func buildImports(pis []parsedImport) []*ControllerImportComments {
+ var importComments []*ControllerImportComments
+
+ for _, pi := range pis {
+ importComments = append(importComments, &ControllerImportComments{
+ ImportPath: pi.importPath,
+ ImportAlias: pi.importAlias,
+ })
+ }
+
+ return importComments
+}
+
+func buildFilters(pfs []parsedFilter) []*ControllerFilterComments {
+ var filterComments []*ControllerFilterComments
+
+ for _, pf := range pfs {
+ var (
+ returnOnOutput bool
+ resetParams bool
+ )
+
+ if len(pf.params) >= 1 {
+ returnOnOutput = pf.params[0]
+ }
+
+ if len(pf.params) >= 2 {
+ resetParams = pf.params[1]
+ }
+
+ filterComments = append(filterComments, &ControllerFilterComments{
+ Filter: pf.filter,
+ Pattern: pf.pattern,
+ Pos: pf.pos,
+ ReturnOnOutput: returnOnOutput,
+ ResetParams: resetParams,
+ })
+ }
+
+ return filterComments
+}
+
+func buildMethodParams(funcParams []*ast.Field, pc *parsedComment) []*param.MethodParam {
+ result := make([]*param.MethodParam, 0, len(funcParams))
+ for _, fparam := range funcParams {
+ for _, pName := range fparam.Names {
+ methodParam := buildMethodParam(fparam, pName.Name, pc)
+ result = append(result, methodParam)
+ }
+ }
+ return result
+}
+
+func buildMethodParam(fparam *ast.Field, name string, pc *parsedComment) *param.MethodParam {
+ options := []param.MethodParamOption{}
+ if cparam, ok := pc.params[name]; ok {
+ //Build param from comment info
+ name = cparam.name
+ if cparam.required {
+ options = append(options, param.IsRequired)
+ }
+ switch cparam.location {
+ case "body":
+ options = append(options, param.InBody)
+ case "header":
+ options = append(options, param.InHeader)
+ case "path":
+ options = append(options, param.InPath)
+ }
+ if cparam.defValue != "" {
+ options = append(options, param.Default(cparam.defValue))
+ }
+ } else {
+ if paramInPath(name, pc.routerPath) {
+ options = append(options, param.InPath)
+ }
+ }
+ return param.New(name, options...)
+}
+
+func paramInPath(name, route string) bool {
+ return strings.HasSuffix(route, ":"+name) ||
+ strings.Contains(route, ":"+name+"/")
+}
+
+var routeRegex = regexp.MustCompile(`@router\s+(\S+)(?:\s+\[(\S+)\])?`)
+
+func parseComment(lines []*ast.Comment) (pcs []*parsedComment, err error) {
+ pcs = []*parsedComment{}
+ params := map[string]parsedParam{}
+ filters := []parsedFilter{}
+ imports := []parsedImport{}
+
+ for _, c := range lines {
+ t := strings.TrimSpace(strings.TrimLeft(c.Text, "//"))
+ if strings.HasPrefix(t, "@Param") {
+ pv := getparams(strings.TrimSpace(strings.TrimLeft(t, "@Param")))
+ if len(pv) < 4 {
+ logs.Error("Invalid @Param format. Needs at least 4 parameters")
+ }
+ p := parsedParam{}
+ names := strings.SplitN(pv[0], "=>", 2)
+ p.name = names[0]
+ funcParamName := p.name
+ if len(names) > 1 {
+ funcParamName = names[1]
+ }
+ p.location = pv[1]
+ p.datatype = pv[2]
+ switch len(pv) {
+ case 5:
+ p.required, _ = strconv.ParseBool(pv[3])
+ case 6:
+ p.defValue = pv[3]
+ p.required, _ = strconv.ParseBool(pv[4])
+ }
+ params[funcParamName] = p
+ }
+ }
+
+ for _, c := range lines {
+ t := strings.TrimSpace(strings.TrimLeft(c.Text, "//"))
+ if strings.HasPrefix(t, "@Import") {
+ iv := getparams(strings.TrimSpace(strings.TrimLeft(t, "@Import")))
+ if len(iv) == 0 || len(iv) > 2 {
+ logs.Error("Invalid @Import format. Only accepts 1 or 2 parameters")
+ continue
+ }
+
+ p := parsedImport{}
+ p.importPath = iv[0]
+
+ if len(iv) == 2 {
+ p.importAlias = iv[1]
+ }
+
+ imports = append(imports, p)
+ }
+ }
+
+filterLoop:
+ for _, c := range lines {
+ t := strings.TrimSpace(strings.TrimLeft(c.Text, "//"))
+ if strings.HasPrefix(t, "@Filter") {
+ fv := getparams(strings.TrimSpace(strings.TrimLeft(t, "@Filter")))
+ if len(fv) < 3 {
+ logs.Error("Invalid @Filter format. Needs at least 3 parameters")
+ continue filterLoop
+ }
+
+ p := parsedFilter{}
+ p.pattern = fv[0]
+ posName := fv[1]
+ if pos, exists := routerHooks[posName]; exists {
+ p.pos = pos
+ } else {
+ logs.Error("Invalid @Filter pos: ", posName)
+ continue filterLoop
+ }
+
+ p.filter = fv[2]
+ fvParams := fv[3:]
+ for _, fvParam := range fvParams {
+ switch fvParam {
+ case "true":
+ p.params = append(p.params, true)
+ case "false":
+ p.params = append(p.params, false)
+ default:
+ logs.Error("Invalid @Filter param: ", fvParam)
+ continue filterLoop
+ }
+ }
+
+ filters = append(filters, p)
+ }
+ }
+
+ for _, c := range lines {
+ var pc = &parsedComment{}
+ pc.params = params
+ pc.filters = filters
+ pc.imports = imports
+
+ t := strings.TrimSpace(strings.TrimLeft(c.Text, "//"))
+ if strings.HasPrefix(t, "@router") {
+ t := strings.TrimSpace(strings.TrimLeft(c.Text, "//"))
+ matches := routeRegex.FindStringSubmatch(t)
+ if len(matches) == 3 {
+ pc.routerPath = matches[1]
+ methods := matches[2]
+ if methods == "" {
+ pc.methods = []string{"get"}
+ //pc.hasGet = true
+ } else {
+ pc.methods = strings.Split(methods, ",")
+ //pc.hasGet = strings.Contains(methods, "get")
+ }
+ pcs = append(pcs, pc)
+ } else {
+ return nil, errors.New("Router information is missing")
+ }
+ }
+ }
+ return
+}
+
+// direct copy from bee\g_docs.go
+// analysis params return []string
+// @Param query form string true "The email for login"
+// [query form string true "The email for login"]
+func getparams(str string) []string {
+ var s []rune
+ var j int
+ var start bool
+ var r []string
+ var quoted int8
+ for _, c := range str {
+ if unicode.IsSpace(c) && quoted == 0 {
+ if !start {
+ continue
+ } else {
+ start = false
+ j++
+ r = append(r, string(s))
+ s = make([]rune, 0)
+ continue
+ }
+ }
+
+ start = true
+ if c == '"' {
+ quoted ^= 1
+ continue
+ }
+ s = append(s, c)
+ }
+ if len(s) > 0 {
+ r = append(r, string(s))
+ }
+ return r
+}
+
+func genRouterCode(pkgRealpath string) {
+ os.Mkdir(getRouterDir(pkgRealpath), 0755)
+ logs.Info("generate router from comments")
+ var (
+ globalinfo string
+ globalimport string
+ sortKey []string
+ )
+ for k := range genInfoList {
+ sortKey = append(sortKey, k)
+ }
+ sort.Strings(sortKey)
+ for _, k := range sortKey {
+ cList := genInfoList[k]
+ sort.Sort(ControllerCommentsSlice(cList))
+ for _, c := range cList {
+ allmethod := "nil"
+ if len(c.AllowHTTPMethods) > 0 {
+ allmethod = "[]string{"
+ for _, m := range c.AllowHTTPMethods {
+ allmethod += `"` + m + `",`
+ }
+ allmethod = strings.TrimRight(allmethod, ",") + "}"
+ }
+
+ params := "nil"
+ if len(c.Params) > 0 {
+ params = "[]map[string]string{"
+ for _, p := range c.Params {
+ for k, v := range p {
+ params = params + `map[string]string{` + k + `:"` + v + `"},`
+ }
+ }
+ params = strings.TrimRight(params, ",") + "}"
+ }
+
+ methodParams := "param.Make("
+ if len(c.MethodParams) > 0 {
+ lines := make([]string, 0, len(c.MethodParams))
+ for _, m := range c.MethodParams {
+ lines = append(lines, fmt.Sprint(m))
+ }
+ methodParams += "\n " +
+ strings.Join(lines, ",\n ") +
+ ",\n "
+ }
+ methodParams += ")"
+
+ imports := ""
+ if len(c.ImportComments) > 0 {
+ for _, i := range c.ImportComments {
+ var s string
+ if i.ImportAlias != "" {
+ s = fmt.Sprintf(`
+ %s "%s"`, i.ImportAlias, i.ImportPath)
+ } else {
+ s = fmt.Sprintf(`
+ "%s"`, i.ImportPath)
+ }
+ if !strings.Contains(globalimport, s) {
+ imports += s
+ }
+ }
+ }
+
+ filters := ""
+ if len(c.FilterComments) > 0 {
+ for _, f := range c.FilterComments {
+ filters += fmt.Sprintf(` &beego.ControllerFilter{
+ Pattern: "%s",
+ Pos: %s,
+ Filter: %s,
+ ReturnOnOutput: %v,
+ ResetParams: %v,
+ },`, f.Pattern, routerHooksMapping[f.Pos], f.Filter, f.ReturnOnOutput, f.ResetParams)
+ }
+ }
+
+ if filters == "" {
+ filters = "nil"
+ } else {
+ filters = fmt.Sprintf(`[]*beego.ControllerFilter{
+%s
+ }`, filters)
+ }
+
+ globalimport += imports
+
+ globalinfo = globalinfo + `
+ beego.GlobalControllerRouter["` + k + `"] = append(beego.GlobalControllerRouter["` + k + `"],
+ beego.ControllerComments{
+ Method: "` + strings.TrimSpace(c.Method) + `",
+ ` + "Router: `" + c.Router + "`" + `,
+ AllowHTTPMethods: ` + allmethod + `,
+ MethodParams: ` + methodParams + `,
+ Filters: ` + filters + `,
+ Params: ` + params + `})
+`
+ }
+ }
+
+ if globalinfo != "" {
+ f, err := os.Create(filepath.Join(getRouterDir(pkgRealpath), commentFilename))
+ if err != nil {
+ panic(err)
+ }
+ defer f.Close()
+
+ routersDir := AppConfig.DefaultString("routersdir", "routers")
+ content := strings.Replace(globalRouterTemplate, "{{.globalinfo}}", globalinfo, -1)
+ content = strings.Replace(content, "{{.routersDir}}", routersDir, -1)
+ content = strings.Replace(content, "{{.globalimport}}", globalimport, -1)
+ f.WriteString(content)
+ }
+}
+
+func compareFile(pkgRealpath string) bool {
+ if !utils.FileExists(filepath.Join(getRouterDir(pkgRealpath), commentFilename)) {
+ return true
+ }
+ if utils.FileExists(lastupdateFilename) {
+ content, err := ioutil.ReadFile(lastupdateFilename)
+ if err != nil {
+ return true
+ }
+ json.Unmarshal(content, &pkgLastupdate)
+ lastupdate, err := getpathTime(pkgRealpath)
+ if err != nil {
+ return true
+ }
+ if v, ok := pkgLastupdate[pkgRealpath]; ok {
+ if lastupdate <= v {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+func savetoFile(pkgRealpath string) {
+ lastupdate, err := getpathTime(pkgRealpath)
+ if err != nil {
+ return
+ }
+ pkgLastupdate[pkgRealpath] = lastupdate
+ d, err := json.Marshal(pkgLastupdate)
+ if err != nil {
+ return
+ }
+ ioutil.WriteFile(lastupdateFilename, d, os.ModePerm)
+}
+
+func getpathTime(pkgRealpath string) (lastupdate int64, err error) {
+ fl, err := ioutil.ReadDir(pkgRealpath)
+ if err != nil {
+ return lastupdate, err
+ }
+ for _, f := range fl {
+ if lastupdate < f.ModTime().UnixNano() {
+ lastupdate = f.ModTime().UnixNano()
+ }
+ }
+ return lastupdate, nil
+}
+
+func getRouterDir(pkgRealpath string) string {
+ dir := filepath.Dir(pkgRealpath)
+ for {
+ routersDir := AppConfig.DefaultString("routersdir", "routers")
+ d := filepath.Join(dir, routersDir)
+ if utils.FileExists(d) {
+ return d
+ }
+
+ if r, _ := filepath.Rel(dir, AppPath); r == "." {
+ return d
+ }
+ // Parent dir.
+ dir = filepath.Dir(dir)
+ }
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/policy.go b/at-admin/vendor/github.com/astaxie/beego/policy.go
new file mode 100644
index 0000000..ab23f92
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/policy.go
@@ -0,0 +1,97 @@
+// Copyright 2016 beego authors. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "strings"
+
+ "github.com/astaxie/beego/context"
+)
+
+// PolicyFunc defines a policy function which is invoked before the controller handler is executed.
+type PolicyFunc func(*context.Context)
+
+// FindPolicy Find Router info for URL
+func (p *ControllerRegister) FindPolicy(cont *context.Context) []PolicyFunc {
+ var urlPath = cont.Input.URL()
+ if !BConfig.RouterCaseSensitive {
+ urlPath = strings.ToLower(urlPath)
+ }
+ httpMethod := cont.Input.Method()
+ isWildcard := false
+ // Find policy for current method
+ t, ok := p.policies[httpMethod]
+ // If not found - find policy for whole controller
+ if !ok {
+ t, ok = p.policies["*"]
+ isWildcard = true
+ }
+ if ok {
+ runObjects := t.Match(urlPath, cont)
+ if r, ok := runObjects.([]PolicyFunc); ok {
+ return r
+ } else if !isWildcard {
+ // If no policies found and we checked not for "*" method - try to find it
+ t, ok = p.policies["*"]
+ if ok {
+ runObjects = t.Match(urlPath, cont)
+ if r, ok = runObjects.([]PolicyFunc); ok {
+ return r
+ }
+ }
+ }
+ }
+ return nil
+}
+
+func (p *ControllerRegister) addToPolicy(method, pattern string, r ...PolicyFunc) {
+ method = strings.ToUpper(method)
+ p.enablePolicy = true
+ if !BConfig.RouterCaseSensitive {
+ pattern = strings.ToLower(pattern)
+ }
+ if t, ok := p.policies[method]; ok {
+ t.AddRouter(pattern, r)
+ } else {
+ t := NewTree()
+ t.AddRouter(pattern, r)
+ p.policies[method] = t
+ }
+}
+
+// Policy Register new policy in beego
+func Policy(pattern, method string, policy ...PolicyFunc) {
+ BeeApp.Handlers.addToPolicy(method, pattern, policy...)
+}
+
+// Find policies and execute if were found
+func (p *ControllerRegister) execPolicy(cont *context.Context, urlPath string) (started bool) {
+ if !p.enablePolicy {
+ return false
+ }
+ // Find Policy for method
+ policyList := p.FindPolicy(cont)
+ if len(policyList) > 0 {
+ // Run policies
+ for _, runPolicy := range policyList {
+ runPolicy(cont)
+ if cont.ResponseWriter.Started {
+ return true
+ }
+ }
+ return false
+ }
+ return false
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/router.go b/at-admin/vendor/github.com/astaxie/beego/router.go
new file mode 100644
index 0000000..3593be4
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/router.go
@@ -0,0 +1,1008 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "errors"
+ "fmt"
+ "net/http"
+ "path"
+ "path/filepath"
+ "reflect"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ beecontext "github.com/astaxie/beego/context"
+ "github.com/astaxie/beego/context/param"
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/toolbox"
+ "github.com/astaxie/beego/utils"
+)
+
+// default filter execution points
+const (
+ BeforeStatic = iota
+ BeforeRouter
+ BeforeExec
+ AfterExec
+ FinishRouter
+)
+
+const (
+ routerTypeBeego = iota
+ routerTypeRESTFul
+ routerTypeHandler
+)
+
+var (
+ // HTTPMETHOD list the supported http methods.
+ HTTPMETHOD = map[string]bool{
+ "GET": true,
+ "POST": true,
+ "PUT": true,
+ "DELETE": true,
+ "PATCH": true,
+ "OPTIONS": true,
+ "HEAD": true,
+ "TRACE": true,
+ "CONNECT": true,
+ "MKCOL": true,
+ "COPY": true,
+ "MOVE": true,
+ "PROPFIND": true,
+ "PROPPATCH": true,
+ "LOCK": true,
+ "UNLOCK": true,
+ }
+ // these beego.Controller's methods shouldn't reflect to AutoRouter
+ exceptMethod = []string{"Init", "Prepare", "Finish", "Render", "RenderString",
+ "RenderBytes", "Redirect", "Abort", "StopRun", "UrlFor", "ServeJSON", "ServeJSONP",
+ "ServeYAML", "ServeXML", "Input", "ParseForm", "GetString", "GetStrings", "GetInt", "GetBool",
+ "GetFloat", "GetFile", "SaveToFile", "StartSession", "SetSession", "GetSession",
+ "DelSession", "SessionRegenerateID", "DestroySession", "IsAjax", "GetSecureCookie",
+ "SetSecureCookie", "XsrfToken", "CheckXsrfCookie", "XsrfFormHtml",
+ "GetControllerAndAction", "ServeFormatted"}
+
+ urlPlaceholder = "{{placeholder}}"
+ // DefaultAccessLogFilter will skip the accesslog if return true
+ DefaultAccessLogFilter FilterHandler = &logFilter{}
+)
+
+// FilterHandler is an interface for
+type FilterHandler interface {
+ Filter(*beecontext.Context) bool
+}
+
+// default log filter static file will not show
+type logFilter struct {
+}
+
+func (l *logFilter) Filter(ctx *beecontext.Context) bool {
+ requestPath := path.Clean(ctx.Request.URL.Path)
+ if requestPath == "/favicon.ico" || requestPath == "/robots.txt" {
+ return true
+ }
+ for prefix := range BConfig.WebConfig.StaticDir {
+ if strings.HasPrefix(requestPath, prefix) {
+ return true
+ }
+ }
+ return false
+}
+
+// ExceptMethodAppend to append a slice's value into "exceptMethod", for controller's methods shouldn't reflect to AutoRouter
+func ExceptMethodAppend(action string) {
+ exceptMethod = append(exceptMethod, action)
+}
+
+// ControllerInfo holds information about the controller.
+type ControllerInfo struct {
+ pattern string
+ controllerType reflect.Type
+ methods map[string]string
+ handler http.Handler
+ runFunction FilterFunc
+ routerType int
+ initialize func() ControllerInterface
+ methodParams []*param.MethodParam
+}
+
+// ControllerRegister containers registered router rules, controller handlers and filters.
+type ControllerRegister struct {
+ routers map[string]*Tree
+ enablePolicy bool
+ policies map[string]*Tree
+ enableFilter bool
+ filters [FinishRouter + 1][]*FilterRouter
+ pool sync.Pool
+}
+
+// NewControllerRegister returns a new ControllerRegister.
+func NewControllerRegister() *ControllerRegister {
+ return &ControllerRegister{
+ routers: make(map[string]*Tree),
+ policies: make(map[string]*Tree),
+ pool: sync.Pool{
+ New: func() interface{} {
+ return beecontext.NewContext()
+ },
+ },
+ }
+}
+
+// Add controller handler and pattern rules to ControllerRegister.
+// usage:
+// default methods is the same name as method
+// Add("/user",&UserController{})
+// Add("/api/list",&RestController{},"*:ListFood")
+// Add("/api/create",&RestController{},"post:CreateFood")
+// Add("/api/update",&RestController{},"put:UpdateFood")
+// Add("/api/delete",&RestController{},"delete:DeleteFood")
+// Add("/api",&RestController{},"get,post:ApiFunc"
+// Add("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")
+func (p *ControllerRegister) Add(pattern string, c ControllerInterface, mappingMethods ...string) {
+ p.addWithMethodParams(pattern, c, nil, mappingMethods...)
+}
+
+func (p *ControllerRegister) addWithMethodParams(pattern string, c ControllerInterface, methodParams []*param.MethodParam, mappingMethods ...string) {
+ reflectVal := reflect.ValueOf(c)
+ t := reflect.Indirect(reflectVal).Type()
+ methods := make(map[string]string)
+ if len(mappingMethods) > 0 {
+ semi := strings.Split(mappingMethods[0], ";")
+ for _, v := range semi {
+ colon := strings.Split(v, ":")
+ if len(colon) != 2 {
+ panic("method mapping format is invalid")
+ }
+ comma := strings.Split(colon[0], ",")
+ for _, m := range comma {
+ if m == "*" || HTTPMETHOD[strings.ToUpper(m)] {
+ if val := reflectVal.MethodByName(colon[1]); val.IsValid() {
+ methods[strings.ToUpper(m)] = colon[1]
+ } else {
+ panic("'" + colon[1] + "' method doesn't exist in the controller " + t.Name())
+ }
+ } else {
+ panic(v + " is an invalid method mapping. Method doesn't exist " + m)
+ }
+ }
+ }
+ }
+
+ route := &ControllerInfo{}
+ route.pattern = pattern
+ route.methods = methods
+ route.routerType = routerTypeBeego
+ route.controllerType = t
+ route.initialize = func() ControllerInterface {
+ vc := reflect.New(route.controllerType)
+ execController, ok := vc.Interface().(ControllerInterface)
+ if !ok {
+ panic("controller is not ControllerInterface")
+ }
+
+ elemVal := reflect.ValueOf(c).Elem()
+ elemType := reflect.TypeOf(c).Elem()
+ execElem := reflect.ValueOf(execController).Elem()
+
+ numOfFields := elemVal.NumField()
+ for i := 0; i < numOfFields; i++ {
+ fieldType := elemType.Field(i)
+ elemField := execElem.FieldByName(fieldType.Name)
+ if elemField.CanSet() {
+ fieldVal := elemVal.Field(i)
+ elemField.Set(fieldVal)
+ }
+ }
+
+ return execController
+ }
+
+ route.methodParams = methodParams
+ if len(methods) == 0 {
+ for m := range HTTPMETHOD {
+ p.addToRouter(m, pattern, route)
+ }
+ } else {
+ for k := range methods {
+ if k == "*" {
+ for m := range HTTPMETHOD {
+ p.addToRouter(m, pattern, route)
+ }
+ } else {
+ p.addToRouter(k, pattern, route)
+ }
+ }
+ }
+}
+
+func (p *ControllerRegister) addToRouter(method, pattern string, r *ControllerInfo) {
+ if !BConfig.RouterCaseSensitive {
+ pattern = strings.ToLower(pattern)
+ }
+ if t, ok := p.routers[method]; ok {
+ t.AddRouter(pattern, r)
+ } else {
+ t := NewTree()
+ t.AddRouter(pattern, r)
+ p.routers[method] = t
+ }
+}
+
+// Include only when the Runmode is dev will generate router file in the router/auto.go from the controller
+// Include(&BankAccount{}, &OrderController{},&RefundController{},&ReceiptController{})
+func (p *ControllerRegister) Include(cList ...ControllerInterface) {
+ if BConfig.RunMode == DEV {
+ skip := make(map[string]bool, 10)
+ for _, c := range cList {
+ reflectVal := reflect.ValueOf(c)
+ t := reflect.Indirect(reflectVal).Type()
+ wgopath := utils.GetGOPATHs()
+ if len(wgopath) == 0 {
+ panic("you are in dev mode. So please set gopath")
+ }
+ pkgpath := ""
+ for _, wg := range wgopath {
+ wg, _ = filepath.EvalSymlinks(filepath.Join(wg, "src", t.PkgPath()))
+ if utils.FileExists(wg) {
+ pkgpath = wg
+ break
+ }
+ }
+ if pkgpath != "" {
+ if _, ok := skip[pkgpath]; !ok {
+ skip[pkgpath] = true
+ parserPkg(pkgpath, t.PkgPath())
+ }
+ }
+ }
+ }
+ for _, c := range cList {
+ reflectVal := reflect.ValueOf(c)
+ t := reflect.Indirect(reflectVal).Type()
+ key := t.PkgPath() + ":" + t.Name()
+ if comm, ok := GlobalControllerRouter[key]; ok {
+ for _, a := range comm {
+ for _, f := range a.Filters {
+ p.InsertFilter(f.Pattern, f.Pos, f.Filter, f.ReturnOnOutput, f.ResetParams)
+ }
+
+ p.addWithMethodParams(a.Router, c, a.MethodParams, strings.Join(a.AllowHTTPMethods, ",")+":"+a.Method)
+ }
+ }
+ }
+}
+
+// Get add get method
+// usage:
+// Get("/", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Get(pattern string, f FilterFunc) {
+ p.AddMethod("get", pattern, f)
+}
+
+// Post add post method
+// usage:
+// Post("/api", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Post(pattern string, f FilterFunc) {
+ p.AddMethod("post", pattern, f)
+}
+
+// Put add put method
+// usage:
+// Put("/api/:id", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Put(pattern string, f FilterFunc) {
+ p.AddMethod("put", pattern, f)
+}
+
+// Delete add delete method
+// usage:
+// Delete("/api/:id", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Delete(pattern string, f FilterFunc) {
+ p.AddMethod("delete", pattern, f)
+}
+
+// Head add head method
+// usage:
+// Head("/api/:id", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Head(pattern string, f FilterFunc) {
+ p.AddMethod("head", pattern, f)
+}
+
+// Patch add patch method
+// usage:
+// Patch("/api/:id", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Patch(pattern string, f FilterFunc) {
+ p.AddMethod("patch", pattern, f)
+}
+
+// Options add options method
+// usage:
+// Options("/api/:id", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Options(pattern string, f FilterFunc) {
+ p.AddMethod("options", pattern, f)
+}
+
+// Any add all method
+// usage:
+// Any("/api/:id", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) Any(pattern string, f FilterFunc) {
+ p.AddMethod("*", pattern, f)
+}
+
+// AddMethod add http method router
+// usage:
+// AddMethod("get","/api/:id", func(ctx *context.Context){
+// ctx.Output.Body("hello world")
+// })
+func (p *ControllerRegister) AddMethod(method, pattern string, f FilterFunc) {
+ method = strings.ToUpper(method)
+ if method != "*" && !HTTPMETHOD[method] {
+ panic("not support http method: " + method)
+ }
+ route := &ControllerInfo{}
+ route.pattern = pattern
+ route.routerType = routerTypeRESTFul
+ route.runFunction = f
+ methods := make(map[string]string)
+ if method == "*" {
+ for val := range HTTPMETHOD {
+ methods[val] = val
+ }
+ } else {
+ methods[method] = method
+ }
+ route.methods = methods
+ for k := range methods {
+ if k == "*" {
+ for m := range HTTPMETHOD {
+ p.addToRouter(m, pattern, route)
+ }
+ } else {
+ p.addToRouter(k, pattern, route)
+ }
+ }
+}
+
+// Handler add user defined Handler
+func (p *ControllerRegister) Handler(pattern string, h http.Handler, options ...interface{}) {
+ route := &ControllerInfo{}
+ route.pattern = pattern
+ route.routerType = routerTypeHandler
+ route.handler = h
+ if len(options) > 0 {
+ if _, ok := options[0].(bool); ok {
+ pattern = path.Join(pattern, "?:all(.*)")
+ }
+ }
+ for m := range HTTPMETHOD {
+ p.addToRouter(m, pattern, route)
+ }
+}
+
+// AddAuto router to ControllerRegister.
+// example beego.AddAuto(&MainContorlller{}),
+// MainController has method List and Page.
+// visit the url /main/list to execute List function
+// /main/page to execute Page function.
+func (p *ControllerRegister) AddAuto(c ControllerInterface) {
+ p.AddAutoPrefix("/", c)
+}
+
+// AddAutoPrefix Add auto router to ControllerRegister with prefix.
+// example beego.AddAutoPrefix("/admin",&MainContorlller{}),
+// MainController has method List and Page.
+// visit the url /admin/main/list to execute List function
+// /admin/main/page to execute Page function.
+func (p *ControllerRegister) AddAutoPrefix(prefix string, c ControllerInterface) {
+ reflectVal := reflect.ValueOf(c)
+ rt := reflectVal.Type()
+ ct := reflect.Indirect(reflectVal).Type()
+ controllerName := strings.TrimSuffix(ct.Name(), "Controller")
+ for i := 0; i < rt.NumMethod(); i++ {
+ if !utils.InSlice(rt.Method(i).Name, exceptMethod) {
+ route := &ControllerInfo{}
+ route.routerType = routerTypeBeego
+ route.methods = map[string]string{"*": rt.Method(i).Name}
+ route.controllerType = ct
+ pattern := path.Join(prefix, strings.ToLower(controllerName), strings.ToLower(rt.Method(i).Name), "*")
+ patternInit := path.Join(prefix, controllerName, rt.Method(i).Name, "*")
+ patternFix := path.Join(prefix, strings.ToLower(controllerName), strings.ToLower(rt.Method(i).Name))
+ patternFixInit := path.Join(prefix, controllerName, rt.Method(i).Name)
+ route.pattern = pattern
+ for m := range HTTPMETHOD {
+ p.addToRouter(m, pattern, route)
+ p.addToRouter(m, patternInit, route)
+ p.addToRouter(m, patternFix, route)
+ p.addToRouter(m, patternFixInit, route)
+ }
+ }
+ }
+}
+
+// InsertFilter Add a FilterFunc with pattern rule and action constant.
+// params is for:
+// 1. setting the returnOnOutput value (false allows multiple filters to execute)
+// 2. determining whether or not params need to be reset.
+func (p *ControllerRegister) InsertFilter(pattern string, pos int, filter FilterFunc, params ...bool) error {
+ mr := &FilterRouter{
+ tree: NewTree(),
+ pattern: pattern,
+ filterFunc: filter,
+ returnOnOutput: true,
+ }
+ if !BConfig.RouterCaseSensitive {
+ mr.pattern = strings.ToLower(pattern)
+ }
+
+ paramsLen := len(params)
+ if paramsLen > 0 {
+ mr.returnOnOutput = params[0]
+ }
+ if paramsLen > 1 {
+ mr.resetParams = params[1]
+ }
+ mr.tree.AddRouter(pattern, true)
+ return p.insertFilterRouter(pos, mr)
+}
+
+// add Filter into
+func (p *ControllerRegister) insertFilterRouter(pos int, mr *FilterRouter) (err error) {
+ if pos < BeforeStatic || pos > FinishRouter {
+ return errors.New("can not find your filter position")
+ }
+ p.enableFilter = true
+ p.filters[pos] = append(p.filters[pos], mr)
+ return nil
+}
+
+// URLFor does another controller handler in this request function.
+// it can access any controller method.
+func (p *ControllerRegister) URLFor(endpoint string, values ...interface{}) string {
+ paths := strings.Split(endpoint, ".")
+ if len(paths) <= 1 {
+ logs.Warn("urlfor endpoint must like path.controller.method")
+ return ""
+ }
+ if len(values)%2 != 0 {
+ logs.Warn("urlfor params must key-value pair")
+ return ""
+ }
+ params := make(map[string]string)
+ if len(values) > 0 {
+ key := ""
+ for k, v := range values {
+ if k%2 == 0 {
+ key = fmt.Sprint(v)
+ } else {
+ params[key] = fmt.Sprint(v)
+ }
+ }
+ }
+ controllerName := strings.Join(paths[:len(paths)-1], "/")
+ methodName := paths[len(paths)-1]
+ for m, t := range p.routers {
+ ok, url := p.getURL(t, "/", controllerName, methodName, params, m)
+ if ok {
+ return url
+ }
+ }
+ return ""
+}
+
+func (p *ControllerRegister) getURL(t *Tree, url, controllerName, methodName string, params map[string]string, httpMethod string) (bool, string) {
+ for _, subtree := range t.fixrouters {
+ u := path.Join(url, subtree.prefix)
+ ok, u := p.getURL(subtree, u, controllerName, methodName, params, httpMethod)
+ if ok {
+ return ok, u
+ }
+ }
+ if t.wildcard != nil {
+ u := path.Join(url, urlPlaceholder)
+ ok, u := p.getURL(t.wildcard, u, controllerName, methodName, params, httpMethod)
+ if ok {
+ return ok, u
+ }
+ }
+ for _, l := range t.leaves {
+ if c, ok := l.runObject.(*ControllerInfo); ok {
+ if c.routerType == routerTypeBeego &&
+ strings.HasSuffix(path.Join(c.controllerType.PkgPath(), c.controllerType.Name()), controllerName) {
+ find := false
+ if HTTPMETHOD[strings.ToUpper(methodName)] {
+ if len(c.methods) == 0 {
+ find = true
+ } else if m, ok := c.methods[strings.ToUpper(methodName)]; ok && m == strings.ToUpper(methodName) {
+ find = true
+ } else if m, ok = c.methods["*"]; ok && m == methodName {
+ find = true
+ }
+ }
+ if !find {
+ for m, md := range c.methods {
+ if (m == "*" || m == httpMethod) && md == methodName {
+ find = true
+ }
+ }
+ }
+ if find {
+ if l.regexps == nil {
+ if len(l.wildcards) == 0 {
+ return true, strings.Replace(url, "/"+urlPlaceholder, "", 1) + toURL(params)
+ }
+ if len(l.wildcards) == 1 {
+ if v, ok := params[l.wildcards[0]]; ok {
+ delete(params, l.wildcards[0])
+ return true, strings.Replace(url, urlPlaceholder, v, 1) + toURL(params)
+ }
+ return false, ""
+ }
+ if len(l.wildcards) == 3 && l.wildcards[0] == "." {
+ if p, ok := params[":path"]; ok {
+ if e, isok := params[":ext"]; isok {
+ delete(params, ":path")
+ delete(params, ":ext")
+ return true, strings.Replace(url, urlPlaceholder, p+"."+e, -1) + toURL(params)
+ }
+ }
+ }
+ canSkip := false
+ for _, v := range l.wildcards {
+ if v == ":" {
+ canSkip = true
+ continue
+ }
+ if u, ok := params[v]; ok {
+ delete(params, v)
+ url = strings.Replace(url, urlPlaceholder, u, 1)
+ } else {
+ if canSkip {
+ canSkip = false
+ continue
+ }
+ return false, ""
+ }
+ }
+ return true, url + toURL(params)
+ }
+ var i int
+ var startReg bool
+ regURL := ""
+ for _, v := range strings.Trim(l.regexps.String(), "^$") {
+ if v == '(' {
+ startReg = true
+ continue
+ } else if v == ')' {
+ startReg = false
+ if v, ok := params[l.wildcards[i]]; ok {
+ delete(params, l.wildcards[i])
+ regURL = regURL + v
+ i++
+ } else {
+ break
+ }
+ } else if !startReg {
+ regURL = string(append([]rune(regURL), v))
+ }
+ }
+ if l.regexps.MatchString(regURL) {
+ ps := strings.Split(regURL, "/")
+ for _, p := range ps {
+ url = strings.Replace(url, urlPlaceholder, p, 1)
+ }
+ return true, url + toURL(params)
+ }
+ }
+ }
+ }
+ }
+
+ return false, ""
+}
+
+func (p *ControllerRegister) execFilter(context *beecontext.Context, urlPath string, pos int) (started bool) {
+ var preFilterParams map[string]string
+ for _, filterR := range p.filters[pos] {
+ if filterR.returnOnOutput && context.ResponseWriter.Started {
+ return true
+ }
+ if filterR.resetParams {
+ preFilterParams = context.Input.Params()
+ }
+ if ok := filterR.ValidRouter(urlPath, context); ok {
+ filterR.filterFunc(context)
+ if filterR.resetParams {
+ context.Input.ResetParams()
+ for k, v := range preFilterParams {
+ context.Input.SetParam(k, v)
+ }
+ }
+ }
+ if filterR.returnOnOutput && context.ResponseWriter.Started {
+ return true
+ }
+ }
+ return false
+}
+
+// Implement http.Handler interface.
+func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
+ startTime := time.Now()
+ var (
+ runRouter reflect.Type
+ findRouter bool
+ runMethod string
+ methodParams []*param.MethodParam
+ routerInfo *ControllerInfo
+ isRunnable bool
+ )
+ context := p.pool.Get().(*beecontext.Context)
+ context.Reset(rw, r)
+
+ defer p.pool.Put(context)
+ if BConfig.RecoverFunc != nil {
+ defer BConfig.RecoverFunc(context)
+ }
+
+ context.Output.EnableGzip = BConfig.EnableGzip
+
+ if BConfig.RunMode == DEV {
+ context.Output.Header("Server", BConfig.ServerName)
+ }
+
+ var urlPath = r.URL.Path
+
+ if !BConfig.RouterCaseSensitive {
+ urlPath = strings.ToLower(urlPath)
+ }
+
+ // filter wrong http method
+ if !HTTPMETHOD[r.Method] {
+ exception("405", context)
+ goto Admin
+ }
+
+ // filter for static file
+ if len(p.filters[BeforeStatic]) > 0 && p.execFilter(context, urlPath, BeforeStatic) {
+ goto Admin
+ }
+
+ serverStaticRouter(context)
+
+ if context.ResponseWriter.Started {
+ findRouter = true
+ goto Admin
+ }
+
+ if r.Method != http.MethodGet && r.Method != http.MethodHead {
+ if BConfig.CopyRequestBody && !context.Input.IsUpload() {
+ context.Input.CopyBody(BConfig.MaxMemory)
+ }
+ context.Input.ParseFormOrMulitForm(BConfig.MaxMemory)
+ }
+
+ // session init
+ if BConfig.WebConfig.Session.SessionOn {
+ var err error
+ context.Input.CruSession, err = GlobalSessions.SessionStart(rw, r)
+ if err != nil {
+ logs.Error(err)
+ exception("503", context)
+ goto Admin
+ }
+ defer func() {
+ if context.Input.CruSession != nil {
+ context.Input.CruSession.SessionRelease(rw)
+ }
+ }()
+ }
+ if len(p.filters[BeforeRouter]) > 0 && p.execFilter(context, urlPath, BeforeRouter) {
+ goto Admin
+ }
+ // User can define RunController and RunMethod in filter
+ if context.Input.RunController != nil && context.Input.RunMethod != "" {
+ findRouter = true
+ runMethod = context.Input.RunMethod
+ runRouter = context.Input.RunController
+ } else {
+ routerInfo, findRouter = p.FindRouter(context)
+ }
+
+ //if no matches to url, throw a not found exception
+ if !findRouter {
+ exception("404", context)
+ goto Admin
+ }
+ if splat := context.Input.Param(":splat"); splat != "" {
+ for k, v := range strings.Split(splat, "/") {
+ context.Input.SetParam(strconv.Itoa(k), v)
+ }
+ }
+
+ //execute middleware filters
+ if len(p.filters[BeforeExec]) > 0 && p.execFilter(context, urlPath, BeforeExec) {
+ goto Admin
+ }
+
+ //check policies
+ if p.execPolicy(context, urlPath) {
+ goto Admin
+ }
+
+ if routerInfo != nil {
+ //store router pattern into context
+ context.Input.SetData("RouterPattern", routerInfo.pattern)
+ if routerInfo.routerType == routerTypeRESTFul {
+ if _, ok := routerInfo.methods[r.Method]; ok {
+ isRunnable = true
+ routerInfo.runFunction(context)
+ } else {
+ exception("405", context)
+ goto Admin
+ }
+ } else if routerInfo.routerType == routerTypeHandler {
+ isRunnable = true
+ routerInfo.handler.ServeHTTP(rw, r)
+ } else {
+ runRouter = routerInfo.controllerType
+ methodParams = routerInfo.methodParams
+ method := r.Method
+ if r.Method == http.MethodPost && context.Input.Query("_method") == http.MethodPut {
+ method = http.MethodPut
+ }
+ if r.Method == http.MethodPost && context.Input.Query("_method") == http.MethodDelete {
+ method = http.MethodDelete
+ }
+ if m, ok := routerInfo.methods[method]; ok {
+ runMethod = m
+ } else if m, ok = routerInfo.methods["*"]; ok {
+ runMethod = m
+ } else {
+ runMethod = method
+ }
+ }
+ }
+
+ // also defined runRouter & runMethod from filter
+ if !isRunnable {
+ //Invoke the request handler
+ var execController ControllerInterface
+ if routerInfo != nil && routerInfo.initialize != nil {
+ execController = routerInfo.initialize()
+ } else {
+ vc := reflect.New(runRouter)
+ var ok bool
+ execController, ok = vc.Interface().(ControllerInterface)
+ if !ok {
+ panic("controller is not ControllerInterface")
+ }
+ }
+
+ //call the controller init function
+ execController.Init(context, runRouter.Name(), runMethod, execController)
+
+ //call prepare function
+ execController.Prepare()
+
+ //if XSRF is Enable then check cookie where there has any cookie in the request's cookie _csrf
+ if BConfig.WebConfig.EnableXSRF {
+ execController.XSRFToken()
+ if r.Method == http.MethodPost || r.Method == http.MethodDelete || r.Method == http.MethodPut ||
+ (r.Method == http.MethodPost && (context.Input.Query("_method") == http.MethodDelete || context.Input.Query("_method") == http.MethodPut)) {
+ execController.CheckXSRFCookie()
+ }
+ }
+
+ execController.URLMapping()
+
+ if !context.ResponseWriter.Started {
+ //exec main logic
+ switch runMethod {
+ case http.MethodGet:
+ execController.Get()
+ case http.MethodPost:
+ execController.Post()
+ case http.MethodDelete:
+ execController.Delete()
+ case http.MethodPut:
+ execController.Put()
+ case http.MethodHead:
+ execController.Head()
+ case http.MethodPatch:
+ execController.Patch()
+ case http.MethodOptions:
+ execController.Options()
+ case http.MethodTrace:
+ execController.Trace()
+ default:
+ if !execController.HandlerFunc(runMethod) {
+ vc := reflect.ValueOf(execController)
+ method := vc.MethodByName(runMethod)
+ in := param.ConvertParams(methodParams, method.Type(), context)
+ out := method.Call(in)
+
+ //For backward compatibility we only handle response if we had incoming methodParams
+ if methodParams != nil {
+ p.handleParamResponse(context, execController, out)
+ }
+ }
+ }
+
+ //render template
+ if !context.ResponseWriter.Started && context.Output.Status == 0 {
+ if BConfig.WebConfig.AutoRender {
+ if err := execController.Render(); err != nil {
+ logs.Error(err)
+ }
+ }
+ }
+ }
+
+ // finish all runRouter. release resource
+ execController.Finish()
+ }
+
+ //execute middleware filters
+ if len(p.filters[AfterExec]) > 0 && p.execFilter(context, urlPath, AfterExec) {
+ goto Admin
+ }
+
+ if len(p.filters[FinishRouter]) > 0 && p.execFilter(context, urlPath, FinishRouter) {
+ goto Admin
+ }
+
+Admin:
+ //admin module record QPS
+
+ statusCode := context.ResponseWriter.Status
+ if statusCode == 0 {
+ statusCode = 200
+ }
+
+ LogAccess(context, &startTime, statusCode)
+
+ timeDur := time.Since(startTime)
+ context.ResponseWriter.Elapsed = timeDur
+ if BConfig.Listen.EnableAdmin {
+ pattern := ""
+ if routerInfo != nil {
+ pattern = routerInfo.pattern
+ }
+
+ if FilterMonitorFunc(r.Method, r.URL.Path, timeDur, pattern, statusCode) {
+ routerName := ""
+ if runRouter != nil {
+ routerName = runRouter.Name()
+ }
+ go toolbox.StatisticsMap.AddStatistics(r.Method, r.URL.Path, routerName, timeDur)
+ }
+ }
+
+ if BConfig.RunMode == DEV && !BConfig.Log.AccessLogs {
+ match := map[bool]string{true: "match", false: "nomatch"}
+ devInfo := fmt.Sprintf("|%15s|%s %3d %s|%13s|%8s|%s %-7s %s %-3s",
+ context.Input.IP(),
+ logs.ColorByStatus(statusCode), statusCode, logs.ResetColor(),
+ timeDur.String(),
+ match[findRouter],
+ logs.ColorByMethod(r.Method), r.Method, logs.ResetColor(),
+ r.URL.Path)
+ if routerInfo != nil {
+ devInfo += fmt.Sprintf(" r:%s", routerInfo.pattern)
+ }
+
+ logs.Debug(devInfo)
+ }
+ // Call WriteHeader if status code has been set changed
+ if context.Output.Status != 0 {
+ context.ResponseWriter.WriteHeader(context.Output.Status)
+ }
+}
+
+func (p *ControllerRegister) handleParamResponse(context *beecontext.Context, execController ControllerInterface, results []reflect.Value) {
+ //looping in reverse order for the case when both error and value are returned and error sets the response status code
+ for i := len(results) - 1; i >= 0; i-- {
+ result := results[i]
+ if result.Kind() != reflect.Interface || !result.IsNil() {
+ resultValue := result.Interface()
+ context.RenderMethodResult(resultValue)
+ }
+ }
+ if !context.ResponseWriter.Started && len(results) > 0 && context.Output.Status == 0 {
+ context.Output.SetStatus(200)
+ }
+}
+
+// FindRouter Find Router info for URL
+func (p *ControllerRegister) FindRouter(context *beecontext.Context) (routerInfo *ControllerInfo, isFind bool) {
+ var urlPath = context.Input.URL()
+ if !BConfig.RouterCaseSensitive {
+ urlPath = strings.ToLower(urlPath)
+ }
+ httpMethod := context.Input.Method()
+ if t, ok := p.routers[httpMethod]; ok {
+ runObject := t.Match(urlPath, context)
+ if r, ok := runObject.(*ControllerInfo); ok {
+ return r, true
+ }
+ }
+ return
+}
+
+func toURL(params map[string]string) string {
+ if len(params) == 0 {
+ return ""
+ }
+ u := "?"
+ for k, v := range params {
+ u += k + "=" + v + "&"
+ }
+ return strings.TrimRight(u, "&")
+}
+
+// LogAccess logging info HTTP Access
+func LogAccess(ctx *beecontext.Context, startTime *time.Time, statusCode int) {
+ //Skip logging if AccessLogs config is false
+ if !BConfig.Log.AccessLogs {
+ return
+ }
+ //Skip logging static requests unless EnableStaticLogs config is true
+ if !BConfig.Log.EnableStaticLogs && DefaultAccessLogFilter.Filter(ctx) {
+ return
+ }
+ var (
+ requestTime time.Time
+ elapsedTime time.Duration
+ r = ctx.Request
+ )
+ if startTime != nil {
+ requestTime = *startTime
+ elapsedTime = time.Since(*startTime)
+ }
+ record := &logs.AccessLogRecord{
+ RemoteAddr: ctx.Input.IP(),
+ RequestTime: requestTime,
+ RequestMethod: r.Method,
+ Request: fmt.Sprintf("%s %s %s", r.Method, r.RequestURI, r.Proto),
+ ServerProtocol: r.Proto,
+ Host: r.Host,
+ Status: statusCode,
+ ElapsedTime: elapsedTime,
+ HTTPReferrer: r.Header.Get("Referer"),
+ HTTPUserAgent: r.Header.Get("User-Agent"),
+ RemoteUser: r.Header.Get("Remote-User"),
+ BodyBytesSent: 0, //@todo this one is missing!
+ }
+ logs.AccessLog(record, BConfig.Log.AccessLogsFormat)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/session/README.md b/at-admin/vendor/github.com/astaxie/beego/session/README.md
new file mode 100644
index 0000000..6d0a297
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/session/README.md
@@ -0,0 +1,114 @@
+session
+==============
+
+session is a Go session manager. It can use many session providers. Just like the `database/sql` and `database/sql/driver`.
+
+## How to install?
+
+ go get github.com/astaxie/beego/session
+
+
+## What providers are supported?
+
+As of now this session manager support memory, file, Redis and MySQL.
+
+
+## How to use it?
+
+First you must import it
+
+ import (
+ "github.com/astaxie/beego/session"
+ )
+
+Then in you web app init the global session manager
+
+ var globalSessions *session.Manager
+
+* Use **memory** as provider:
+
+ func init() {
+ globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid","gclifetime":3600}`)
+ go globalSessions.GC()
+ }
+
+* Use **file** as provider, the last param is the path where you want file to be stored:
+
+ func init() {
+ globalSessions, _ = session.NewManager("file",`{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"./tmp"}`)
+ go globalSessions.GC()
+ }
+
+* Use **Redis** as provider, the last param is the Redis conn address,poolsize,password:
+
+ func init() {
+ globalSessions, _ = session.NewManager("redis", `{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"127.0.0.1:6379,100,astaxie"}`)
+ go globalSessions.GC()
+ }
+
+* Use **MySQL** as provider, the last param is the DSN, learn more from [mysql](https://github.com/go-sql-driver/mysql#dsn-data-source-name):
+
+ func init() {
+ globalSessions, _ = session.NewManager(
+ "mysql", `{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"username:password@protocol(address)/dbname?param=value"}`)
+ go globalSessions.GC()
+ }
+
+* Use **Cookie** as provider:
+
+ func init() {
+ globalSessions, _ = session.NewManager(
+ "cookie", `{"cookieName":"gosessionid","enableSetCookie":false,"gclifetime":3600,"ProviderConfig":"{\"cookieName\":\"gosessionid\",\"securityKey\":\"beegocookiehashkey\"}"}`)
+ go globalSessions.GC()
+ }
+
+
+Finally in the handlerfunc you can use it like this
+
+ func login(w http.ResponseWriter, r *http.Request) {
+ sess := globalSessions.SessionStart(w, r)
+ defer sess.SessionRelease(w)
+ username := sess.Get("username")
+ fmt.Println(username)
+ if r.Method == "GET" {
+ t, _ := template.ParseFiles("login.gtpl")
+ t.Execute(w, nil)
+ } else {
+ fmt.Println("username:", r.Form["username"])
+ sess.Set("username", r.Form["username"])
+ fmt.Println("password:", r.Form["password"])
+ }
+ }
+
+
+## How to write own provider?
+
+When you develop a web app, maybe you want to write own provider because you must meet the requirements.
+
+Writing a provider is easy. You only need to define two struct types
+(Session and Provider), which satisfy the interface definition.
+Maybe you will find the **memory** provider is a good example.
+
+ type SessionStore interface {
+ Set(key, value interface{}) error //set session value
+ Get(key interface{}) interface{} //get session value
+ Delete(key interface{}) error //delete session value
+ SessionID() string //back current sessionID
+ SessionRelease(w http.ResponseWriter) // release the resource & save data to provider & return the data
+ Flush() error //delete all data
+ }
+
+ type Provider interface {
+ SessionInit(gclifetime int64, config string) error
+ SessionRead(sid string) (SessionStore, error)
+ SessionExist(sid string) bool
+ SessionRegenerate(oldsid, sid string) (SessionStore, error)
+ SessionDestroy(sid string) error
+ SessionAll() int //get all active session
+ SessionGC()
+ }
+
+
+## LICENSE
+
+BSD License http://creativecommons.org/licenses/BSD/
diff --git a/at-admin/vendor/github.com/astaxie/beego/session/sess_cookie.go b/at-admin/vendor/github.com/astaxie/beego/session/sess_cookie.go
new file mode 100644
index 0000000..145e53c
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/session/sess_cookie.go
@@ -0,0 +1,178 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package session
+
+import (
+ "crypto/aes"
+ "crypto/cipher"
+ "encoding/json"
+ "net/http"
+ "net/url"
+ "sync"
+)
+
+var cookiepder = &CookieProvider{}
+
+// CookieSessionStore Cookie SessionStore
+type CookieSessionStore struct {
+ sid string
+ values map[interface{}]interface{} // session data
+ lock sync.RWMutex
+}
+
+// Set value to cookie session.
+// the value are encoded as gob with hash block string.
+func (st *CookieSessionStore) Set(key, value interface{}) error {
+ st.lock.Lock()
+ defer st.lock.Unlock()
+ st.values[key] = value
+ return nil
+}
+
+// Get value from cookie session
+func (st *CookieSessionStore) Get(key interface{}) interface{} {
+ st.lock.RLock()
+ defer st.lock.RUnlock()
+ if v, ok := st.values[key]; ok {
+ return v
+ }
+ return nil
+}
+
+// Delete value in cookie session
+func (st *CookieSessionStore) Delete(key interface{}) error {
+ st.lock.Lock()
+ defer st.lock.Unlock()
+ delete(st.values, key)
+ return nil
+}
+
+// Flush Clean all values in cookie session
+func (st *CookieSessionStore) Flush() error {
+ st.lock.Lock()
+ defer st.lock.Unlock()
+ st.values = make(map[interface{}]interface{})
+ return nil
+}
+
+// SessionID Return id of this cookie session
+func (st *CookieSessionStore) SessionID() string {
+ return st.sid
+}
+
+// SessionRelease Write cookie session to http response cookie
+func (st *CookieSessionStore) SessionRelease(w http.ResponseWriter) {
+ encodedCookie, err := encodeCookie(cookiepder.block, cookiepder.config.SecurityKey, cookiepder.config.SecurityName, st.values)
+ if err == nil {
+ cookie := &http.Cookie{Name: cookiepder.config.CookieName,
+ Value: url.QueryEscape(encodedCookie),
+ Path: "/",
+ HttpOnly: true,
+ Secure: cookiepder.config.Secure,
+ MaxAge: cookiepder.config.Maxage}
+ http.SetCookie(w, cookie)
+ }
+}
+
+type cookieConfig struct {
+ SecurityKey string `json:"securityKey"`
+ BlockKey string `json:"blockKey"`
+ SecurityName string `json:"securityName"`
+ CookieName string `json:"cookieName"`
+ Secure bool `json:"secure"`
+ Maxage int `json:"maxage"`
+}
+
+// CookieProvider Cookie session provider
+type CookieProvider struct {
+ maxlifetime int64
+ config *cookieConfig
+ block cipher.Block
+}
+
+// SessionInit Init cookie session provider with max lifetime and config json.
+// maxlifetime is ignored.
+// json config:
+// securityKey - hash string
+// blockKey - gob encode hash string. it's saved as aes crypto.
+// securityName - recognized name in encoded cookie string
+// cookieName - cookie name
+// maxage - cookie max life time.
+func (pder *CookieProvider) SessionInit(maxlifetime int64, config string) error {
+ pder.config = &cookieConfig{}
+ err := json.Unmarshal([]byte(config), pder.config)
+ if err != nil {
+ return err
+ }
+ if pder.config.BlockKey == "" {
+ pder.config.BlockKey = string(generateRandomKey(16))
+ }
+ if pder.config.SecurityName == "" {
+ pder.config.SecurityName = string(generateRandomKey(20))
+ }
+ pder.block, err = aes.NewCipher([]byte(pder.config.BlockKey))
+ if err != nil {
+ return err
+ }
+ pder.maxlifetime = maxlifetime
+ return nil
+}
+
+// SessionRead Get SessionStore in cooke.
+// decode cooke string to map and put into SessionStore with sid.
+func (pder *CookieProvider) SessionRead(sid string) (Store, error) {
+ maps, _ := decodeCookie(pder.block,
+ pder.config.SecurityKey,
+ pder.config.SecurityName,
+ sid, pder.maxlifetime)
+ if maps == nil {
+ maps = make(map[interface{}]interface{})
+ }
+ rs := &CookieSessionStore{sid: sid, values: maps}
+ return rs, nil
+}
+
+// SessionExist Cookie session is always existed
+func (pder *CookieProvider) SessionExist(sid string) bool {
+ return true
+}
+
+// SessionRegenerate Implement method, no used.
+func (pder *CookieProvider) SessionRegenerate(oldsid, sid string) (Store, error) {
+ return nil, nil
+}
+
+// SessionDestroy Implement method, no used.
+func (pder *CookieProvider) SessionDestroy(sid string) error {
+ return nil
+}
+
+// SessionGC Implement method, no used.
+func (pder *CookieProvider) SessionGC() {
+}
+
+// SessionAll Implement method, return 0.
+func (pder *CookieProvider) SessionAll() int {
+ return 0
+}
+
+// SessionUpdate Implement method, no used.
+func (pder *CookieProvider) SessionUpdate(sid string) error {
+ return nil
+}
+
+func init() {
+ Register("cookie", cookiepder)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/session/sess_file.go b/at-admin/vendor/github.com/astaxie/beego/session/sess_file.go
new file mode 100644
index 0000000..db14352
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/session/sess_file.go
@@ -0,0 +1,309 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package session
+
+import (
+ "fmt"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "errors"
+ "path"
+ "path/filepath"
+ "strings"
+ "sync"
+ "time"
+)
+
+var (
+ filepder = &FileProvider{}
+ gcmaxlifetime int64
+)
+
+// FileSessionStore File session store
+type FileSessionStore struct {
+ sid string
+ lock sync.RWMutex
+ values map[interface{}]interface{}
+}
+
+// Set value to file session
+func (fs *FileSessionStore) Set(key, value interface{}) error {
+ fs.lock.Lock()
+ defer fs.lock.Unlock()
+ fs.values[key] = value
+ return nil
+}
+
+// Get value from file session
+func (fs *FileSessionStore) Get(key interface{}) interface{} {
+ fs.lock.RLock()
+ defer fs.lock.RUnlock()
+ if v, ok := fs.values[key]; ok {
+ return v
+ }
+ return nil
+}
+
+// Delete value in file session by given key
+func (fs *FileSessionStore) Delete(key interface{}) error {
+ fs.lock.Lock()
+ defer fs.lock.Unlock()
+ delete(fs.values, key)
+ return nil
+}
+
+// Flush Clean all values in file session
+func (fs *FileSessionStore) Flush() error {
+ fs.lock.Lock()
+ defer fs.lock.Unlock()
+ fs.values = make(map[interface{}]interface{})
+ return nil
+}
+
+// SessionID Get file session store id
+func (fs *FileSessionStore) SessionID() string {
+ return fs.sid
+}
+
+// SessionRelease Write file session to local file with Gob string
+func (fs *FileSessionStore) SessionRelease(w http.ResponseWriter) {
+ filepder.lock.Lock()
+ defer filepder.lock.Unlock()
+ b, err := EncodeGob(fs.values)
+ if err != nil {
+ SLogger.Println(err)
+ return
+ }
+ _, err = os.Stat(path.Join(filepder.savePath, string(fs.sid[0]), string(fs.sid[1]), fs.sid))
+ var f *os.File
+ if err == nil {
+ f, err = os.OpenFile(path.Join(filepder.savePath, string(fs.sid[0]), string(fs.sid[1]), fs.sid), os.O_RDWR, 0777)
+ if err != nil {
+ SLogger.Println(err)
+ return
+ }
+ } else if os.IsNotExist(err) {
+ f, err = os.Create(path.Join(filepder.savePath, string(fs.sid[0]), string(fs.sid[1]), fs.sid))
+ if err != nil {
+ SLogger.Println(err)
+ return
+ }
+ } else {
+ return
+ }
+ f.Truncate(0)
+ f.Seek(0, 0)
+ f.Write(b)
+ f.Close()
+}
+
+// FileProvider File session provider
+type FileProvider struct {
+ lock sync.RWMutex
+ maxlifetime int64
+ savePath string
+}
+
+// SessionInit Init file session provider.
+// savePath sets the session files path.
+func (fp *FileProvider) SessionInit(maxlifetime int64, savePath string) error {
+ fp.maxlifetime = maxlifetime
+ fp.savePath = savePath
+ return nil
+}
+
+// SessionRead Read file session by sid.
+// if file is not exist, create it.
+// the file path is generated from sid string.
+func (fp *FileProvider) SessionRead(sid string) (Store, error) {
+ if strings.ContainsAny(sid, "./") {
+ return nil, nil
+ }
+ if len(sid) < 2 {
+ return nil, errors.New("length of the sid is less than 2")
+ }
+ filepder.lock.Lock()
+ defer filepder.lock.Unlock()
+
+ err := os.MkdirAll(path.Join(fp.savePath, string(sid[0]), string(sid[1])), 0777)
+ if err != nil {
+ SLogger.Println(err.Error())
+ }
+ _, err = os.Stat(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
+ var f *os.File
+ if err == nil {
+ f, err = os.OpenFile(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid), os.O_RDWR, 0777)
+ } else if os.IsNotExist(err) {
+ f, err = os.Create(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
+ } else {
+ return nil, err
+ }
+
+ defer f.Close()
+
+ os.Chtimes(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid), time.Now(), time.Now())
+ var kv map[interface{}]interface{}
+ b, err := ioutil.ReadAll(f)
+ if err != nil {
+ return nil, err
+ }
+ if len(b) == 0 {
+ kv = make(map[interface{}]interface{})
+ } else {
+ kv, err = DecodeGob(b)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ ss := &FileSessionStore{sid: sid, values: kv}
+ return ss, nil
+}
+
+// SessionExist Check file session exist.
+// it checks the file named from sid exist or not.
+func (fp *FileProvider) SessionExist(sid string) bool {
+ filepder.lock.Lock()
+ defer filepder.lock.Unlock()
+
+ _, err := os.Stat(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
+ return err == nil
+}
+
+// SessionDestroy Remove all files in this save path
+func (fp *FileProvider) SessionDestroy(sid string) error {
+ filepder.lock.Lock()
+ defer filepder.lock.Unlock()
+ os.Remove(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
+ return nil
+}
+
+// SessionGC Recycle files in save path
+func (fp *FileProvider) SessionGC() {
+ filepder.lock.Lock()
+ defer filepder.lock.Unlock()
+
+ gcmaxlifetime = fp.maxlifetime
+ filepath.Walk(fp.savePath, gcpath)
+}
+
+// SessionAll Get active file session number.
+// it walks save path to count files.
+func (fp *FileProvider) SessionAll() int {
+ a := &activeSession{}
+ err := filepath.Walk(fp.savePath, func(path string, f os.FileInfo, err error) error {
+ return a.visit(path, f, err)
+ })
+ if err != nil {
+ SLogger.Printf("filepath.Walk() returned %v\n", err)
+ return 0
+ }
+ return a.total
+}
+
+// SessionRegenerate Generate new sid for file session.
+// it delete old file and create new file named from new sid.
+func (fp *FileProvider) SessionRegenerate(oldsid, sid string) (Store, error) {
+ filepder.lock.Lock()
+ defer filepder.lock.Unlock()
+
+ oldPath := path.Join(fp.savePath, string(oldsid[0]), string(oldsid[1]))
+ oldSidFile := path.Join(oldPath, oldsid)
+ newPath := path.Join(fp.savePath, string(sid[0]), string(sid[1]))
+ newSidFile := path.Join(newPath, sid)
+
+ // new sid file is exist
+ _, err := os.Stat(newSidFile)
+ if err == nil {
+ return nil, fmt.Errorf("newsid %s exist", newSidFile)
+ }
+
+ err = os.MkdirAll(newPath, 0777)
+ if err != nil {
+ SLogger.Println(err.Error())
+ }
+
+ // if old sid file exist
+ // 1.read and parse file content
+ // 2.write content to new sid file
+ // 3.remove old sid file, change new sid file atime and ctime
+ // 4.return FileSessionStore
+ _, err = os.Stat(oldSidFile)
+ if err == nil {
+ b, err := ioutil.ReadFile(oldSidFile)
+ if err != nil {
+ return nil, err
+ }
+
+ var kv map[interface{}]interface{}
+ if len(b) == 0 {
+ kv = make(map[interface{}]interface{})
+ } else {
+ kv, err = DecodeGob(b)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ ioutil.WriteFile(newSidFile, b, 0777)
+ os.Remove(oldSidFile)
+ os.Chtimes(newSidFile, time.Now(), time.Now())
+ ss := &FileSessionStore{sid: sid, values: kv}
+ return ss, nil
+ }
+
+ // if old sid file not exist, just create new sid file and return
+ newf, err := os.Create(newSidFile)
+ if err != nil {
+ return nil, err
+ }
+ newf.Close()
+ ss := &FileSessionStore{sid: sid, values: make(map[interface{}]interface{})}
+ return ss, nil
+}
+
+// remove file in save path if expired
+func gcpath(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if info.IsDir() {
+ return nil
+ }
+ if (info.ModTime().Unix() + gcmaxlifetime) < time.Now().Unix() {
+ os.Remove(path)
+ }
+ return nil
+}
+
+type activeSession struct {
+ total int
+}
+
+func (as *activeSession) visit(paths string, f os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if f.IsDir() {
+ return nil
+ }
+ as.total = as.total + 1
+ return nil
+}
+
+func init() {
+ Register("file", filepder)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/session/sess_mem.go b/at-admin/vendor/github.com/astaxie/beego/session/sess_mem.go
new file mode 100644
index 0000000..64d8b05
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/session/sess_mem.go
@@ -0,0 +1,196 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package session
+
+import (
+ "container/list"
+ "net/http"
+ "sync"
+ "time"
+)
+
+var mempder = &MemProvider{list: list.New(), sessions: make(map[string]*list.Element)}
+
+// MemSessionStore memory session store.
+// it saved sessions in a map in memory.
+type MemSessionStore struct {
+ sid string //session id
+ timeAccessed time.Time //last access time
+ value map[interface{}]interface{} //session store
+ lock sync.RWMutex
+}
+
+// Set value to memory session
+func (st *MemSessionStore) Set(key, value interface{}) error {
+ st.lock.Lock()
+ defer st.lock.Unlock()
+ st.value[key] = value
+ return nil
+}
+
+// Get value from memory session by key
+func (st *MemSessionStore) Get(key interface{}) interface{} {
+ st.lock.RLock()
+ defer st.lock.RUnlock()
+ if v, ok := st.value[key]; ok {
+ return v
+ }
+ return nil
+}
+
+// Delete in memory session by key
+func (st *MemSessionStore) Delete(key interface{}) error {
+ st.lock.Lock()
+ defer st.lock.Unlock()
+ delete(st.value, key)
+ return nil
+}
+
+// Flush clear all values in memory session
+func (st *MemSessionStore) Flush() error {
+ st.lock.Lock()
+ defer st.lock.Unlock()
+ st.value = make(map[interface{}]interface{})
+ return nil
+}
+
+// SessionID get this id of memory session store
+func (st *MemSessionStore) SessionID() string {
+ return st.sid
+}
+
+// SessionRelease Implement method, no used.
+func (st *MemSessionStore) SessionRelease(w http.ResponseWriter) {
+}
+
+// MemProvider Implement the provider interface
+type MemProvider struct {
+ lock sync.RWMutex // locker
+ sessions map[string]*list.Element // map in memory
+ list *list.List // for gc
+ maxlifetime int64
+ savePath string
+}
+
+// SessionInit init memory session
+func (pder *MemProvider) SessionInit(maxlifetime int64, savePath string) error {
+ pder.maxlifetime = maxlifetime
+ pder.savePath = savePath
+ return nil
+}
+
+// SessionRead get memory session store by sid
+func (pder *MemProvider) SessionRead(sid string) (Store, error) {
+ pder.lock.RLock()
+ if element, ok := pder.sessions[sid]; ok {
+ go pder.SessionUpdate(sid)
+ pder.lock.RUnlock()
+ return element.Value.(*MemSessionStore), nil
+ }
+ pder.lock.RUnlock()
+ pder.lock.Lock()
+ newsess := &MemSessionStore{sid: sid, timeAccessed: time.Now(), value: make(map[interface{}]interface{})}
+ element := pder.list.PushFront(newsess)
+ pder.sessions[sid] = element
+ pder.lock.Unlock()
+ return newsess, nil
+}
+
+// SessionExist check session store exist in memory session by sid
+func (pder *MemProvider) SessionExist(sid string) bool {
+ pder.lock.RLock()
+ defer pder.lock.RUnlock()
+ if _, ok := pder.sessions[sid]; ok {
+ return true
+ }
+ return false
+}
+
+// SessionRegenerate generate new sid for session store in memory session
+func (pder *MemProvider) SessionRegenerate(oldsid, sid string) (Store, error) {
+ pder.lock.RLock()
+ if element, ok := pder.sessions[oldsid]; ok {
+ go pder.SessionUpdate(oldsid)
+ pder.lock.RUnlock()
+ pder.lock.Lock()
+ element.Value.(*MemSessionStore).sid = sid
+ pder.sessions[sid] = element
+ delete(pder.sessions, oldsid)
+ pder.lock.Unlock()
+ return element.Value.(*MemSessionStore), nil
+ }
+ pder.lock.RUnlock()
+ pder.lock.Lock()
+ newsess := &MemSessionStore{sid: sid, timeAccessed: time.Now(), value: make(map[interface{}]interface{})}
+ element := pder.list.PushFront(newsess)
+ pder.sessions[sid] = element
+ pder.lock.Unlock()
+ return newsess, nil
+}
+
+// SessionDestroy delete session store in memory session by id
+func (pder *MemProvider) SessionDestroy(sid string) error {
+ pder.lock.Lock()
+ defer pder.lock.Unlock()
+ if element, ok := pder.sessions[sid]; ok {
+ delete(pder.sessions, sid)
+ pder.list.Remove(element)
+ return nil
+ }
+ return nil
+}
+
+// SessionGC clean expired session stores in memory session
+func (pder *MemProvider) SessionGC() {
+ pder.lock.RLock()
+ for {
+ element := pder.list.Back()
+ if element == nil {
+ break
+ }
+ if (element.Value.(*MemSessionStore).timeAccessed.Unix() + pder.maxlifetime) < time.Now().Unix() {
+ pder.lock.RUnlock()
+ pder.lock.Lock()
+ pder.list.Remove(element)
+ delete(pder.sessions, element.Value.(*MemSessionStore).sid)
+ pder.lock.Unlock()
+ pder.lock.RLock()
+ } else {
+ break
+ }
+ }
+ pder.lock.RUnlock()
+}
+
+// SessionAll get count number of memory session
+func (pder *MemProvider) SessionAll() int {
+ return pder.list.Len()
+}
+
+// SessionUpdate expand time of session store by id in memory session
+func (pder *MemProvider) SessionUpdate(sid string) error {
+ pder.lock.Lock()
+ defer pder.lock.Unlock()
+ if element, ok := pder.sessions[sid]; ok {
+ element.Value.(*MemSessionStore).timeAccessed = time.Now()
+ pder.list.MoveToFront(element)
+ return nil
+ }
+ return nil
+}
+
+func init() {
+ Register("memory", mempder)
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/session/sess_utils.go b/at-admin/vendor/github.com/astaxie/beego/session/sess_utils.go
new file mode 100644
index 0000000..2e3376c
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/session/sess_utils.go
@@ -0,0 +1,207 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package session
+
+import (
+ "bytes"
+ "crypto/cipher"
+ "crypto/hmac"
+ "crypto/rand"
+ "crypto/sha1"
+ "crypto/subtle"
+ "encoding/base64"
+ "encoding/gob"
+ "errors"
+ "fmt"
+ "io"
+ "strconv"
+ "time"
+
+ "github.com/astaxie/beego/utils"
+)
+
+func init() {
+ gob.Register([]interface{}{})
+ gob.Register(map[int]interface{}{})
+ gob.Register(map[string]interface{}{})
+ gob.Register(map[interface{}]interface{}{})
+ gob.Register(map[string]string{})
+ gob.Register(map[int]string{})
+ gob.Register(map[int]int{})
+ gob.Register(map[int]int64{})
+}
+
+// EncodeGob encode the obj to gob
+func EncodeGob(obj map[interface{}]interface{}) ([]byte, error) {
+ for _, v := range obj {
+ gob.Register(v)
+ }
+ buf := bytes.NewBuffer(nil)
+ enc := gob.NewEncoder(buf)
+ err := enc.Encode(obj)
+ if err != nil {
+ return []byte(""), err
+ }
+ return buf.Bytes(), nil
+}
+
+// DecodeGob decode data to map
+func DecodeGob(encoded []byte) (map[interface{}]interface{}, error) {
+ buf := bytes.NewBuffer(encoded)
+ dec := gob.NewDecoder(buf)
+ var out map[interface{}]interface{}
+ err := dec.Decode(&out)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// generateRandomKey creates a random key with the given strength.
+func generateRandomKey(strength int) []byte {
+ k := make([]byte, strength)
+ if n, err := io.ReadFull(rand.Reader, k); n != strength || err != nil {
+ return utils.RandomCreateBytes(strength)
+ }
+ return k
+}
+
+// Encryption -----------------------------------------------------------------
+
+// encrypt encrypts a value using the given block in counter mode.
+//
+// A random initialization vector (http://goo.gl/zF67k) with the length of the
+// block size is prepended to the resulting ciphertext.
+func encrypt(block cipher.Block, value []byte) ([]byte, error) {
+ iv := generateRandomKey(block.BlockSize())
+ if iv == nil {
+ return nil, errors.New("encrypt: failed to generate random iv")
+ }
+ // Encrypt it.
+ stream := cipher.NewCTR(block, iv)
+ stream.XORKeyStream(value, value)
+ // Return iv + ciphertext.
+ return append(iv, value...), nil
+}
+
+// decrypt decrypts a value using the given block in counter mode.
+//
+// The value to be decrypted must be prepended by a initialization vector
+// (http://goo.gl/zF67k) with the length of the block size.
+func decrypt(block cipher.Block, value []byte) ([]byte, error) {
+ size := block.BlockSize()
+ if len(value) > size {
+ // Extract iv.
+ iv := value[:size]
+ // Extract ciphertext.
+ value = value[size:]
+ // Decrypt it.
+ stream := cipher.NewCTR(block, iv)
+ stream.XORKeyStream(value, value)
+ return value, nil
+ }
+ return nil, errors.New("decrypt: the value could not be decrypted")
+}
+
+func encodeCookie(block cipher.Block, hashKey, name string, value map[interface{}]interface{}) (string, error) {
+ var err error
+ var b []byte
+ // 1. EncodeGob.
+ if b, err = EncodeGob(value); err != nil {
+ return "", err
+ }
+ // 2. Encrypt (optional).
+ if b, err = encrypt(block, b); err != nil {
+ return "", err
+ }
+ b = encode(b)
+ // 3. Create MAC for "name|date|value". Extra pipe to be used later.
+ b = []byte(fmt.Sprintf("%s|%d|%s|", name, time.Now().UTC().Unix(), b))
+ h := hmac.New(sha1.New, []byte(hashKey))
+ h.Write(b)
+ sig := h.Sum(nil)
+ // Append mac, remove name.
+ b = append(b, sig...)[len(name)+1:]
+ // 4. Encode to base64.
+ b = encode(b)
+ // Done.
+ return string(b), nil
+}
+
+func decodeCookie(block cipher.Block, hashKey, name, value string, gcmaxlifetime int64) (map[interface{}]interface{}, error) {
+ // 1. Decode from base64.
+ b, err := decode([]byte(value))
+ if err != nil {
+ return nil, err
+ }
+ // 2. Verify MAC. Value is "date|value|mac".
+ parts := bytes.SplitN(b, []byte("|"), 3)
+ if len(parts) != 3 {
+ return nil, errors.New("Decode: invalid value format")
+ }
+
+ b = append([]byte(name+"|"), b[:len(b)-len(parts[2])]...)
+ h := hmac.New(sha1.New, []byte(hashKey))
+ h.Write(b)
+ sig := h.Sum(nil)
+ if len(sig) != len(parts[2]) || subtle.ConstantTimeCompare(sig, parts[2]) != 1 {
+ return nil, errors.New("Decode: the value is not valid")
+ }
+ // 3. Verify date ranges.
+ var t1 int64
+ if t1, err = strconv.ParseInt(string(parts[0]), 10, 64); err != nil {
+ return nil, errors.New("Decode: invalid timestamp")
+ }
+ t2 := time.Now().UTC().Unix()
+ if t1 > t2 {
+ return nil, errors.New("Decode: timestamp is too new")
+ }
+ if t1 < t2-gcmaxlifetime {
+ return nil, errors.New("Decode: expired timestamp")
+ }
+ // 4. Decrypt (optional).
+ b, err = decode(parts[1])
+ if err != nil {
+ return nil, err
+ }
+ if b, err = decrypt(block, b); err != nil {
+ return nil, err
+ }
+ // 5. DecodeGob.
+ dst, err := DecodeGob(b)
+ if err != nil {
+ return nil, err
+ }
+ return dst, nil
+}
+
+// Encoding -------------------------------------------------------------------
+
+// encode encodes a value using base64.
+func encode(value []byte) []byte {
+ encoded := make([]byte, base64.URLEncoding.EncodedLen(len(value)))
+ base64.URLEncoding.Encode(encoded, value)
+ return encoded
+}
+
+// decode decodes a cookie using base64.
+func decode(value []byte) ([]byte, error) {
+ decoded := make([]byte, base64.URLEncoding.DecodedLen(len(value)))
+ b, err := base64.URLEncoding.Decode(decoded, value)
+ if err != nil {
+ return nil, err
+ }
+ return decoded[:b], nil
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/session/session.go b/at-admin/vendor/github.com/astaxie/beego/session/session.go
new file mode 100644
index 0000000..46a9f1f
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/session/session.go
@@ -0,0 +1,376 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+// Package session provider
+//
+// Usage:
+// import(
+// "github.com/astaxie/beego/session"
+// )
+//
+// func init() {
+// globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid", "enableSetCookie,omitempty": true, "gclifetime":3600, "maxLifetime": 3600, "secure": false, "cookieLifeTime": 3600, "providerConfig": ""}`)
+// go globalSessions.GC()
+// }
+//
+// more docs: http://beego.me/docs/module/session.md
+package session
+
+import (
+ "crypto/rand"
+ "encoding/hex"
+ "errors"
+ "fmt"
+ "io"
+ "log"
+ "net/http"
+ "net/textproto"
+ "net/url"
+ "os"
+ "time"
+)
+
+// Store contains all data for one session process with specific id.
+type Store interface {
+ Set(key, value interface{}) error //set session value
+ Get(key interface{}) interface{} //get session value
+ Delete(key interface{}) error //delete session value
+ SessionID() string //back current sessionID
+ SessionRelease(w http.ResponseWriter) // release the resource & save data to provider & return the data
+ Flush() error //delete all data
+}
+
+// Provider contains global session methods and saved SessionStores.
+// it can operate a SessionStore by its id.
+type Provider interface {
+ SessionInit(gclifetime int64, config string) error
+ SessionRead(sid string) (Store, error)
+ SessionExist(sid string) bool
+ SessionRegenerate(oldsid, sid string) (Store, error)
+ SessionDestroy(sid string) error
+ SessionAll() int //get all active session
+ SessionGC()
+}
+
+var provides = make(map[string]Provider)
+
+// SLogger a helpful variable to log information about session
+var SLogger = NewSessionLog(os.Stderr)
+
+// Register makes a session provide available by the provided name.
+// If Register is called twice with the same name or if driver is nil,
+// it panics.
+func Register(name string, provide Provider) {
+ if provide == nil {
+ panic("session: Register provide is nil")
+ }
+ if _, dup := provides[name]; dup {
+ panic("session: Register called twice for provider " + name)
+ }
+ provides[name] = provide
+}
+
+//GetProvider
+func GetProvider(name string) (Provider, error) {
+ provider, ok := provides[name]
+ if !ok {
+ return nil, fmt.Errorf("session: unknown provide %q (forgotten import?)", name)
+ }
+ return provider, nil
+}
+
+// ManagerConfig define the session config
+type ManagerConfig struct {
+ CookieName string `json:"cookieName"`
+ EnableSetCookie bool `json:"enableSetCookie,omitempty"`
+ Gclifetime int64 `json:"gclifetime"`
+ Maxlifetime int64 `json:"maxLifetime"`
+ DisableHTTPOnly bool `json:"disableHTTPOnly"`
+ Secure bool `json:"secure"`
+ CookieLifeTime int `json:"cookieLifeTime"`
+ ProviderConfig string `json:"providerConfig"`
+ Domain string `json:"domain"`
+ SessionIDLength int64 `json:"sessionIDLength"`
+ EnableSidInHTTPHeader bool `json:"EnableSidInHTTPHeader"`
+ SessionNameInHTTPHeader string `json:"SessionNameInHTTPHeader"`
+ EnableSidInURLQuery bool `json:"EnableSidInURLQuery"`
+ SessionIDPrefix string `json:"sessionIDPrefix"`
+}
+
+// Manager contains Provider and its configuration.
+type Manager struct {
+ provider Provider
+ config *ManagerConfig
+}
+
+// NewManager Create new Manager with provider name and json config string.
+// provider name:
+// 1. cookie
+// 2. file
+// 3. memory
+// 4. redis
+// 5. mysql
+// json config:
+// 1. is https default false
+// 2. hashfunc default sha1
+// 3. hashkey default beegosessionkey
+// 4. maxage default is none
+func NewManager(provideName string, cf *ManagerConfig) (*Manager, error) {
+ provider, ok := provides[provideName]
+ if !ok {
+ return nil, fmt.Errorf("session: unknown provide %q (forgotten import?)", provideName)
+ }
+
+ if cf.Maxlifetime == 0 {
+ cf.Maxlifetime = cf.Gclifetime
+ }
+
+ if cf.EnableSidInHTTPHeader {
+ if cf.SessionNameInHTTPHeader == "" {
+ panic(errors.New("SessionNameInHTTPHeader is empty"))
+ }
+
+ strMimeHeader := textproto.CanonicalMIMEHeaderKey(cf.SessionNameInHTTPHeader)
+ if cf.SessionNameInHTTPHeader != strMimeHeader {
+ strErrMsg := "SessionNameInHTTPHeader (" + cf.SessionNameInHTTPHeader + ") has the wrong format, it should be like this : " + strMimeHeader
+ panic(errors.New(strErrMsg))
+ }
+ }
+
+ err := provider.SessionInit(cf.Maxlifetime, cf.ProviderConfig)
+ if err != nil {
+ return nil, err
+ }
+
+ if cf.SessionIDLength == 0 {
+ cf.SessionIDLength = 16
+ }
+
+ return &Manager{
+ provider,
+ cf,
+ }, nil
+}
+
+// GetProvider return current manager's provider
+func (manager *Manager) GetProvider() Provider {
+ return manager.provider
+}
+
+// getSid retrieves session identifier from HTTP Request.
+// First try to retrieve id by reading from cookie, session cookie name is configurable,
+// if not exist, then retrieve id from querying parameters.
+//
+// error is not nil when there is anything wrong.
+// sid is empty when need to generate a new session id
+// otherwise return an valid session id.
+func (manager *Manager) getSid(r *http.Request) (string, error) {
+ cookie, errs := r.Cookie(manager.config.CookieName)
+ if errs != nil || cookie.Value == "" {
+ var sid string
+ if manager.config.EnableSidInURLQuery {
+ errs := r.ParseForm()
+ if errs != nil {
+ return "", errs
+ }
+
+ sid = r.FormValue(manager.config.CookieName)
+ }
+
+ // if not found in Cookie / param, then read it from request headers
+ if manager.config.EnableSidInHTTPHeader && sid == "" {
+ sids, isFound := r.Header[manager.config.SessionNameInHTTPHeader]
+ if isFound && len(sids) != 0 {
+ return sids[0], nil
+ }
+ }
+
+ return sid, nil
+ }
+
+ // HTTP Request contains cookie for sessionid info.
+ return url.QueryUnescape(cookie.Value)
+}
+
+// SessionStart generate or read the session id from http request.
+// if session id exists, return SessionStore with this id.
+func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (session Store, err error) {
+ sid, errs := manager.getSid(r)
+ if errs != nil {
+ return nil, errs
+ }
+
+ if sid != "" && manager.provider.SessionExist(sid) {
+ return manager.provider.SessionRead(sid)
+ }
+
+ // Generate a new session
+ sid, errs = manager.sessionID()
+ if errs != nil {
+ return nil, errs
+ }
+
+ session, err = manager.provider.SessionRead(sid)
+ if err != nil {
+ return nil, err
+ }
+ cookie := &http.Cookie{
+ Name: manager.config.CookieName,
+ Value: url.QueryEscape(sid),
+ Path: "/",
+ HttpOnly: !manager.config.DisableHTTPOnly,
+ Secure: manager.isSecure(r),
+ Domain: manager.config.Domain,
+ }
+ if manager.config.CookieLifeTime > 0 {
+ cookie.MaxAge = manager.config.CookieLifeTime
+ cookie.Expires = time.Now().Add(time.Duration(manager.config.CookieLifeTime) * time.Second)
+ }
+ if manager.config.EnableSetCookie {
+ http.SetCookie(w, cookie)
+ }
+ r.AddCookie(cookie)
+
+ if manager.config.EnableSidInHTTPHeader {
+ r.Header.Set(manager.config.SessionNameInHTTPHeader, sid)
+ w.Header().Set(manager.config.SessionNameInHTTPHeader, sid)
+ }
+
+ return
+}
+
+// SessionDestroy Destroy session by its id in http request cookie.
+func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request) {
+ if manager.config.EnableSidInHTTPHeader {
+ r.Header.Del(manager.config.SessionNameInHTTPHeader)
+ w.Header().Del(manager.config.SessionNameInHTTPHeader)
+ }
+
+ cookie, err := r.Cookie(manager.config.CookieName)
+ if err != nil || cookie.Value == "" {
+ return
+ }
+
+ sid, _ := url.QueryUnescape(cookie.Value)
+ manager.provider.SessionDestroy(sid)
+ if manager.config.EnableSetCookie {
+ expiration := time.Now()
+ cookie = &http.Cookie{Name: manager.config.CookieName,
+ Path: "/",
+ HttpOnly: !manager.config.DisableHTTPOnly,
+ Expires: expiration,
+ MaxAge: -1}
+
+ http.SetCookie(w, cookie)
+ }
+}
+
+// GetSessionStore Get SessionStore by its id.
+func (manager *Manager) GetSessionStore(sid string) (sessions Store, err error) {
+ sessions, err = manager.provider.SessionRead(sid)
+ return
+}
+
+// GC Start session gc process.
+// it can do gc in times after gc lifetime.
+func (manager *Manager) GC() {
+ manager.provider.SessionGC()
+ time.AfterFunc(time.Duration(manager.config.Gclifetime)*time.Second, func() { manager.GC() })
+}
+
+// SessionRegenerateID Regenerate a session id for this SessionStore who's id is saving in http request.
+func (manager *Manager) SessionRegenerateID(w http.ResponseWriter, r *http.Request) (session Store) {
+ sid, err := manager.sessionID()
+ if err != nil {
+ return
+ }
+ cookie, err := r.Cookie(manager.config.CookieName)
+ if err != nil || cookie.Value == "" {
+ //delete old cookie
+ session, _ = manager.provider.SessionRead(sid)
+ cookie = &http.Cookie{Name: manager.config.CookieName,
+ Value: url.QueryEscape(sid),
+ Path: "/",
+ HttpOnly: !manager.config.DisableHTTPOnly,
+ Secure: manager.isSecure(r),
+ Domain: manager.config.Domain,
+ }
+ } else {
+ oldsid, _ := url.QueryUnescape(cookie.Value)
+ session, _ = manager.provider.SessionRegenerate(oldsid, sid)
+ cookie.Value = url.QueryEscape(sid)
+ cookie.HttpOnly = true
+ cookie.Path = "/"
+ }
+ if manager.config.CookieLifeTime > 0 {
+ cookie.MaxAge = manager.config.CookieLifeTime
+ cookie.Expires = time.Now().Add(time.Duration(manager.config.CookieLifeTime) * time.Second)
+ }
+ if manager.config.EnableSetCookie {
+ http.SetCookie(w, cookie)
+ }
+ r.AddCookie(cookie)
+
+ if manager.config.EnableSidInHTTPHeader {
+ r.Header.Set(manager.config.SessionNameInHTTPHeader, sid)
+ w.Header().Set(manager.config.SessionNameInHTTPHeader, sid)
+ }
+
+ return
+}
+
+// GetActiveSession Get all active sessions count number.
+func (manager *Manager) GetActiveSession() int {
+ return manager.provider.SessionAll()
+}
+
+// SetSecure Set cookie with https.
+func (manager *Manager) SetSecure(secure bool) {
+ manager.config.Secure = secure
+}
+
+func (manager *Manager) sessionID() (string, error) {
+ b := make([]byte, manager.config.SessionIDLength)
+ n, err := rand.Read(b)
+ if n != len(b) || err != nil {
+ return "", fmt.Errorf("Could not successfully read from the system CSPRNG")
+ }
+ return manager.config.SessionIDPrefix + hex.EncodeToString(b), nil
+}
+
+// Set cookie with https.
+func (manager *Manager) isSecure(req *http.Request) bool {
+ if !manager.config.Secure {
+ return false
+ }
+ if req.URL.Scheme != "" {
+ return req.URL.Scheme == "https"
+ }
+ if req.TLS == nil {
+ return false
+ }
+ return true
+}
+
+// Log implement the log.Logger
+type Log struct {
+ *log.Logger
+}
+
+// NewSessionLog set io.Writer to create a Logger for session.
+func NewSessionLog(out io.Writer) *Log {
+ sl := new(Log)
+ sl.Logger = log.New(out, "[SESSION]", 1e9)
+ return sl
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/staticfile.go b/at-admin/vendor/github.com/astaxie/beego/staticfile.go
new file mode 100644
index 0000000..68241a8
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/staticfile.go
@@ -0,0 +1,210 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "bytes"
+ "errors"
+ "net/http"
+ "os"
+ "path"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/astaxie/beego/context"
+ "github.com/astaxie/beego/logs"
+)
+
+var errNotStaticRequest = errors.New("request not a static file request")
+
+func serverStaticRouter(ctx *context.Context) {
+ if ctx.Input.Method() != "GET" && ctx.Input.Method() != "HEAD" {
+ return
+ }
+
+ forbidden, filePath, fileInfo, err := lookupFile(ctx)
+ if err == errNotStaticRequest {
+ return
+ }
+
+ if forbidden {
+ exception("403", ctx)
+ return
+ }
+
+ if filePath == "" || fileInfo == nil {
+ if BConfig.RunMode == DEV {
+ logs.Warn("Can't find/open the file:", filePath, err)
+ }
+ http.NotFound(ctx.ResponseWriter, ctx.Request)
+ return
+ }
+ if fileInfo.IsDir() {
+ requestURL := ctx.Input.URL()
+ if requestURL[len(requestURL)-1] != '/' {
+ redirectURL := requestURL + "/"
+ if ctx.Request.URL.RawQuery != "" {
+ redirectURL = redirectURL + "?" + ctx.Request.URL.RawQuery
+ }
+ ctx.Redirect(302, redirectURL)
+ } else {
+ //serveFile will list dir
+ http.ServeFile(ctx.ResponseWriter, ctx.Request, filePath)
+ }
+ return
+ }
+
+ var enableCompress = BConfig.EnableGzip && isStaticCompress(filePath)
+ var acceptEncoding string
+ if enableCompress {
+ acceptEncoding = context.ParseEncoding(ctx.Request)
+ }
+ b, n, sch, reader, err := openFile(filePath, fileInfo, acceptEncoding)
+ if err != nil {
+ if BConfig.RunMode == DEV {
+ logs.Warn("Can't compress the file:", filePath, err)
+ }
+ http.NotFound(ctx.ResponseWriter, ctx.Request)
+ return
+ }
+
+ if b {
+ ctx.Output.Header("Content-Encoding", n)
+ } else {
+ ctx.Output.Header("Content-Length", strconv.FormatInt(sch.size, 10))
+ }
+
+ http.ServeContent(ctx.ResponseWriter, ctx.Request, filePath, sch.modTime, reader)
+}
+
+type serveContentHolder struct {
+ data []byte
+ modTime time.Time
+ size int64
+ encoding string
+}
+
+type serveContentReader struct {
+ *bytes.Reader
+}
+
+var (
+ staticFileMap = make(map[string]*serveContentHolder)
+ mapLock sync.RWMutex
+)
+
+func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, string, *serveContentHolder, *serveContentReader, error) {
+ mapKey := acceptEncoding + ":" + filePath
+ mapLock.RLock()
+ mapFile := staticFileMap[mapKey]
+ mapLock.RUnlock()
+ if isOk(mapFile, fi) {
+ reader := &serveContentReader{Reader: bytes.NewReader(mapFile.data)}
+ return mapFile.encoding != "", mapFile.encoding, mapFile, reader, nil
+ }
+ mapLock.Lock()
+ defer mapLock.Unlock()
+ if mapFile = staticFileMap[mapKey]; !isOk(mapFile, fi) {
+ file, err := os.Open(filePath)
+ if err != nil {
+ return false, "", nil, nil, err
+ }
+ defer file.Close()
+ var bufferWriter bytes.Buffer
+ _, n, err := context.WriteFile(acceptEncoding, &bufferWriter, file)
+ if err != nil {
+ return false, "", nil, nil, err
+ }
+ mapFile = &serveContentHolder{data: bufferWriter.Bytes(), modTime: fi.ModTime(), size: int64(bufferWriter.Len()), encoding: n}
+ staticFileMap[mapKey] = mapFile
+ }
+
+ reader := &serveContentReader{Reader: bytes.NewReader(mapFile.data)}
+ return mapFile.encoding != "", mapFile.encoding, mapFile, reader, nil
+}
+
+func isOk(s *serveContentHolder, fi os.FileInfo) bool {
+ if s == nil {
+ return false
+ }
+ return s.modTime == fi.ModTime() && s.size == fi.Size()
+}
+
+// isStaticCompress detect static files
+func isStaticCompress(filePath string) bool {
+ for _, statExtension := range BConfig.WebConfig.StaticExtensionsToGzip {
+ if strings.HasSuffix(strings.ToLower(filePath), strings.ToLower(statExtension)) {
+ return true
+ }
+ }
+ return false
+}
+
+// searchFile search the file by url path
+// if none the static file prefix matches ,return notStaticRequestErr
+func searchFile(ctx *context.Context) (string, os.FileInfo, error) {
+ requestPath := filepath.ToSlash(filepath.Clean(ctx.Request.URL.Path))
+ // special processing : favicon.ico/robots.txt can be in any static dir
+ if requestPath == "/favicon.ico" || requestPath == "/robots.txt" {
+ file := path.Join(".", requestPath)
+ if fi, _ := os.Stat(file); fi != nil {
+ return file, fi, nil
+ }
+ for _, staticDir := range BConfig.WebConfig.StaticDir {
+ filePath := path.Join(staticDir, requestPath)
+ if fi, _ := os.Stat(filePath); fi != nil {
+ return filePath, fi, nil
+ }
+ }
+ return "", nil, errNotStaticRequest
+ }
+
+ for prefix, staticDir := range BConfig.WebConfig.StaticDir {
+ if !strings.Contains(requestPath, prefix) {
+ continue
+ }
+ if prefix != "/" && len(requestPath) > len(prefix) && requestPath[len(prefix)] != '/' {
+ continue
+ }
+ filePath := path.Join(staticDir, requestPath[len(prefix):])
+ if fi, err := os.Stat(filePath); fi != nil {
+ return filePath, fi, err
+ }
+ }
+ return "", nil, errNotStaticRequest
+}
+
+// lookupFile find the file to serve
+// if the file is dir ,search the index.html as default file( MUST NOT A DIR also)
+// if the index.html not exist or is a dir, give a forbidden response depending on DirectoryIndex
+func lookupFile(ctx *context.Context) (bool, string, os.FileInfo, error) {
+ fp, fi, err := searchFile(ctx)
+ if fp == "" || fi == nil {
+ return false, "", nil, err
+ }
+ if !fi.IsDir() {
+ return false, fp, fi, err
+ }
+ if requestURL := ctx.Input.URL(); requestURL[len(requestURL)-1] == '/' {
+ ifp := filepath.Join(fp, "index.html")
+ if ifi, _ := os.Stat(ifp); ifi != nil && ifi.Mode().IsRegular() {
+ return false, ifp, ifi, err
+ }
+ }
+ return !BConfig.WebConfig.DirectoryIndex, fp, fi, err
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/template.go b/at-admin/vendor/github.com/astaxie/beego/template.go
new file mode 100644
index 0000000..59875be
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/template.go
@@ -0,0 +1,406 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "errors"
+ "fmt"
+ "html/template"
+ "io"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "sync"
+
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/utils"
+)
+
+var (
+ beegoTplFuncMap = make(template.FuncMap)
+ beeViewPathTemplateLocked = false
+ // beeViewPathTemplates caching map and supported template file extensions per view
+ beeViewPathTemplates = make(map[string]map[string]*template.Template)
+ templatesLock sync.RWMutex
+ // beeTemplateExt stores the template extension which will build
+ beeTemplateExt = []string{"tpl", "html", "gohtml"}
+ // beeTemplatePreprocessors stores associations of extension -> preprocessor handler
+ beeTemplateEngines = map[string]templatePreProcessor{}
+ beeTemplateFS = defaultFSFunc
+)
+
+// ExecuteTemplate applies the template with name to the specified data object,
+// writing the output to wr.
+// A template will be executed safely in parallel.
+func ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
+ return ExecuteViewPathTemplate(wr, name, BConfig.WebConfig.ViewsPath, data)
+}
+
+// ExecuteViewPathTemplate applies the template with name and from specific viewPath to the specified data object,
+// writing the output to wr.
+// A template will be executed safely in parallel.
+func ExecuteViewPathTemplate(wr io.Writer, name string, viewPath string, data interface{}) error {
+ if BConfig.RunMode == DEV {
+ templatesLock.RLock()
+ defer templatesLock.RUnlock()
+ }
+ if beeTemplates, ok := beeViewPathTemplates[viewPath]; ok {
+ if t, ok := beeTemplates[name]; ok {
+ var err error
+ if t.Lookup(name) != nil {
+ err = t.ExecuteTemplate(wr, name, data)
+ } else {
+ err = t.Execute(wr, data)
+ }
+ if err != nil {
+ logs.Trace("template Execute err:", err)
+ }
+ return err
+ }
+ panic("can't find templatefile in the path:" + viewPath + "/" + name)
+ }
+ panic("Unknown view path:" + viewPath)
+}
+
+func init() {
+ beegoTplFuncMap["dateformat"] = DateFormat
+ beegoTplFuncMap["date"] = Date
+ beegoTplFuncMap["compare"] = Compare
+ beegoTplFuncMap["compare_not"] = CompareNot
+ beegoTplFuncMap["not_nil"] = NotNil
+ beegoTplFuncMap["not_null"] = NotNil
+ beegoTplFuncMap["substr"] = Substr
+ beegoTplFuncMap["html2str"] = HTML2str
+ beegoTplFuncMap["str2html"] = Str2html
+ beegoTplFuncMap["htmlquote"] = Htmlquote
+ beegoTplFuncMap["htmlunquote"] = Htmlunquote
+ beegoTplFuncMap["renderform"] = RenderForm
+ beegoTplFuncMap["assets_js"] = AssetsJs
+ beegoTplFuncMap["assets_css"] = AssetsCSS
+ beegoTplFuncMap["config"] = GetConfig
+ beegoTplFuncMap["map_get"] = MapGet
+
+ // Comparisons
+ beegoTplFuncMap["eq"] = eq // ==
+ beegoTplFuncMap["ge"] = ge // >=
+ beegoTplFuncMap["gt"] = gt // >
+ beegoTplFuncMap["le"] = le // <=
+ beegoTplFuncMap["lt"] = lt // <
+ beegoTplFuncMap["ne"] = ne // !=
+
+ beegoTplFuncMap["urlfor"] = URLFor // build a URL to match a Controller and it's method
+}
+
+// AddFuncMap let user to register a func in the template.
+func AddFuncMap(key string, fn interface{}) error {
+ beegoTplFuncMap[key] = fn
+ return nil
+}
+
+type templatePreProcessor func(root, path string, funcs template.FuncMap) (*template.Template, error)
+
+type templateFile struct {
+ root string
+ files map[string][]string
+}
+
+// visit will make the paths into two part,the first is subDir (without tf.root),the second is full path(without tf.root).
+// if tf.root="views" and
+// paths is "views/errors/404.html",the subDir will be "errors",the file will be "errors/404.html"
+// paths is "views/admin/errors/404.html",the subDir will be "admin/errors",the file will be "admin/errors/404.html"
+func (tf *templateFile) visit(paths string, f os.FileInfo, err error) error {
+ if f == nil {
+ return err
+ }
+ if f.IsDir() || (f.Mode()&os.ModeSymlink) > 0 {
+ return nil
+ }
+ if !HasTemplateExt(paths) {
+ return nil
+ }
+
+ replace := strings.NewReplacer("\\", "/")
+ file := strings.TrimLeft(replace.Replace(paths[len(tf.root):]), "/")
+ subDir := filepath.Dir(file)
+
+ tf.files[subDir] = append(tf.files[subDir], file)
+ return nil
+}
+
+// HasTemplateExt return this path contains supported template extension of beego or not.
+func HasTemplateExt(paths string) bool {
+ for _, v := range beeTemplateExt {
+ if strings.HasSuffix(paths, "."+v) {
+ return true
+ }
+ }
+ return false
+}
+
+// AddTemplateExt add new extension for template.
+func AddTemplateExt(ext string) {
+ for _, v := range beeTemplateExt {
+ if v == ext {
+ return
+ }
+ }
+ beeTemplateExt = append(beeTemplateExt, ext)
+}
+
+// AddViewPath adds a new path to the supported view paths.
+//Can later be used by setting a controller ViewPath to this folder
+//will panic if called after beego.Run()
+func AddViewPath(viewPath string) error {
+ if beeViewPathTemplateLocked {
+ if _, exist := beeViewPathTemplates[viewPath]; exist {
+ return nil //Ignore if viewpath already exists
+ }
+ panic("Can not add new view paths after beego.Run()")
+ }
+ beeViewPathTemplates[viewPath] = make(map[string]*template.Template)
+ return BuildTemplate(viewPath)
+}
+
+func lockViewPaths() {
+ beeViewPathTemplateLocked = true
+}
+
+// BuildTemplate will build all template files in a directory.
+// it makes beego can render any template file in view directory.
+func BuildTemplate(dir string, files ...string) error {
+ var err error
+ fs := beeTemplateFS()
+ f, err := fs.Open(dir)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return nil
+ }
+ return errors.New("dir open err")
+ }
+ defer f.Close()
+
+ beeTemplates, ok := beeViewPathTemplates[dir]
+ if !ok {
+ panic("Unknown view path: " + dir)
+ }
+ self := &templateFile{
+ root: dir,
+ files: make(map[string][]string),
+ }
+ err = Walk(fs, dir, func(path string, f os.FileInfo, err error) error {
+ return self.visit(path, f, err)
+ })
+ if err != nil {
+ fmt.Printf("Walk() returned %v\n", err)
+ return err
+ }
+ buildAllFiles := len(files) == 0
+ for _, v := range self.files {
+ for _, file := range v {
+ if buildAllFiles || utils.InSlice(file, files) {
+ templatesLock.Lock()
+ ext := filepath.Ext(file)
+ var t *template.Template
+ if len(ext) == 0 {
+ t, err = getTemplate(self.root, fs, file, v...)
+ } else if fn, ok := beeTemplateEngines[ext[1:]]; ok {
+ t, err = fn(self.root, file, beegoTplFuncMap)
+ } else {
+ t, err = getTemplate(self.root, fs, file, v...)
+ }
+ if err != nil {
+ logs.Error("parse template err:", file, err)
+ templatesLock.Unlock()
+ return err
+ }
+ beeTemplates[file] = t
+ templatesLock.Unlock()
+ }
+ }
+ }
+ return nil
+}
+
+func getTplDeep(root string, fs http.FileSystem, file string, parent string, t *template.Template) (*template.Template, [][]string, error) {
+ var fileAbsPath string
+ var rParent string
+ var err error
+ if strings.HasPrefix(file, "../") {
+ rParent = filepath.Join(filepath.Dir(parent), file)
+ fileAbsPath = filepath.Join(root, filepath.Dir(parent), file)
+ } else {
+ rParent = file
+ fileAbsPath = filepath.Join(root, file)
+ }
+ f, err := fs.Open(fileAbsPath)
+ if err != nil {
+ panic("can't find template file:" + file)
+ }
+ defer f.Close()
+ data, err := ioutil.ReadAll(f)
+ if err != nil {
+ return nil, [][]string{}, err
+ }
+ t, err = t.New(file).Parse(string(data))
+ if err != nil {
+ return nil, [][]string{}, err
+ }
+ reg := regexp.MustCompile(BConfig.WebConfig.TemplateLeft + "[ ]*template[ ]+\"([^\"]+)\"")
+ allSub := reg.FindAllStringSubmatch(string(data), -1)
+ for _, m := range allSub {
+ if len(m) == 2 {
+ tl := t.Lookup(m[1])
+ if tl != nil {
+ continue
+ }
+ if !HasTemplateExt(m[1]) {
+ continue
+ }
+ _, _, err = getTplDeep(root, fs, m[1], rParent, t)
+ if err != nil {
+ return nil, [][]string{}, err
+ }
+ }
+ }
+ return t, allSub, nil
+}
+
+func getTemplate(root string, fs http.FileSystem, file string, others ...string) (t *template.Template, err error) {
+ t = template.New(file).Delims(BConfig.WebConfig.TemplateLeft, BConfig.WebConfig.TemplateRight).Funcs(beegoTplFuncMap)
+ var subMods [][]string
+ t, subMods, err = getTplDeep(root, fs, file, "", t)
+ if err != nil {
+ return nil, err
+ }
+ t, err = _getTemplate(t, root, fs, subMods, others...)
+
+ if err != nil {
+ return nil, err
+ }
+ return
+}
+
+func _getTemplate(t0 *template.Template, root string, fs http.FileSystem, subMods [][]string, others ...string) (t *template.Template, err error) {
+ t = t0
+ for _, m := range subMods {
+ if len(m) == 2 {
+ tpl := t.Lookup(m[1])
+ if tpl != nil {
+ continue
+ }
+ //first check filename
+ for _, otherFile := range others {
+ if otherFile == m[1] {
+ var subMods1 [][]string
+ t, subMods1, err = getTplDeep(root, fs, otherFile, "", t)
+ if err != nil {
+ logs.Trace("template parse file err:", err)
+ } else if len(subMods1) > 0 {
+ t, err = _getTemplate(t, root, fs, subMods1, others...)
+ }
+ break
+ }
+ }
+ //second check define
+ for _, otherFile := range others {
+ var data []byte
+ fileAbsPath := filepath.Join(root, otherFile)
+ f, err := fs.Open(fileAbsPath)
+ if err != nil {
+ f.Close()
+ logs.Trace("template file parse error, not success open file:", err)
+ continue
+ }
+ data, err = ioutil.ReadAll(f)
+ f.Close()
+ if err != nil {
+ logs.Trace("template file parse error, not success read file:", err)
+ continue
+ }
+ reg := regexp.MustCompile(BConfig.WebConfig.TemplateLeft + "[ ]*define[ ]+\"([^\"]+)\"")
+ allSub := reg.FindAllStringSubmatch(string(data), -1)
+ for _, sub := range allSub {
+ if len(sub) == 2 && sub[1] == m[1] {
+ var subMods1 [][]string
+ t, subMods1, err = getTplDeep(root, fs, otherFile, "", t)
+ if err != nil {
+ logs.Trace("template parse file err:", err)
+ } else if len(subMods1) > 0 {
+ t, err = _getTemplate(t, root, fs, subMods1, others...)
+ if err != nil {
+ logs.Trace("template parse file err:", err)
+ }
+ }
+ break
+ }
+ }
+ }
+ }
+
+ }
+ return
+}
+
+type templateFSFunc func() http.FileSystem
+
+func defaultFSFunc() http.FileSystem {
+ return FileSystem{}
+}
+
+// SetTemplateFSFunc set default filesystem function
+func SetTemplateFSFunc(fnt templateFSFunc) {
+ beeTemplateFS = fnt
+}
+
+// SetViewsPath sets view directory path in beego application.
+func SetViewsPath(path string) *App {
+ BConfig.WebConfig.ViewsPath = path
+ return BeeApp
+}
+
+// SetStaticPath sets static directory path and proper url pattern in beego application.
+// if beego.SetStaticPath("static","public"), visit /static/* to load static file in folder "public".
+func SetStaticPath(url string, path string) *App {
+ if !strings.HasPrefix(url, "/") {
+ url = "/" + url
+ }
+ if url != "/" {
+ url = strings.TrimRight(url, "/")
+ }
+ BConfig.WebConfig.StaticDir[url] = path
+ return BeeApp
+}
+
+// DelStaticPath removes the static folder setting in this url pattern in beego application.
+func DelStaticPath(url string) *App {
+ if !strings.HasPrefix(url, "/") {
+ url = "/" + url
+ }
+ if url != "/" {
+ url = strings.TrimRight(url, "/")
+ }
+ delete(BConfig.WebConfig.StaticDir, url)
+ return BeeApp
+}
+
+// AddTemplateEngine add a new templatePreProcessor which support extension
+func AddTemplateEngine(extension string, fn templatePreProcessor) *App {
+ AddTemplateExt(extension)
+ beeTemplateEngines[extension] = fn
+ return BeeApp
+}
diff --git a/at-admin/vendor/github.com/astaxie/beego/templatefunc.go b/at-admin/vendor/github.com/astaxie/beego/templatefunc.go
new file mode 100644
index 0000000..ba1ec5e
--- /dev/null
+++ b/at-admin/vendor/github.com/astaxie/beego/templatefunc.go
@@ -0,0 +1,780 @@
+// Copyright 2014 beego Author. All Rights Reserved.
+//
+// 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.
+
+package beego
+
+import (
+ "errors"
+ "fmt"
+ "html"
+ "html/template"
+ "net/url"
+ "reflect"
+ "regexp"
+ "strconv"
+ "strings"
+ "time"
+)
+
+const (
+ formatTime = "15:04:05"
+ formatDate = "2006-01-02"
+ formatDateTime = "2006-01-02 15:04:05"
+ formatDateTimeT = "2006-01-02T15:04:05"
+)
+
+// Substr returns the substr from start to length.
+func Substr(s string, start, length int) string {
+ bt := []rune(s)
+ if start < 0 {
+ start = 0
+ }
+ if start > len(bt) {
+ start = start % len(bt)
+ }
+ var end int
+ if (start + length) > (len(bt) - 1) {
+ end = len(bt)
+ } else {
+ end = start + length
+ }
+ return string(bt[start:end])
+}
+
+// HTML2str returns escaping text convert from html.
+func HTML2str(html string) string {
+
+ re := regexp.MustCompile(`\<[\S\s]+?\>`)
+ html = re.ReplaceAllStringFunc(html, strings.ToLower)
+
+ //remove STYLE
+ re = regexp.MustCompile(`\", basePathEscaped)
+ fmt.Fprintf(w, "%s ", basePathEscaped)
+ fmt.Fprintf(w, "")
+
+ if len(basePathEscaped) > 1 {
+ var parentURI URI
+ base.CopyTo(&parentURI)
+ parentURI.Update(string(base.Path()) + "/..")
+ parentPathEscaped := html.EscapeString(string(parentURI.Path()))
+ fmt.Fprintf(w, `.. `, parentPathEscaped)
+ }
+
+ f, err := os.Open(dirPath)
+ if err != nil {
+ return nil, err
+ }
+
+ fileinfos, err := f.Readdir(0)
+ f.Close()
+ if err != nil {
+ return nil, err
+ }
+
+ fm := make(map[string]os.FileInfo, len(fileinfos))
+ var filenames []string
+ for _, fi := range fileinfos {
+ name := fi.Name()
+ if strings.HasSuffix(name, h.compressedFileSuffix) {
+ // Do not show compressed files on index page.
+ continue
+ }
+ fm[name] = fi
+ filenames = append(filenames, name)
+ }
+
+ var u URI
+ base.CopyTo(&u)
+ u.Update(string(u.Path()) + "/")
+
+ sort.Sort(sort.StringSlice(filenames))
+ for _, name := range filenames {
+ u.Update(name)
+ pathEscaped := html.EscapeString(string(u.Path()))
+ fi := fm[name]
+ auxStr := "dir"
+ className := "dir"
+ if !fi.IsDir() {
+ auxStr = fmt.Sprintf("file, %d bytes", fi.Size())
+ className = "file"
+ }
+ fmt.Fprintf(w, `%s , %s, last modified %s `,
+ pathEscaped, className, html.EscapeString(name), auxStr, fsModTime(fi.ModTime()))
+ }
+
+ fmt.Fprintf(w, "