├── .gitignore ├── Procfile ├── README.md ├── project.clj ├── resources ├── public │ ├── css │ │ └── screen.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ └── md │ │ └── docs.md └── templates │ ├── about.html │ ├── albums │ ├── add-album.html │ ├── artist-albums.html │ └── recently-added.html │ ├── base.html │ ├── home.html │ ├── login.html │ └── signup.html ├── src ├── hipstr │ ├── cookies.clj │ ├── handler.clj │ ├── layout.clj │ ├── middleware.clj │ ├── models │ │ ├── album_model.clj │ │ ├── albums.sql │ │ ├── artists.sql │ │ ├── connection.clj │ │ ├── user_model.clj │ │ └── users.sql │ ├── repl.clj │ ├── routes │ │ ├── access.clj │ │ ├── albums.clj │ │ ├── home.clj │ │ └── test_routes.clj │ ├── session_manager.clj │ ├── util.clj │ └── validators │ │ ├── album_validator.clj │ │ └── user_validator.clj └── migrations │ ├── 00000000000100-users.down.sql │ ├── 00000000000100-users.up.sql │ ├── 00000000000200-artists.down.sql │ ├── 00000000000200-artists.up.sql │ ├── 00000000000210-albums.down.sql │ └── 00000000000210-albums.up.sql └── test └── hipstr └── test ├── handler_test.clj └── validators └── user_validator_test.clj /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /lib 3 | /classes 4 | /checkouts 5 | pom.xml 6 | *.jar 7 | *.class 8 | /.lein-* 9 | /.env 10 | *.log 11 | *.log.* 12 | *.idea 13 | *.nrepl-port 14 | nohup.out 15 | hipstr.iml 16 | profiles.clj 17 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: lein with-profile production trampoline ring server 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Clojure Web Development Essentials - hipstr 2 | 3 | Hey, cool, you cloned the source repo for the Clojure Web Development Essentials hub! That means somebody actually bought my book! Rad. Thank you! 4 | 5 | In this repo you'll find all the source code that accompanies the book. Throughout the writing, and thus the development of the book's content a branch will be made for each chapter. Upon final draft, all branches will be merged into the trunk, and tagged appropriately. 6 | 7 | ## Prerequisites 8 | 9 | You will need [Leiningen][1] 2.0 or above installed. Other than that you should be pretty much set, as this application doesn't do anything crazy. 10 | 11 | [1]: https://github.com/technomancy/leiningen 12 | 13 | ## Running 14 | 15 | To start a web server for the application, run: 16 | 17 | lein ring server 18 | 19 | ## License 20 | 21 | Copyright © 2014 FIXME 22 | -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject hipstr "0.1.0-SNAPSHOT" 2 | :description "FIXME: write description" 3 | :url "http://example.com/FIXME" 4 | :dependencies [[org.clojure/clojure "1.6.0"] 5 | [lib-noir "0.9.4"] 6 | [ring-server "0.3.1"] 7 | [selmer "0.7.2"] 8 | [com.taoensso/timbre "3.3.1"] 9 | [com.taoensso/tower "3.0.2"] 10 | [markdown-clj "0.9.55" 11 | :exclusions [com.keminglabs/cljx]] 12 | [environ "1.0.0"] 13 | [im.chit/cronj "1.4.2"] 14 | [noir-exception "0.2.2"] 15 | [prone "0.6.0"] 16 | [postgresql/postgresql "9.3-1102.jdbc41"] 17 | [migratus "0.7.0"] 18 | [com.novemberain/validateur "2.3.1"] 19 | [yesql "0.5.0-rc1"] 20 | [crypto-password "0.1.3"]] 21 | 22 | :repl-options {:init-ns hipstr.repl} 23 | :jvm-opts ["-server"] 24 | :plugins [[lein-ring "0.8.13"] 25 | [lein-environ "1.0.0"] 26 | [lein-ancient "0.5.5"] 27 | [migratus-lein "0.1.0"] 28 | [quickie "0.3.6"]] 29 | :migratus {:store :database 30 | :migration-dir "migrations" 31 | :migration-table-name "_migrations" 32 | :db {:classname "org.postgresql.Driver" 33 | :subprotocol "postgresql" 34 | :subname "//localhost/postgres" 35 | :user "hipstr" 36 | :password "p455w0rd"}} 37 | :ring {:handler hipstr.handler/app 38 | :init hipstr.handler/init 39 | :destroy hipstr.handler/destroy} 40 | :profiles 41 | {:uberjar {:omit-source false 42 | :env {:production true} 43 | :aot :all} 44 | :production {:ring {:open-browser? false 45 | :stacktraces? false 46 | :auto-reload? false}} 47 | :dev {:dependencies [[ring-mock "0.1.5"] 48 | [ring/ring-devel "1.3.1"] 49 | [pjstadig/humane-test-output "0.6.0"]] 50 | :injections [(require 'pjstadig.humane-test-output) 51 | (pjstadig.humane-test-output/activate!)] 52 | :env {:dev true}}} 53 | :min-lein-version "2.0.0") 54 | -------------------------------------------------------------------------------- /resources/public/css/screen.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 4 | height: 100%; 5 | padding-top: 40px; 6 | } 7 | 8 | .errors { 9 | padding-left: 20px; 10 | color: red; 11 | } 12 | 13 | .submit { 14 | text-align: right; 15 | } 16 | -------------------------------------------------------------------------------- /resources/public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- 1 | oON�LP����(GLYPHICONS HalflingsRegularxVersion 1.001;PS 001.001;hotconv 1.0.70;makeotf.lib2.5.583298GLYPHICONS Halflings RegularBSGPv�5v5|-\���`�W�hKqJx"U:r,/�4\�� li����ʚ�E�LFM�ƀ�V(g�W\��+rK0 2 | Q���3-O>�C�d�g�e}\�4��[Dd��p�WQ��@���J[�M�����UA�Н�j�.p��`k�*C�I4ث��o\� ��w���fv��XD��lB��g1�[/a�� 2�l��E�����2���g2�9�MÊ� 3 | ��zGDUB���A�$L��}Xʕf�z;N2��_����;(�k��@B[�!�6P�3�G 4 | �E]{���JW/s��4�%��ߙ���_�}}c�O-4lP�aDX�[��q�v�*�X,�u 5 | * 6 | �����z�3JL�}� 7 | 0����VjUyjn�)����O0;�0!�-!r"&bbl,-`�Q���|/^�L����V�R�uz�Ԫ�I���Ъ�!��k�&)J{.t�S?���iS����diVD�1w b��]��D�*�%qs�PD����ẍ�p 8 | EG`���+�w:�V��*X<[�l�M�� 9 | �.��ΡSh���qk��"� 10 | �J ��MT6� c��k�a�zԪ�nq��m0��pDJ��v�咽�����F�v�(�S��(��MI�ӶF���K��m�"��=�-��B(>�Qe�Yeg�䜊7 �.�_�j�&LK� 9zR�u�C�� 11 | �Rȍ&B�0 12 | �����_�C_�����{4�W?��N��"$�#��D�� :J4�/���횶G�J;]�w���d�:�H9��®�[Ԩ* K� 13 | �#�8A$a`]ڞ-TE7 $ :�sp†f L$}Z����b]�b�6��H��rx-t 14 | ���jViMj�N^[��8�>Cn7L 15 | ���&+3W6�G<�B�O����2A:�峊�K��='�=�J���Bƃh�2��"d����� � � �O8��6����X�nf����i�?�4 ���}��<�4 �ζfV��Geb}�� ��s i���{OE��n#�&QP6D*BLB��1�SRk�D����XX�><|0;���ڈ�5�5�C~��4�����?��:P�}"��%��ut5���I�!���9�l��$!���yM�T�>��'� O�tqa?^��Em� ߲�C��s�S|-nH ���q��#Yt� 22 | ��k ��¹����Ǯ�s�%}NJ�bCW/|�`F�\�b,��ɏ2H��2�/�94# ~�e�����c��ĩ"�Q�����7�:�Z�I֋]%���Y�*�B;8aFx�ʩb�_͟��- 23 | *��)�4�?�j�@��5Q'��P8���Gr���)��ՠ��x�l֏�("�c{�G݇�_�xۢƴHE-Bᔡ`\_�`�T��X�i�C�O����!;�������#���$�QC�U�(�75D� 30 | Ѥ��d��=� �>dZ�0t��j��g��v2�-ēx�U � �3,7t���a�,(�5�¶�����Y���E���$�6�s���B܉O��� c�: 31 | ���:� ���R.yaHX�%�1yL7�A���z5���o�*��n5�e���)oF���aDe`hp"Q�����Yo��O�� �4o���p�s0��OE 32 | Y)b�8x�.�k�+8U)+�6-]K9��pQt�&��}��Snmb�t���LM��w���XsSIj�>�I�Sj 33 | 2`%�����9�4����}��=J�A�v�D 34 | j���踠�ؓ����T�[�P�#��a�W�0Tt-~z��I�,�6��U2�)�'�\���v�� 35 | ��S��R��P� Znq�"abE��rwL1���U[�n @G[9y3s��;! r퐽"04{��2 36 | faJ 37 | ��)�"P:� �6��3'Z7\�H5�9��NT�t 38 | �}�� 損;wL�.��td��q��w���o 39 | �Ή�)��"f.d�x�Cz 40 | KFNǢh�F��@�ᡰ)1V��a��P� JV��,�B{&�����f� p��ph��x�O2�%8��� Q��PL:e�����ϨiN��`ߟ��Ғ�]�Q$�{3��qN���%��� Ot��=j�xgP���ΰ�FK���^{��f���?^�/� O�\�:�JD;��Q`c��^!��dv�k��� �e�3庑�a�IC� �d6 ����IȚ#\},�?H��f3�c�U��w��+��$�U[":���}�]j��b(Es)�`�%\¥��U�.#]v/)����K:I��c�4�ó.c$�C��?f� `+�6�cx$#[ߺ� f& h,�A4�-�g�`�?�$��1 1�bB5�� �}˟ 41 | X`h��^���2�*����"��`�P���R�o��o��פ)jk�7�L"�3�|{y@�պi���w@&�}g$�s�u���"򩄕_�����[n 42 | 7(���)�D`��Q���Ŕ�m>�@��cgDD~xp��� �}`�t��o�H�T�u���ҁ)����m7$'�,h� XN�rl��u�5_<�g���L�,Ԣ��+�^�����ā-,�,��ii΃Ċ����B�2����.����D��!^� �B*�&h�����z��[s��בrIXe�>@>[ƍ���Ĭ]6��ݏ��S@�&�ƛ2��@��4���w|{�� ߤ9�.�F�d�����q�r�(�A��1ƴ�#ADp#6����=rR� 48 | {�x�P��(��Q@"����ޥ&Ϡ]<��p3{�>�a �y[��J(��%;MA�� ~NdR;��>4h�Y�j�Q�=�yæ[�`\�h :L]��}�~0M�����l<�T��+ L(XBE��WrK��K��ۦ@�m��HSJ&�9�)1_zD�� O�MK��GC �&N!�ֶe|ɹl^���� �8$5�,��,�k��<�0��� � 49 | �n�+�Yx�2�Oc�Z#VƖ����*����Ϧ�0��lY��a���CB�~P��8L�5a6Ĵ�Y�*��\ �z�lq�z�����hR�o����)(]�t�h��F�(�Y�T��/h�b�5��/O]�`ОV�Z5��Fs 50 | b�����K�a�i�ie������J̀O/L�sWP�yC��������XX�n� $�N�C��mF*wgF�����;�u�iy�(��?�N�_�Zh13 ����ĞyX`]#����+�X����H�#zn����P)z�u�n���Z��L%4�n��Az����3y��V�a �}�/V'���2�GE�̩t'�<���K:�i`8�M� ȇ>0F�#�����뗸S��2�zB!���TC� l-�c:Tl占b��P���I�S;���K�Μ��NW�pw}��R#��;�~� �-b;���} �3@�=6�]�Ӧ�ؒAy�0�h�)�?��(o^�2��Ri}l[�=�qĴ�P41����8󅷞��8�@B�B�8�Rjp>�ފ�v��P�-'�KU���L��R��C�a=����r'}ݨk����Fp��6�H�bI,F�o�1���r�'"�չ�&�&lI{&Qf���2a�\L�)A�Rہ�Q�DX���:��v��aiGGw޶ 51 | ��/��0$�O0&�#�H9��o(����sQƬ�"����M���Lj��L���7�L5 52 | �y���*ɚ� �Y���%�w�t+55Z�(�)�͊��BvM��K�0:$��»�8!0�Ab�J�#9pB́����@E(�C�u�O�P<|h� 53 | � �s�R�y�n�x@����fr:„�i�1�Z��BLnѫ��rtI-1�x�,�Fޠ1S�b'��1C���I � Y��^�\�U���F;�����=��6-T�-�H�2G'�8���H�9�&$+�d k?K�(�J'�q�j �s`���*L9y�2@ ���a��-��*P�k���vW��2�F��������0(������������tT�lh�ш%q���A.�[����_g>9d���M�x�,mw��첌-{ 54 | ���3t�w��61}��L���w�f�馵����G����,h ���jZ�Z8�H�5�t��������É��@w���i����� 55 | Ku|�A�I�g�n���)�����.}88�F@�*��ʠ�txV�~J����Uw6A.�����0n*�"�1-���5�9�dq���?�5�L�����8�v�& 56 | �|���֓I4�$H��]���Z�MUj/R-l\w׭O��U LQ�*�`�r }krmVӛ�k^v�J���S �''�x��Qi_�᭒d��4(Qn� �\T��-����VB�+ 57 | u�xd�FȘW���`�q�� �NB 58 | \��5�#3v��$�O#�ȧ,���*(�w\����h;^ʻ�ƪ� �'�NYmLʿ��"���T�R� 59 | ��Cy��.�� ��>f 60 | �D�� �k��D��o���9���/��މ׮���=4fQ�؀��'k5B$rL��줁t����I�L����?P�!>Mf0��+�^˪!Ѡ�>5Ĩ&y���_�d�A�+���1��f+�#�X@�ח���č��㍊��S.r;0~RP72ř|$���o���V�X�Ba�?��^ b~����*<��L~�0���$�)��� ��y�dȼ J�U_��$DE���2�c�{A!;��ZO 5e��6��� ��Ze�U�C�-Z�͢�� �֘k�\f3\�e�%J��3�+ KE�� V��Ɠ�A�p4bsŜwI�=?��"�x�Ӡ���ф-E������� 61 | � 62 | 8Yb�$���:���e) 63 | yYP�;�̰�b��d�O)�w�BAe777|�*�b��FT@��J���ƪ3����}/��S�a����U�Ȫ�j1SaB7~�& FMs��Ϝ��[�>�+� {�1�Ys�����Ƞ@���z(��=!؆�73�މ�f�z��e�(�<;oe�3_'D��Z������s5"b4g�dHC���oL�5.�6�:�5�}9$M�Q��'$�¥9D�scM �|��)lI�E9����#C��5L�J�`��fK���%�<�G�'�����PO�y�`�5�5:��k����'����qg�uuq���[,��)��Zb �q|+ �<��o[��!�'����NҨK�HX������ɜ"r����� f��l�eh�)(���>{P,e& 64 | �'���S7�a����:�n�p�-ąKz��Hhw%ɹm�|lߝʍȝt����e���0q9S_z/L[� P{)��x���.��{h���L�ٷV)k�ٮ��q������;jz�@b�2�Q�`� 9~'3��2�j��F�� 65 | v�Q���TdM�@>ܹ��P�N�q���޺���Hі��J�M��rN2�Q9}l̀ 66 | �(6�,�A��; +�"��:�(�-$V��3x6�AT�\��"��z��n ��%�*bo���@o��JLB��q�Izi�T�N����9X��j��<�39���'���L�R��B$eY��Ğa��+��(���n2u�Cca�%˂���*w�� `�‹�B�=�U�f{�(�I�Nq_ zh.3fKH�� f]�N�� Lԩ�Xʍ��=�zR�g}퇍�Z�U���J�"y�x�q�E�SZD��X���J�N4�H�O�V_�X/�b�����YmOt)�r�!)���mFL.�P@�0�c��grT��xg���=��] 73 | �3A?)z� Ua�0�@� z��d0��w"�jZpL_�T_C�� e )~�o���Q�R��N��x3Î��|�T"b, ��2& 74 | �cT�6��@1# �,@�-����#����z�|�VcX����k5�8�W���YP!�������\-�`��� �|�)2oo����D�4}�ئ��=Lg}�������Pi�9І�.��x����pT�sq������2��yǿa-GuN��hXH�8u��O��i%� (Ck�%���b9���|��B��(#��U� �Yt=�'`҃ ���>��N�-��'�׿ � ]�69A�0&!Ge!� mܥ#<*L�£U.��1�=RI��2'�)�`�>�� 79 | l���٦hh%���H�^Y�Y-aA�� �x��q���[� '�@L^ q=B�Q��Gͱ2����\��K�� �o��D�9x�x۳I 80 | ��8, �O�ȉ�C�;�'����2o��u�P�p ��CR����� 81 | ��� ��{�|��녴p�`�4��t�v���X�� @X�+�����6zP?,���J��*��lKh:�MѰ��dC�^�fh��D� ���]w�J�����ү���!���}7?fY�ƉA���"S�E����i���D2#ե�$=�������4�:{�pۿs����>� 82 | ���irr�T׎� ;� �q�!�u_��n&5ҁW�%�7 83 | ���_� c�5�����9�f5��r�~J��D�R�5���e��?[�T6����mf8O�r���*�~$Qc��ڏƁ;B���=�E_�M����hhR�` >~�<@34�TG���a�8���vf���&�G[��U�%H�-XP@ � K��/�қ��@^0�ݩ�'��f�܍kl��ش�\��B��G]��W?s���X�(V��z��$F�;��]�HP�{*6�D�cb-7|�X�|�o~m������s��siB��J[0{V��� �\=T%��CJ͵m9<�?�fK�]�ɒCy���{��� 84 | P���Ə뇰G�^JH��@ 85 | \쓚c�~R�bʂ�@mh��VS��#4��xSk�ȗ��~�y�*�q�6��&g��Y��?�� g��b� Xn�!�$�8[�E'(�)���C7"�ONh�C3�V�,��%����(eR39I�H�C̼_YDb�;s~�L��\��ed�5� i��3������s���ђ9I��t��r���ô���ikX���J��B��5F�޾�U���u\�-��*/Usw��� 86 | ���b OĿ�m�O�����n��,1G�G[ՁxeX���uj��z 93 | z�ҳݘ-6�`�9�e�����$��v�:��]]@���/ yB(z�Î 94 | ����/ oZ�m'N;=3�%)y�� �19��F�L(��g�R�K@ ; �\'�'�]�̱�2i�e�vu��# q���Z�~�1���5I]9,��� 7J�i)�H)j��-j��u��՘ �O�O����/� p��:��/���(�;�RBU�7�e�d�I��N��RH�?>X0y8P��r#�b _���8i؍Cf`ȑ�ai�2U�y�d=��2�_�Db�9��@�:q��"ڌSp�F�~���"6TDg�tӆ� 95 | ��+t����Hh7 >�T��LҌ �$�A�Q+� �@;;���M����~o��S<:.�g��&��`$�"C�PbQ,`�$�`���|ʛ���W�18��<��~�$��+�t� 96 | �>N��]-m����e �B5��P����Ncx�q�E}n� �����B68��5 ��}��Uf�<�)�Sb�Q����R���Uk�)LGS*��F:�Hp�%xسR�)���s���.̀�Rq��Wj��G�����i���<�5)� 97 | /򈈳2`�޲������h���6�`눯L�T �����ɖ�n �Q��Y�\��;uth��2�6WZa�fQ���r`�dڭ1t��-�1���a���|Ұ��� g0��C����i�[[��^;�`FOpb^ū��^n����P mJSr4K*X��˓ .c�n�nm��E���P���h��J���l�|����c��! !�Z���I>Nb�T��p���P��u$k[C�%�- Qջ��QL��&�����B88��J�t���q�i��c�2H�šE/'W�^�y���Rrnզ*p�aK�#51�=�̺6� �j�C�#�<� 98 | /I͑2 ;ċ `SX��ԙ���$j����j�g�I\d��O������X���%��=�gr�j���{yV��� �P�sJIf�M�!�]I�N�F���n 105 | �1D�a�6-4��KX�8)����>8� ��)�q�@�������PȒR�2�G���I8C@�hW ��T�Q];K��=_�1a������� �ȱ@��x�Z�� u�rd�`_1�T�*�K�b����{ 107 | �p-n��+��W9?����.�W*m�*n���Ԥ'���.CA��Cd��ýD�C1�n*�k]F� � 108 | ܴOl7i��%�cXkԺ%i(�ε�=�r$Dy�U6�ʉ�;�c�a�� 109 | k|�Gr:�9�mm��W���^Þ��X��e��UA�D�Q�_«�t��j��$Uh�����4��a�| �a 110 | �eB������ �CUMҵ�h�ރ8��w�Ƥii��p��`���g�6ρ�#�Mtʍ�?<�8W���^�%xpf1�Sq 111 | iX�Y�Z�KT6 112 | /5Qt���Φ��hEzp)H�J��XC� �ΐR[S} 113 | q�T/�E��:E,�2P�!�Z�N�Ă�T��s��=4�阃RN�����S��w��y#d��8G6<`� 114 | 3��YˤM��=9fts4� q��9�x��0š�aE�g�E7��� [��3��n(�)* �l�<���`�T�&v��}����Ou��(��! `�4�HA�XO����е���>!� �+�҆�5!� 115 | �0`�!WB4���`1@� 116 | �X���@�( �8 �L@M@��9z��Ok�U���;<�?�^��LJ��ï���������r��s_��J��B�<��΍I�͵}��s���4y�WMmQjݯ6����%�Ì�Ό�Ј��c��F�(6n��]:��?w� r4'}p$��j.�cb%�� ,����[P!C�δ�LD�$�W��rbG|TX!�bFT#�VL.4�Cp <$�*Y�& �"�Ę�Ј�T�����@��H�S���"�JE��#*F Tl8��aQ ¡` ���az����+fV��Zo�f��x*��U�ت��T�B��EJ| 117 | �7�*%�T����Q6��EA�����W���պ��ʪ�z��j�����4}��L�nf�:���?�x괢����>�Xj�!�I��� 118 | �X*�^��v��ڥWj���:v��ڡ�j�ܪ�n�5�����Z�gj�Y���j�� �V->�"^����ĵ�+J�!:�� ʯ� ��dId���r�RZZ�$=� �b�t���Ȩ�΋\rCA�t_X��'.�z�bf0^�f��� ���D V�7�6�7f/�>/�I���W+� A�� '6�N�Aڹ‚�g"� � t��T��ҹDL��d@C[1���M�.y�X�-'G��<�c��G�ʶ�Dѐ٠a��e+��������GGN{^lY���35;!kv0�j=���f���B��w�f$��AM�B=>L�B_�|־E��g\�MƗ�M��!P�S���=*�y�U؆�<�f��)��kuTf 125 | W,�PG��y�fS�Օ?wYV��k^�ݚ�j������k�x�����A���=�pT���R{(���&�{A����K���n����� �Ѣ�LDz30��X���G���|�M�c����L�_K� 126 | �VMe2j��$�n$$y�=�F� �?� !e!�t�t(��@�C[Ra�l��n���O\؁ �BxnЙK�h���:����0I��b�=������gt1cr&�B� 127 | �����tUX��UW�xKk�zc�[ �Bi��f�Bʟa��4�������ҹ��HF�����7F�����2@��W�HұWX�-ږ �޸�P��͵z� �Q�P�$p+A)+�K>\� 128 | �;�9B�G�Dx�j�*����e˙���N-�b� 129 | �^�I������N۶gW`�����)�N 130 | \�$�x+�.���0ћ���2��Q[�S�C�[gX 131 | %���|�;›dDs���j�|[!�8d �� ��&�y~�:�<����9��\H���@0w�AT)C|%33�H>0r��=�161�P.*�y���4[Ŧk�D�4>�0ؘ��B�l��ab 132 | ��"8>�O���'�'FdA��7�b���mInv>����)F�ZS2y�b��2j/3�(���7�FĬ$G�52 �f��(��Ύ9�4�I�%*2��"v�X-B�xp:��kԝ��\��� ��%�(����"@x�/g�F ����T��3 133 | �)�|;oX��9R(o��g��P��Q*:���p��JfuvXص�!�Rz���Q#A��C�q�i��!P�aY�2]b3���E����6�P�Hu~���sFxR�������$�H�T����`w,�^[4�:)6l~s��9_��2����!��.���� g ?i)eh�|�Ga 135 | #�i�ejD�dAo`�� 9$�S��)LE�v���B���,/���e�P�a 136 | �窀J���I��??Qg*�[9��9�����{ ���Ӧ3�{�C�K�%:��G�J���xI|ѳ`��N�e�L輺�t�r�6Ӻ�-��\��jp����-�Q ��¬S�l|�ȃ�6���2�ʫ��y��8��_$*(�#����+[��6�� V#�i�S7���u>�z&�Κq���%]�Pр6�`� �F��b"2�'�-�H��Q{ 137 | ����/�Wk��c�$��/sت�y�n 138 | ������[@��7 w�� 0�a��V�GΙ� ����}�' �C)�� 139 | -�x�U"!9��[�ϳ��P(p������CZ,*�BFς�!ns#P���#Ȣި>|E�+��Z�Sn��dMOH2���� L� ��7�ZCC��S_#�N��K�2���� �D�<�sT)Ĩ 140 | xy+�YD��ի�K��jzo�Z�Q�$��:���^�H1����d)���&II]�u�2�0�.�PU�V�Y�zs��F;�&np*Z��8PN`D ��@�?#x��"pL�B^�{����Z-�ED]�v����(М�` 164 | ��1� �Cm+KJ�]� 165 | �5���]���M�i� 166 | ��h�0jxy�ۛHy��:�T��A�����uac�)y�����s��oܘ�a�SG)$��� ux����" ��mTqv����N@[U�j4�3��Y 167 | n1i 168 | {N/�Tj5�f����c絋X��̽�99@06����| ��=� R��� ��<� 169 | v�lb�2�8�o�� 170 | ��Q��@�F;D�:l�����,ecd�-��B�l� 171 | ����m���X�LL=#�����+�Y�$�}�n£�{��)p�BS� ��4���Jw.d�D��P��#�|�%�J�p+�T��UY��4�6?��qj,�s��JT`�Jb L(7�� q��y�K��&M����~ 172 | �]g7��W����<�U�y3�KC 173 | m��'*� ���Q�ƌd kF��Dv��Jt��S��0L���di�S�B:�Ag����R�XY��¢�^���@�K 174 | S$j�-�W'�9�#Z�K�����I �eh6�Gt��Aq�~�3��9��/BH!����I[ňc�$q�����gF�d�蠓��uMc����H��ɴ�0� �T2Fm�������`�6k{��:<�n�k�dD��d�F� 175 | qKMCO�dF߅>�E8E��r��t�y.�G��x��B5Cf�����r!�h{��b#�zpZ�ِzNd�,�gMY�}�)�$�O;�-� �yq}fq7���ֵ HS����1�R�&�~Z��O(���]4�f�FN���HPg6�y����1Õ����K��*��R[A�1������APȔ��S��$��, A'�bCp��� �P�4�>Y!Ov�^\s(r��Њ�ۨn� 176 | p) 177 | pi�5�U��Y��Z�D�tY�:�1��Q����q7/Rk 178 | �@"B�?А����o��x4 �s(J�(qoc^EcѢ4,���ГmXh���(�b�� �i�m�E 179 | �e&�5C��1��y��v�I Z�&�ye��Q`o�vY��IH޸X�B�{Π 0�\�#A�4$���8ЃΨ� ����Zh�N}hة�%P�}@� 180 | � 181 | �?�5d��1�9�.PŠjco�����WH�W G����!N�4K�����)f�>�-�t�n�Y�4�*��c�N� �a�ևD'�� &_0�M& ^ژ�b-�9��?e���n�ב޷ 182 | ��򂇥E�,�d!�E|KOP� ��:�Y�j٭O{� Cfm!X�� 183 | w��2\~���h&�;ꍝgPҲx�z�_�9�uDy�"���H�� 184 | ey|ʠ'��[q�r|#�R�r�_���k�R=y8��X]�8w����=Q-���^f�6,J�E�C�0 G�/I�т0�4��Ā��c9]��"��9ÄP�*��R#�L�ɻXz��43�8�/�߹zeF$1�_��IV��F�2Q�X).�T�cfgW���U����v!��!�� 185 | ��6�B"&�Şgt��9� �h����dEpj-ہʁ+�~�^F��sR%a4�/}0���� �Q'�`�E���nɸ�ٕtձ��W}9 186 | �_�2PS0�Ԟ���!%Rp�B�� �q <�$ �����"�ъm|��BpZ*d��ğ_~�/���` 187 | ��%�7y�+M"�����f�fl�n����Y�l� Sya�U乒�+NP�Z�@�_ہ���;����DT���YG:I���D"i� ��+�9��IL{Ћ>��A��D�4E��E�q W�J�e�E|�9�6p��X"H�MI'$�|�K'<��t�N{I7i`�������Fq�B?��Y�f�"%0q?F=��O*��æ:Cx*����hXԠ��~U���Č>�� 188 | -------------------------------------------------------------------------------- /resources/public/fonts/glyphicons-halflings-regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | -------------------------------------------------------------------------------- /resources/public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- 1 | FFTMjU��GDEF8 OS/2g�K�X`cmapJ� ��rcvt (�,fpgmS�/�4egasp�glyf3!��53#"'.'ddq�d�%Ku��p<�3LJ9D?{d���d�� 09C3JL3�ak��w$B �d/5d�Z��gj7X0,Z>d.6dJtB+0W5�ju�.�x��L��/���/�+01!!���|�,1��,�A�/�Ͱ ��/�+� � 99013!264&#".#"qO�x��x.,,�n��BU�Pr��awי kd�L 23 | 24 | 57% �����P,��XX��,d����p�X����[� ,�������%'7'7764/&" 25 | M�Z�f�V�c 26 | 27 | �$ 28 | p�Q�f�V�\ 29 | '� 30 | 31 | �� 3�+�Ͱ2� 32 | /�ְͲ 33 | +�@ +� 34 | +�@ +� +01!!!5!�� ,��,�����dd&L� &7>5%&7>54&&$�OAXX@JOW�OFS 35 | � 36 | @JO�n)`*^���r67)Q7q 37 | � 38 | �O����Y�+�/�Ͱ/���/�ְͰ�+�ͱ+��$9��9�� 9��9��$901 "'#" 6& �N,m��w�ȃ���������Ȏw��m,Nl�����dX�D�/�ְͰͱ+014>>.d8Zwwy,0{xuX6Cy��>>��yC@vS-IDEH-Sv@9y��UU��y��G�� 39 | !3! 7Hߒ����������� ��p���?����?��G�� 40 | � 41 | /�3�Ͱ2�/�+01!3! 77'7#'Hߒ�����������C�I��J��MN ��p���?����?t�⌍�����155"&=462#�%?��?%��d�3�|��|�3�d��� 42 | �L #'+/3��+�ͱ 22�/�"3�Ͱ$2� /�&3� Ͱ(2�/�*3�Ͱ,2�/�.3�Ͱ02�/�233���4/�ְͳ $2��+� 43 | $2�Ͱ2��+�2� ͳ$(,0$2� �!+�%)-1$2�ͱ5+� �99��99011!%35#535#535#535#535#!!5!!35#535#535#535#535#��dddddddddd�X�X��ddddddddddL�dddddddddd�|�d��|dddddddddLL/?B� 44 | +�,3�Ͱ$2�/�<3�Ͱ42�@/�ְ2� Ͱ2� � +�02�)Ͱ82�A+015463!2#!"&463!2#!"&463!2#!"&463!2#!"&��p��pX��p��p2��pm��p���pm��p LL/?O_o�v� 45 | +����������������'��+�/�Ͱ/�#3�Ͱ!2� 47 | +�@& +� 48 | +�@ +�/���(/�ְͰ�&+�2�%Ͱ 2�%& 49 | +�@%# +�&% 50 | +�@& +�%�+�ͱ)+�&�999�%�9��$9��9��9��$9��99901 "'#" 6& 53533##5�N,m��w�ȃ�����Fd�dd�����Ȏw��m,Nl������Y�dd�dd����]�+�/�Ͱ/��� /�ְͰ�+�ͱ!+��$9��9�� 9��9��$901 "'#" 6& !5!�N,m��w�ȃ�����F��p����ȍy��m,Nl������Y���+E�/� 51 | ��,/�ְͲ 52 | +�@ +�� +�Ͳ  53 | +�@  +�-+� �#$90147 654&'5".;2654&+"ҧg|�b�|g��[���՛[�ddX�(>�7�x���x�7�>�طv՛[[�� �d�� 0�+� 33�/�ְͰ�+� Ͱ � +�ͱ+0173#33333d��,�d�d�,����  ����P��GQb�/�PͰK/�6��R/�ְHͰH�M+�$ͱS+�H� =99�M�39$9�$�/99�P�99�K�!'E$9�6�+A9901732?6?67'76?654/&/7&''&/&#"'462"&�P-<�-1&("/&./�80P��P,<�-0&("/&2,�;.P 54 | �g~�~~�~Y!)&1,�;.Q 55 | �� 56 | Q,=�,1&("-&3*�:/Q��Q/:�/.&0X~~XY~~d���#'+/37��!+�$Ͳ(04222�'/�*26333�Ͱ/�ͱ,22�//� ��8/�ְ$Ͱ$�%+�2�(Ͱ,2�%( 57 | +�@% +�(�)+�0Ͱ0�1+�-2�4Ͱ 58 | 2�41 59 | +�@4 +�4�5+�ͱ9+015463!5463!2!2#!"&!#!"&73#3#!5!3#3#d 60 | ;),); 61 |  �� d�;)�D);ddd�dd,���dd�dd2 62 | d);;)d 63 | 2 �n ��)<<)��D�,d���D�� 64 | ,� +�3� /� ְͰ�+�ͱ +��901 #!!!���������Y��|���pXd��"� +�/�ְͲ 65 | +�@ +�+017463!!#!"&d �� � X,~ � �] ,���� �� 66 | /�Ͱ/�Ͳ 67 | +�@ +�/���/�ְ 68 | Ͱ 69 | �+�Ͳ 70 | +�@ +��+�ͱ+� 71 | � 72 | $9�� $9�� 73 | $9�� $901$  $ 6& 33�D���������V����Gd��D�������_����V������d��� .�+�3� 74 | /� Ͱ/�Ͳ 75 | +�@ +�2�/�+01#333!#3#d�������)�(1�����,�P��p�,L� J� +� Ͱ/� Ͱ2�/�ְͲ 76 | +�@ +�� 77 | +� 78 | ͱ+�� 99� 79 | � 99011!3!3!%35#����,�����ᯯ�,�� ���p�d��c� 80 | +�Ͱ/���/�ְͰ�+�Ͱ�+� ͱ +�� 81 | $9��9�� $9�� $9014>2". 6& 333_���ޠ__���ޠ\�T����P�Ȗ���ޠ__���ޠ__�����T��d,������ a� 82 | /�Ͱ/���/�ְ 83 | Ͱ 84 | �+�Ͱ�+�ͱ+� 85 | � 86 | $9��9�� $9��$901$  $ 6& ##�D���������V����O����D�������_����V��b,����,�� )� +� Ͱ2�/���/�+� �999015!#!"&3!73!� � � ��2,2�a����D�% ������ F� 87 | /�Ͱ/���/�ְ Ͱ �+�ͱ+� � 88 | $9��$901$  $ 654& �D���������V�����:)�D�������������������S�/� 89 | Ͱ/���/�ְͰ� 90 | +� ͱ+� 91 | �$9� �99� 92 | � $9��9012>5# &632!&#"[���՛[������n�����v՛��՛[[��v���b�Q���z[���!z�+�/�Ͳ 93 | +�@ +� 94 | /�Ͳ 95 |  96 | +�@ 97 | +�"/�ְͰ�+�ͱ#+��99�� 98 | !$9�� 99��!9� 99 | � 99��9014>327!7&#"!32653#"'[��vƝ��p�p���I��p���[��vƝXv՛[z��p�P����P�v՛[z 100 | d�� #'P�/�3� Ͱ2� /�3� 101 | Ͱ2�/� 3�Ͱ!2�/�$3�Ͱ%2�(/�ֲ 222� Ͳ222�)+013!!!%53'53'53'53!5!=!%5!%5!dL�d���dddddddd�� �� �� �����|ddd�dd�dd�dd�dddd�dd�ddL�#J�+� /� ��$/�ְͲ 102 | +�@ +��+�Ͳ 103 | +�@ +�%+� �$901546;5463!232#!"&!54&+";)dvR,Rvd);;)�|);�,�dX);�RvvR�;)�);;�dLL�+�/�ְͱ+0133>>7.ddd<�x|rjd)({���tZL��<0 104 | !OQ�QE 105 | (( 106 | EQ��!1Ag�/+�>3�&Ͱ62� /���B/�ְͰ�"+�+Ͱ+�2+�;Ͱ;�+�ͱC+�2+� $9�&/�$9� �9901;2654> ;2654."46;2+"&%46;2+"& 2 ��� 2 c���ޣc� � � X � �   ,�rr���  ,tޣcc��t��� �4 � �4 �X�!!7'77',,�������G��G��G���� �����G��G��G���p��/�ְ ͱ+01!!%7'654,,�����EojCV�� �95����6n���b�<�/���/�ְ Ͱ �+�ͱ+� �$9�� $901!%%7'65477654/,,���EojCV^{wQ���������5����7n�������B��� 107 | ��!/3?CGKO�+�0D33�Ͳ)1E222�/�'+L333�Ͳ%-M222�"/�33�#Ͱ2�/�H33�!ͱ4I22�P/�ֱ22�ͱ22��0+� 108 | ,22�3Ͱ52�3�. +�*2�%Ͱ@2�.% 109 | +�@." +� 222�%�7+�DH22�;ͱ&J22�;�L+�B2�OͲ9=F222�Q+�0�4?$9�7%�()8999�"�89$9�#�:;999�@ 67<=@C$9011!#5##535!535#!!!5335#5!3##5#5355333!5#53!!5!5353��d�d�dd� d,��,�dddd,,�d�dddddd�,����,�,��ddd�dddddd,�,���,���dd�d� d��dddd�� dd������d��p,����dd�dd�Ddd �� #p� +�333� 110 | ͱ22� +���$/�ְ Ͱ �+� 2�ͰͰ� +�Ͱ� +�Ͱ� +�#ͱ%+� �99��990153#5!'353'3535353'3ddd,�d�dd�dd�d����Pdd����[[����[[����[[�����)�+�/���/�ְ ͱ+�� 99901463! 2764'&" 111 | ��� ��SS�� 112 | �D� �TT��1�+�3�/�Ͱ2�/�ְ ͱ+�� $901463! 2764'&"%3 ' ��� ��TT d�� 2��� �D� �TT��D� 2�d�� 113 | ?�+�/��� /�ְ 114 | Ͱ 115 | �+�ͱ +� 116 | �999��9990137!!!d��d�d���d�d��L� 117 | 3 4&#!"�������E~�� 'Y�%+�Ͱ 118 | /�Ͳ 119 |  120 | +�@ 121 | +�2� 122 | 123 | +�@ +�2�(/�ְ Ͱ2� �+�2�ͱ)+� � '"$90153!73#5!!7.#!"7>3!2#!"&�dXd����5(P>^ 124 | �> 125 | B& 126 | � 127 | & 128 | � 129 | d����D���||Z  � 130 |  131 | � 132 | d�L%-1o�/�%Ͱ)/�-Ͱ!/���2/�ְͲ 133 | +�@/ +��'+�+ͱ3+��9�+'�!$% $9�-)�"#$9�!�.199�� /0$90153!2654&+.+"#"462"264&"%53;)�);;)�37S*�)R:. �);d�Ȑ��>X>>XXd�);;)X);E5+);;;)�pȐ�Ȑ X>>X>^dd5��"�+� 134 | 3�Ͳ 222�#/�$+013!5".?!#!5&'./#5m)>$\�R+5�"(�]�q *k�.tB6,��-WBB*. 135 | ��0 �Ɍ��d�� )1e� +�!Ͳ +�Ͱ)/�*Ͱ1/� 136 | Ͱ 137 | � ��2/�ְ!Ͱ*2�!�.+�Ͱ% ��ͱ3+�%.�9�)!�9�*�9�1�90135>54.'52#'32654&+532654&#d); $�x�!" E4+v�OȡY�}^��Ll��Y3(; 138 | G��7]7( 3AvFT�M�aTZ�d{MRa�o� �+�Ͱ2� /�3� ��/�+0135>76&'.'5!�Ms� 139 | (G �!:"� 140 | 0G9C/Q8$99#'% ��4<9��� %~�+�/�333� Ͳ 141 | +�@ +� 142 | 2�&/�ְͰ� 143 | +�%Ͱ%�+�Ͳ 144 | +�@ +� 145 | +�@ +��+�ͱ'+� 146 | �99�� 9� �901'3#7#33!3#4.+!57#"KKK}}KK}���2.!"�d�pd�"!/� ����c,��' �2dd2R '!���� %��+�Ͱ/�3� Ͳ 147 | +�@ 148 | +�2�&/� 149 | ְ%Ͱ%�+�Ͳ 150 | +�@ +� 151 | +�@ +��+�ͱ'+�%� $9��$9��99��99901?!55!3!3#4.+!57#"!� ����d���2/!"�d�pd�"!.3}KK}}KK�,��' �v2dd2� '�L/?53!26=4&#!"53!26=4&#!"53!26=4&#!"53!26=4&#!"L� ����X�2d�d�d�d�L/?53!26=4&#!"3!26=4&#!"3!26=4&#!"3!26=4&#!"L�L����D��D2d�d�pd�d�L/?&� 152 | +�Ͱ-/�$Ͱ/�Ͱ=/�4��@/�A+01=463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&L�d��� ���X�2ddldd��ddldd�L/?&� 153 | +�Ͱ/�Ͱ-/�$Ͱ=/�4��@/�A+01=463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&L�L�L�L�2dd@dd@dd@dd�L/?O_oR� 154 | +�L3�ͰD2�/�\3�ͰT2�-/�l3�$Ͱd2�=/�|3�4Ͱt2��/�ֲ 0222� Ͳ(8222��+01=46;2+"&546;2+"&546;2+"&546;2+"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&dddddddd, �� �� �� ��2dd@dd@dd@dd�dd@dd@dd@dd���L 155 | *:J �/�&3�Ͱ.2�K/�L+��90153553#3!26=4&#!"53!26=4&#!"53!26=4&#!"5;26=4&+"eɦ��dd�X�,���� dd�dK}}K� L��d�d�d�dL/?CJ�@+�K/�@ְCͱL+0173!26=4&#!"53!26=4&#!"53!26=4&#!"5;26=4&+"3535#5X�,���� dd d!���2d�d�d�d��L�&}KdK���-� 156 | /�Ͱ��/�ְ ͱ+� �9� 157 | �9901463!2#!"& ,�,,�,�,�,,�v,,d,��LY� 158 | +�/�Ͱ/��� /�ְͰ�+�Ͱ�+� ͱ!+��9��99� 159 | �999��9015463!2#!"&?'!462"X�d�*J%��lNpNNp,�� ?�>�����pNNpN����=� 160 | +�/���/�ְͰ�+�ͱ +�� 161 | 99� 162 | �999014>32.'&73264&"�y�z{�yII�99 163 | "c]s+?—jk��֖�|ׁ~���r�BB "ko�K��k��֖���I� 164 | +�Ͱ/���/�ְͰ�+� ͱ+�� 165 | 99� � 99�� $9014>2".3"_���ޠ__���ޠM���ޠ__���ޠ__� ���Vu�%4>7.77.'&6?uDmssIOWM?%N~�OrÀ~[[. 166 |  \7�^����`G�vwsu�EY�d;^�~RlbJ(I�43n��h!&W�+�Ͱ/���'/�ְ Ͱ �+�ͱ(+� � $9��"99��!$9�� "#%$901463!"3!26=7#!"&%7' 7/�n���);;)�);���ԥ����r�k�qq\�,���;)� );;)}����j2�q�k�qqU�L.H�+�Ͱ"/�'Ͱ /�Ͱ���//�ְ 167 | ͱ0+�"�$999� �%9��&901463!#"3!2657#!"&> "��U�);;)�);���ԥ��gg_h��HCVC9�,��P X;)� );;)�5���!&4 �D>�3Cm�L#R�+�Ͱ /���$/�ְ 168 | Ͱ 169 | �+�ͱ%+� 170 | �"$9��!9� �"#$9�� !9901463!2!"3!26=7#!"& ''�,=B���);;)�);���ԥ�V7��R��,���;)� );;)Eȩ������7��Q���E�+�/�3�Ͱ 2�/�ְ2�Ͱ2�+��99�� 171 | 99�� 990135# #35 5#3 35#,��,'��,����������[(��,������������,����L�+� 3�/�ְ 172 | Ͱ2�+01746;2+"&�d�� d2��K����J�L�+� 173 | 33�/�ְͰ2�+01546;2+"&d��� � d2��K��������J��L�+�3�/�+01�4�� &&������LL3 ���|&&�d��7;2654&+";2654&+"������� �� �dL�73!2654&#!"� ��� (L�+�3�/�+011 �4��L��������L�+�33�/�ְ2� 174 | ͱ+01146;2+"&5��dd� L��������,�L�+�3�/�ְ2� ͱ+01!46;2+"&5,�ddL����d��(� 175 | /���/�+0175463!2#!"&!d��L���dd4���7 '�P���a�W��aa���Rt% 7a���<��aa������ B� 176 | /�Ͱ/���/�ְ Ͱ �+�ͱ+� � 177 | $9��$901$  $33535#5##�D���������������D�������?Q������� I� 178 | /� Ͱ/���/�ְ Ͱ � 179 | +�ͱ+� 180 | � 181 | $9� 182 | �99��9901$  $!5!�D��������X��D�������?Q��� 2� 183 | /�Ͱ��/�ְͰͱ+�� 99� 184 | � 185 | 9901$  $77'7''�D��������SՍ�Վ�Ս�ԍ�D�������?(Վ�Ս�ԍ�Ս�� 2� 186 | /�Ͱ��/�ְͰͱ+�� 99� 187 | � 188 | 9901$  $ ''�D��������k���f�D�������?������f�� 8<l� 189 | /�9Ͱ+��!499�.� (:;$9�'<�99�!�*9�� .999�4�9901$  $32264>:323>54.#"35#�D��������ɏ '�-"#1D12QE&����D�������? 190 |  =& 191 | )2X23L(5`�.d�� ;� 192 | /� Ͱ/�3�Ͱ/�Ͱ/���/�+��99��9901$  $7!5#!3#35#�D����������d��ddd���D�������?�d,d��d��/i�+�/�Ͱ2�/�!333�Ͳ #-222�0/�ֲ)222�Ͳ'222�1+��"#./$9��9��9��()9990153>7533##5.'35367#53.'#53����6vk���YȌ�`oKȕ4��eJ�Kn���}���P�E�f�!���}Im��0��Jj��lH��� F� 193 | /�Ͱ/��� /�ְ 194 | Ͱ 195 | �+�ͱ!+� 196 | � 197 | $9��$901$  $ 6& 7'77'�D���������V����I��m��m��m���D�������_����V��ۇ�m��m��m���� F� 198 | /�Ͱ/���/�ְ 199 | Ͱ 200 | �+�ͱ+� 201 | � 202 | $9��$901$  $ 6& 77�D���������V����k�W̎���D�������_����V��#�W͎���� F� 203 | /�Ͱ/���/�ְ Ͱ �+�ͱ+� � 204 | $9��$901$  $&#"32654'�D��������>8dt���ap��;�D��������sd7>���;�pac���/���/�+��901!!XX�#�������c���/���/�+��901! XX��,,�;�@-�J��+�/�ְͱ+��901 !!�������XX��Xh���+�/�ְͱ+��901!!!h(,*�?XX����L 205 | 5>7 F��X�_���Ȅխg�;�@-$Du�� 206 | �+�/�+011!�&��ځ�&��p���&��ځ �&���"#�� 207 | 7'!' "'�������'��ف�'��p���5��'��ق��#O� 208 | /� Ͱ#/�Ͱ/���$/�ְͰ�+� ͱ%+�� 209 | !#$9�#� 99��99014>2".;2676&+"35#[���՛[[���՛V:#6#:�0����՛[[���՛[[�F��.��d��&*04;4�'+�13�*Ͱ22�7>7.#676%>7>'&"� 8./ie���h,Jhq�x{\Sc'C78Fak[)!#�==��Y��5<�b�;7>'>7>76''&'.7.7o FFB:8( OV 214 | $9DkC@&��'GOS3 215 | *gJ.  &:4?�B8- 216 | %>=B�'P�d!I,  =CnC�Sm,U�!�ٕfm�S ;4( 217 | .MV .n��}�3!?GC�/�)Ͱ:/� ��H/�<ְ7ͱI+�7<@ 218 | )(5>@C$9� :�$.5>BG$9017>2".'72>7.'"&5477./=FOsv���vsOFFOsv���vsOF�C-[Tz�wRY,H 7:91��.f�1ii%LX( 219 | (WT`G//G`TW( 220 | (( 221 | (WT`G//G`TW( 222 | ( 223 | `=^8+(3\;hI%E:JY|��|UIWs|Ci`$$���� )A��+�3�B/�C+�6�=���+ 224 | �.� ���� 225 | ���  +� +� +� +�$ +�% +� � �#9�9�9�$9�%9� 9� 226 | $%........@ 227 | 228 | $%..........�@017>3273#7.'77.547?./7>7&'7=FOsv�H=<%��Ɣ%R�ri' 229 | �ҷ%k�.f�1i/:(&-/"0/a+'C�. 230 | %Ze�X( 231 | (WT`G/��P�egy8(��6��nUIWs|C/WR�&2&?@0�6�@(( 4kbf��� &3!26'.7 !5#5#o%%�~8�~������dd�DDG  " ��d��-dd���,dd��)H�/� ��*/�%ְ2�Ͱ 2�% 232 | +�@ +�% 233 | +�@%# +�++�%�99� �%99015467462'%/#&=47&dkX|Xk��d^�^d��)1ES>XX>����1) 234 | ���[@ NN @[� 235 | L� #'+/37;?CGKOSW53!265!5!54&+5#!5##"53'53'5353'53'5353'53'5353'53'5353'53'53��L�d� d�dddddddddddddddddddddddddddddd2�d�dddd�Jdd�dd�dd�pdd�dd�dd�pdd�dd�dd�pdd�dd�dd�pdd�dd�ddx� 236 | A�/�3�Ͱ2� /�3�Ͱ2�/�+��99� � 237 | $9��9901=!35 5# !7'!735 5#X�,�ԟ���z������z�,�����X�������Xz���{�������L�+�/� 3���/�+01463!2#!#"&;)�);;)���d);�X);;)�);��,;dL�%)-`�+� Ͳ  238 | +�@  +�2�&/�*3�'Ͱ+2�./�ְ&2�Ͱ(2��+�*2�Ͱ,2�/+��$9��99��9015!32>'4=!".!!!d,U'5%;) ,'Me���eM',�,X��q \ #(,.��*R~jqP33Pqj~RV,��,�����h� 7�`a����a���CF�� ' FDB������C���a�:dv�(�/���/�ְͱ+��9��901 #!!!# #�+,�������}�++�����p�X,��p��X��2F�"+�3�,Ͱ,�&ͱ22�//�Ͱ/� ��3/�$ְͰ�+�ͱ4+��-901&763!7>;2++"&=!"&=#"&5463!7!"&'�&^6�*��*20� -��*�? 239 | 2222�*�L �+�Ͱ/�Ͱ 240 | 2� ��/�+011!53463!2!��P�;),);� ���d);;)d�L(�+�Ͱ/� 241 | Ͱ2� ��/�+��9013! 3463!2!!,����P�;),);����D�X);;)�.�� !� +� 242 | /�ְͱ +�� 99013# #3.��**����,X,�����/�� �/��� 243 | /� +��9901!5 5!,X,���X*����������!I� +�Ͱ2�/� 3�Ͱ/���"/�ְͰ�+� Ͳ 244 | +�@ +�#+� �901=463!2#!"&>3!235#35#;)�);;)�);�$�%���dd�dddd);;)d);;U�'-�$��ddd��d�L )7&�8/�ְͰ�*+�2ͱ9+�*� 9901546?.5<>;%%##"+"&'4632#"&e2"����]&/ 245 | S7�X22 246 | 247 | �!U�  248 | ����� Q��R�Jf�+35�/+�3Ͱ)/�3�Ͱ2�) 249 | +�@)% +�4/�5+�)3�,1990146;7>7'&6;232#"&/.267"Ju?zS^Sz?vdj�O}�::� 8F8 0l^�GM~ $M���( ))�1==1��777'7'7'7'''�N�-��-�N괴�N�-��-�N��-�N鳳�N�-��,�N鴴�N�,�d��".�//�(ְͱ0+�(�90153#;;276=4&#!6=4&+"?3!#'��,d=|�.%�='��='20`�d�d22��ֈ�X��Kd9X+d,Qv�,Q(��%��w�ԯ�}��d�L".p�+�%Ͱ/�3�(Ͱ./�Ͱ2�,/� 250 | ��//�ְͰ�+�#Ͱ#�&+�Ͱ�)+�ͱ0+�&#�(,999��9�)�+9�.�*901374;6;2#!+"&/&735'!5##�dd=|�.%�='��='20`�d�d22��ֈd�X�}�Kd9��+d,Qv�,Q(��%�կ�}wddU"Ay� /�$Ͱ/�)Ͱ1/�Ͱ2�1 251 | +�@1 +�B/�ְͰ�+�#Ͱ#�-+�Ͳ- 252 | +�@-< +�C+�-#� ?$9�$�#9�)�9�1�;2654&#!*.'&54?'�dj  m U.UkmTk����dd%���7   253 | �V���X�K 254 | % 255 | � pyL�N��'�YS(  256 | �S���e�V8<y�/�$Ͱ/�Ͱ8/�Ͱ:2�8 257 | +�@89 +�=/�ְͲ 258 | +�@, +��&+�Ͱ�9+�<ͱ>+�&� )$9�$�&9��9�8�',99901463'&54?632#!"&'#"'32!7%*#!3elU.U m 259 |  m!����kT 260 | ��%k��W� 261 |   �$��C�Ly 262 | q � 263 | '�� 264 | �(Sd)��Y��S�  � X�aL6:G�7+�8��;/�ְ72�)Ͳ) 265 | +�@): +�32�)�/+�ͱ<+�)�699�/�9013!2654&'%54&"'&77><546!5!a� 266 | ' 267 | 268 | �(��N�Ly%p[S�22(SY� X����V�jTnkU��T  269 | n V� 270 |   �����d�p�� 271 | �48E�5/�6��9/� 272 | ְ52�+Ͳ+ 273 | 274 | +�@+8 +�!2�+�'+�ͱ:+�+ 275 | � 99�'� 276 | 901?26=%>54&#!"!&5<.'&5!p 277 | &yM�NS)� 278 | ��% 279 | 280 | ���Y��(22��XIn 281 |  U3�.TlnTj�V���Sd�ڂ��  282 | �q����:� +�Ͱ/���/�ְͱ+� � 99��99��99014>32 $! _��z���������%,��nUzݠ_������? 283 | ��&*���8�+�Ͱ/���/�ְ 284 | ͱ+��9�� 285 | 999��9014>32 $7'!7!5_��yzݠ_���������,��Uzݠ__��z��?��������>� +���/�ְͰ�+� ͱ+�� 99��99� � 99014>32 $%333_��z���������'�����Uzݠ_������?���,���M� +�/���/�ְͰ�+� ͱ+�� 99��99� � 99� �999014>32 $% ##_��z���������',,��Uzݠ_������?��p�,�������|�+�*ͰO/��/��/�ְͰ�X+� 286 | ͱ�+��9�X@!#$32 $277>7.'.'"'&65.'6.'&76746'&67>7&72267.'6'?6.''&%>72>7.73_��zyݠ_��������" T>9.*-hu"#. 291 | F = .2) ( (% 292 |  293 | )#? 6 /R+>=>1 294 |  " ,$�Uzݠ__��z��?Y!w F  /JG  295 | s$>   #/ 296 | & 297 | % I+ 298 | *  ' ' 299 | $#   300 | ' "qq $ 301 | U _��<7&6767'"/X!N`����� 302 | �{��+o�+We�6\e��~�\F/�n`��/37;P� /�4Ͱ7/�Ͱ/�0Ͱ3/�Ͱ,/�8Ͱ;/�%��Ͱ>�C+�Hͳ7HC+�1Ͱ1/�7ͰH�+�ͱN+�&� 312 | $9�>*�-<99�71� /;$9�� $9��*-<>$9�(�99�#�/;9901$  $ 654& 462#"64632#"46?&54632#"'"&%462#"&�D���������V�����m. M  R)z  73H3 .  �D�������������.  �,! . � 1~! . 313 | �$33R . ��;��O:�/�'Ͱ /�Ͱ6/�J��P/�Q+�'�?9� � 1$9��239901327>767>'&'&#"67632#"&'&>767>32>'.'&#"0#vF?8!@)'(�#Z .A#�{Ey&$��4I7Z 0$&\4=k6_v[��EC8fOESkZ(G�־N9@1*+,�#b/W!#�tCu$'$��4B?#>@$$\475�be[��<�C�]W�$!7G�P6�X5=�3/�-3�Ͱ2�6/�ְͰ�*+� 314 | ͱ7+�*�$9�3�9014632632'.'.76?>54&#"'&#"Pń�bg���#WCG�`+rFBGCW#�=>@]aRq @C>`9J:vr3HZo\o >FXGaS��Pc9��w�332764/&''7'&'7'7>54/&#"9B�D[]BBB� i��{�_.7B�B� i���_/#7B�B]_@��Ba_@�BBB�B� i��{�_-87B]B� 315 | i���`13#j+]B�BB��@���E�+�Ͱ/�Ͱ/���/�ְͰ�+� Ͱ �Ͱ/�+��9990174>2#!"&7!!264&"�2�- 316 | +�@-, +�;/�3�Ͳ; 317 | +�@ +�D/�ְ2�2ͰͰ2�,+�:222�+Ͳ>222�+�@+�'Ͱ ��ͱE+�2�9�,� 9�-�)9�;�':@C$9��9013.#.54>753#.'#5&'.654&''�WJ.BN/!X�Od&ER<+�6J@"�� MNW(k,;�+�@Gdf��C��1/�*Ͱ/�3�Ͱ2�/� Ͳ 319 | +�@ +�D/�ְ92�Ͱ$2� 320 | +�@ +� 321 | +�@ +��+�ͱE+��8BC$9��  *13$9��,9�*1�-999��,<990153&'.>7632#4.#"3#>36327#"&'>7>'d� 322 | /-a��ʙDP$%T)!��):#b!�!L<2)O'*�2'V7 323 |   0 $Xd17;V^(X�w4K,9S*3d2�;6 "�B � 324 |  325 | 7�G�� 326 | � +�/� ְ ͱ+� �901 ## ##**���**��,��,��|X,���|��� "��+�3� 327 | Ͳ+�Ͱ/�ͱ22� 328 | /�Ͱ/�Ͳ 329 | +�@ +�2�"/�Ͱ2�#/�ְͰ�+� 330 | 22� 331 | ͱ22� 332 | �+� 22�ͱ 22�+�Ͱ/�ͱ$+��9��9��9� 333 | �901333!5335!##535!#5#735#������d���,cdc�,dddd,��|���dd�d�ddd,�� dd����"��+� 334 | 33� 335 | /�Ͱ"/�Ͱ/�ͰͰ/�Ͱ/�Ͱ2�#/�ְͰ�+�22�ͱ22�� +� 22� 336 | ͱ22� 337 | +�Ͱ/�ͱ$+��9��9�"�$9��9��901333!!#5#5335!##53535#������,dddd���,cdccdd,��|���� dd��dd�d�ddd�|�L� k� +� /�Ͱ/�Ͱ 338 | /�Ͳ 339 |  340 | +�@ 341 |  +�/�ְͳ+�Ͱ/� 342 | 3�Ͱ� +� 2� 343 | ͱ+� �$9� 344 | �9901 ##!#553#35#**��X,d��ddd,��,��|��� d�d� ��|�L� k� +�/�Ͱ/�Ͳ 345 | +�@ +�/���/� ְ 346 | ͳ 347 | +� 348 | Ͱ 349 | /�3�Ͱ 350 | � +�2�ͱ+� �$9��9901 ##%53#!#5'35#**��X�dd,dcdd,��,��|dd� ���� dd��� 351 | R�/�Ͱ /� Ͱ/�Ͱ/���/�ֲ 222�ͰͲ 352 | +�@ 353 | +�@ +�+� �$901 ##5!5!5!53**����� ��p,���,��,��|���,��,��,���� 354 | R�/�Ͱ /� Ͱ/�Ͱ/���/� ֲ222�Ͱ 355 | Ͳ 356 | 357 | +�@ 358 |  +�@ 359 |  +�+� �$901 ##535!5!5!**�����,����p�,��,��|���,��,��,��LL*� 360 | +�Ͱ/��� /�ְͰ�+� ͱ!+01463!2#!"&73!2654&#!"�,����ԥ��;)�);;)� );�,����ԥ��A);;)�);;)LL">� 361 | +�Ͱ/���#/�ְͰ�+� ͱ$+�� !99�� "9901463!2#!"&73!2654&#!"-�,����ԣ��;)�);;)� );�M���,����ԥ��A);;)�);;)� ��LL">� 362 | +�Ͱ/���#/�ְͰ�+� ͱ$+�� "99�� !9901463!2#!"&73!2654&#!"�,����ԥ��;)�);;)� );d���,����ԥ��A);;)�);;)d��MLL">� 363 | +�Ͱ/���#/�ְͰ�+� ͱ$+�� !99�� "9901463!2#!"&73!2654&#!"!�,����ԥ��;)�);;)� );d���,����Ԣ��?);;)�);;)�pML<�+�Ͱ/�Ͱ/���/� ְͱ+��9��9��901!5 55!2654&#!5!2#,��p��);;)� �����,�������p�;)�);���ԥ����!(�/���"/�ְͱ#+��9��9013!327636'&#676/#"�.�   ���  364 | ���K�J  365 | i�  ���VL?�+�Ͱ�Ͱ/�Ͱ/�Ͱ�� /�ְ ͱ!+��99��9013!275!"&5463!5./"!5 5�,/5� );;)��]]��X,��p����;)�);����,��������$T�+�Ͱ/���%/�ְͰ� +�ͱ&+� � $$9��#9�� "#$$9��9013!26='#!"&546;7'#"%'!'�,��Nz;)� );;)�vJd���a���������bI{�);;)�);zN� V�� ����� Z� 366 | /�Ͱ/�Ͱ/���/�ְ 367 | Ͱ 368 | �+�Ͱ�+�ͱ+�� 369 | $9�� 370 | $901$  $ 6& 462"�D���������V����r�rr��D�������_����V���rr�rL� .� +�Ͱ/�Ͱ 2�/�ְͲ 371 | +�@ +�+011463!2 !!35#  ��������dd  372 | �� � ���p�v2L� +� +�Ͱ/���/�ְͲ 373 | +�@ +�+011463!2!!! 35#  �,,'�C^dd  374 | �����,���2L .� +�Ͱ/���/�ְ 2�Ͳ 375 | +�@ +�+011463!2 ''35#  �1T��F��dd  376 | �����T��F��:2L� 377 | +� +�Ͱ/���/�ְͲ 378 | +�@ +�+011463!27'%'35#  �a�ap��ԕ�dd  379 | ���b�a����ԕ� 380 | 2L� 381 | .� +�Ͱ/���/�ְ2�Ͳ 382 | +�@ +�+011463!27'7 35#  �|�b��ԕ�cdd  383 | ��d�a���Ԕ����2�����+� /�ְͱ 384 | +01  ��%��O��`����w����8dL�M�/�Ͳ 385 | +�@ +�2� 386 | +�@ +�2�/�ְͰͰ�+� ͱ+�� 99901546;!3+!#"&35#��d���D�Xdd����,����pg�>�@�/�Ͳ 387 | +�@ +� 388 | +�@ +�2�/�ְͰͱ+�� 99901546;!3'!#"&%735#��d���x~���E{xa{�%�dd����,����x�p�{x`{�$���#�$/�ְͰͱ%+01546;!3'!#"&35#7'77'��d�g������Xddd������������,���g����pg��ժ����������l�/�Ͳ 389 | +�@ +�� Ͱ/�ͱ22�/�ְͲ 390 | +�@ +��Ͱ�+�Ͱ 2�+��9� �99�� 391 | 901546;!3!!#"&% ##53��d��p� �X,,���d����,�����p���,,�������[�/�Ͳ 392 | +�@ +�/�ͱ22�/�ְͰͰ�+�ͱ+��9�� 393 | 9�� 999�� 394 | 901546;!3'!#"&%333 53��d�����n�X�������d����,��n����p���,,�����L 53!265!5!54&#!"5!L�P��d��&d����f�� 395 | ��/�33�ͱ22�/� 33�ͱ 22�/�ְ 396 | Ͱ 397 | � +�Ͱ�+�ͱ+� 398 | �$9��$9��$9��9��99��901!!5335335!5 553;5#,��p�dddd�,��ddddd�*���������������� ���d��/:�+�0/�ְͰ� +�ͳ +�Ͱ/� Ͱ� 399 | +�ͱ1+0173737+"&5%;2654&d22d22d22d�X 400 | �$��%��dd��,dd��,dd�p��A�d5!�sRtEd�L38�+� 3�3Ͳ 222�(/�%333�'Ͱ2�4/�5+�(3� 99013!5"&5!#!5".546?5!2!4635!2d�K�K�"2�pK� K�p"28 &��v& 88 x88 &�v�& 88 �LL *.2�+�Ͱ/�Ͳ 401 | +�@ +�//�0+��$9013!2654&#!"!73%!!5!5!!%35!'!5%;),);;)��);d��i'�Wd��d,��,����'i�Wd����,);;)�);;)�D�b��d,��,����bb�d�F����� 3?6&/&.'7>/.>�fgї{��4v��ev�-��+���fg�=!�.�ve�v1���L@/�+� Ͱ(/�8��A/�B+� � /99�(�&)2@$901=46754>2#!"&?>=6 6=.#"m&RpR&m���>��d|�~\�ud?, 2�3/2 402 |  403 | 404 | 2��3��!"��"!�A1)!((! 405 | d�L�+���/�+0135!%!'57##5##5##5#dL���}ddd�d�dddddȖ�d��������pd�d�L $� 406 | +�3�/� 407 | ְͰ�+�ͱ+013!4&+"46;2346;2d,;)d);�;)d);d;)d);�);;)�p�);;)��);;)�D���L'+H� 408 | +�Ͱ/���,/�ְͰ�+� ͱ-+�� #(*$9�� &()$901463!2#!"&7!!!#535!3#353#5#3d�|�|��|�D|����|d,��������dd�dd,�|��|� |����,dd��ddd,d�p,�����L'+H� 409 | +�Ͱ/���,/�ְͰ�+� ͱ-+�� #(*$9�� &()$901463!2#!"&7!!3533##5#353#5#3d�|�|��|�D|����|ddddddd��dd�dd,�|��|� |���������� d,d�p,�����L#D� 410 | +�Ͱ/���$/�ְͰ�+� ͱ%+��$9��"$901463!2#!"&7!!!5#35!!5#35!d�|�|��|�D|����|d,�����,����,�|��|� |����d,d� d,d���LD� 411 | +�Ͱ/���/�ְͰ�+� ͱ+��$9��$901463!2#!"&7!!-d�|�|��|�D|����|d,d,��,�|��|� |������,�Ԗ����L'Z� 412 | +�Ͱ/�Ͱ#2�/�%3�Ͱ/���(/�ְͰ�+�Ͱ�+�!Ͱ!�$+�Ͱ�+� ͱ)+01463!2#!"&7!!!%3264&+;#"d�|�|��|�D|����|d��)69&�6)��&,�|��|� |������ dT�VV�T,���L#)H� 413 | +�Ͱ/���*/�ְͰ�+� ͱ++�� !$'$9�� "&($901463!2#!"&7!!!#535!3#35#33#d�|�|��|�D|����|d,�������ddcdd�,�|��|� |����,dd��ddd,�p����L!'L� 414 | +�Ͱ/���(/�ְͰ�+� ͱ)+��"%$9�� $&$901463!2#!"&7!!!#5#5335#33#d�|�|��|�D|����|d,�ded�ddcdd�,�|��|� |�����d�p��dd,�p����L!%+�� 415 | +�Ͱ/�")33�Ͱ#2�/�Ͱ/�&3�Ͱ'2�/���,/�ְͰ�+�2�!Ͱ!�+�ͳ+�Ͱ/�Ͱ�"+�%Ͱ%�*+�)Ͱ)�&Ͱ&/�)�+� ͱ-+��9��901463!2#!"&7!!5!##53553!5353#d�|�|��|�D|����|d,cdc�d,d�d,�|��|� |����d��dd��pdddd�d� ��� y� 416 | /�Ͱ/�Ͱ/�Ͱ/���/�ְ 417 | Ͱ 418 | �+�Ͱ�+�ͱ+�� 419 | $9�� $9�� 420 | $9��9�� $901$  $ 6& 57!!!!�D���������V����d,��,���D�������_����V����dd�d��  $�� 421 | /�Ͱ!/�3�"Ͱ/�Ͱ/���%/�ְ 422 | Ͱ 423 | �+� Ͱ2�  424 | +�@  +� �!+�2�$Ͱ2�$�+�ͱ&+� � 425 | $9�!�9�$� $9�"!� 426 | $9��999�� $901$  $ 6& !#5#3#353�D���������V����,dd����d�D�������_����V���dddddddd�����A r�/�Ͱ� 427 | ��Ͱ2�!/�ְͰ�+�Ͱ�+� ͱ"+��999�� 99� �99�� 428 | $9� 429 | � $901;!3264&#".#"333qO���x��x.,,�n��BU:������Pr,�ԭ�awי k��,���������A� /�ְͱ!+��99901; >54&#".#" ##qO��^y�x.,,�n��BU:,,���Pr��m�dx�awי k��,����,dLm7!!'5!33 33d�K^K��������Ԫ��ț--�,,M����y7�)327!'32654'>54&'.#"&#"y9/iJ8,K^K.6Ji 2;{Y�^t� Ji�5XJi��--2iJ f=Z�Yq�tiA���_<��� .� .�:������:�����(����d�����F���HF�d��������������d�������������j����d��d��d������������d��d���������d�����5�d������!���������������u������������������,�d������������������h���"����o����������d����d����F��:����.������J��������a���������d��P9�'d�dddd��������������������dy****f���������������0HP����6���,L�rd"D�L��� 0 ` � 430 | 431 | 432 | D 433 | � 434 | � V � � > � 435 |  436 | v 437 | �:`���L��&�`�� b�&�b�L��8��,��J|���0N����Z��2���F���  * F n � �!j!�"B"�#~#�$$�$�%%�%�%�%�&Z&�&�&�''j'�(8(d(�)6)�*n*�+h+�+�,D,�-�-�.f.�.�/:00�1&1~1�22�3`3�44�55f5�66\6�7 438 | 7`7�7�8P8�99X9�9�::^:�:�;,;t;�<@>H>�>�?0?�@@`@�A"A�A�B�B�C�C�D?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������glyph1uni000Duni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FEurouni25FCuni2601uni2709uni270FuniE001uniE002uniE003uniE005uniE006uniE007uniE008uniE009uniE010uniE011uniE012uniE013uniE014uniE015uniE016uniE017uniE018uniE019uniE020uniE021uniE022uniE023uniE024uniE025uniE026uniE027uniE028uniE029uniE030uniE031uniE032uniE033uniE034uniE035uniE036uniE037uniE038uniE039uniE040uniE041uniE042uniE043uniE044uniE045uniE046uniE047uniE048uniE049uniE050uniE051uniE052uniE053uniE054uniE055uniE056uniE057uniE058uniE059uniE060uniE062uniE063uniE064uniE065uniE066uniE067uniE068uniE069uniE070uniE071uniE072uniE073uniE074uniE075uniE076uniE077uniE078uniE079uniE080uniE081uniE082uniE083uniE084uniE085uniE086uniE087uniE088uniE089uniE090uniE091uniE092uniE093uniE094uniE095uniE096uniE097uniE101uniE102uniE103uniE104uniE105uniE106uniE107uniE108uniE109uniE110uniE111uniE112uniE113uniE114uniE115uniE116uniE117uniE118uniE119uniE120uniE121uniE122uniE123uniE124uniE125uniE126uniE127uniE128uniE129uniE130uniE131uniE132uniE133uniE134uniE135uniE136uniE137uniE138uniE139uniE140uniE141uniE142uniE143uniE144uniE145uniE146uniE148uniE149uniE150uniE151uniE152uniE153uniE154uniE155uniE156uniE157uniE158uniE159uniE160uniE161uniE162uniE163uniE164uniE165uniE166uniE167uniE168uniE169uniE170uniE171uniE172uniE173uniE174uniE175uniE176uniE177uniE178uniE179uniE180uniE181uniE182uniE183uniE184uniE185uniE186uniE187uniE188uniE189uniE190uniE191uniE192uniE193uniE194uniE195uniE197uniE198uniE199uniE200�����K�PX��Y�F+X!�YK�RX!��Y�+\XY�+R�X� 442 | -------------------------------------------------------------------------------- /resources/public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- 1 | wOFF[�@FFTM�jU��GDEF� OS/2�C`g�K�cmaprJ� �cvt (�fpgm$�eS�/�gasp�glyf�N �<3!headR�46bX�hheaS $ 2 | 2hmtxS<����locaTP��4�VNmaxpU� �nameV�|ԯ��postW�@��F�iprepZ�..��+webf[X�R��=��� �� .x�c`d``�b `b`�[@��1 3 | � 4 | x�c`fid��������t���! 5 | B3.a0b�����P�p?�G �� �I0����(00 a �x�͑?K�`��m�H��PD��wZ��]��E� �:�8 ��ݺv�"����is����E��C]|������%"�2�$c=���LZ�MhcHȷ� 6 | �ӭ�@�r�]���5U�ZRG=�hM�Ԗv��C�*���#4�BC�q��GJ��])q���hA}�k��%��@G:��AN��F�`�M�̓(��R<���'ڈ�f�YQ*�.eYW���_�|ŗ��.w��->�S>�C���+��7���-6d_�)_�-w�a�7S���h��(�x�]Q�N[A� 7 | ��� 9�����{� �Սbd;��i7r��q@�D 8 | گ���H�!H|B>!3k��4;;�sΙ3Kʑ�w�k�S�$����6�NH�����덌��Zlf��u�� �є;j�=o)M;�Z����� 9 | ����;�4���: �!�qK��ͺ����b00����.?�R��4�j˰��Ѽ�3��4@Skm���!��qK�˦�6����$���tUS�����]���`�*́��Vy &ҷ$�, 10 | �b��� 11 | 9�����@�HƼIJ;ㆵƑ���6O��<�Mmo��Y�w�K:�Ȇ�b;b)� DBFU�Ͻ,�R��@��������D<��u1Vz~���ˊ�V�΋Bwo�j��)��^ξ�� �Ac�����J��<,�4hCz7z���ꈫ�>�'ӿ�Z��xڽ� `�<��H�[I��dK�$K�)Œe����w�͝��B8�� �r� �B( 12 | -),�r��P�n�m�Š���B�,�XZ�m!��&����H������q$�%�{�{���= ˴1 � ��p���K�� ��}/[2�m�̱�ɔ89ޛf�1+D��Q��0����Q0�c�4I��^/ޖX|��6��-Y��ϙ�!�ՃF� ����g�Т%�g"7=^��u�F3����x�� ��]��}�EW�t:���基𪯦����1��Q~ {��My���ϔ ��Q+�-Ƕ"9F�ڿ����ſȟ�HL�Q���˜ŗ)��%3'�KV��Z���پ�d<&�I�_�_`X�ȸFH{x�z3$�d鿟z�=���C���8[����~�v�t{���^���0f&ǔ���BU�`Y2����̙�s80���M��J�+F��)y�;�&�R{}��b�M��;̗g��I�Ia��ń�D��z���A$8f�[o_~ ?k��un����rX�\��������=s��_]r��B{@>��]f�r��<���?�5�������0M�)Lف�3�\U�4�h�(�"UɅ�A1�vH�{Ǻܭr�b���S�ܯȢ��W���#��� ���y��K`w��k�s%[d� �ּ�t ��&�I=x���g_$��~W}������Wv^��� �Z�^����������&I�`Fa!O:��&��{��0�ፕ�NH���^}��]Ӯ���}���e����\;�s�ڲ��_8g��{ՖY���tcy͚�7] ����|�>{ c��zr�(񘉇+, �~{��n�&u�=��\ ERg���g�|��>��(v�T ��Dr�� O�u�,�T!���g��,���}���ˎsG�ʝ��Ž?|��?�����y��%�Ho_�"^c\"M�T�G�� �wR�/W٪([+���Gw18�����u��8�wd��gRL'���0e9����- (���)��ҚU�%�SlU�-�83JGNqU�����(��*Ӳ�8�Cr���#_�g����rV�](���?���� �W��JKu_k[�4<��*E��D{w�r�R�� 18 | �)��߯8�RsT]/���JA��Qr�s�rt�����^�:0~�_�x �RNǶ֏0�|��F'�0��dF���ו��d��2HI� �1���E�G?��J-�8���LϖN�|�$�OaL��d�L�'�p>\ �B���Ƿ��':�m8�^ܰ3�‰�0 ='㾜9������ �jJ���E9�C���EJ��l�!-Js����L��/�~k���,Pg�Sr!ә��ڲ�B�@R�Z���҂���*m�c�o�� ��kn�fKwS��\ �l�$�����}�����TA��������g�{���m�������E���y|��x/��KrJsU������c����0aD��hi��G���>8��]�4�<��=�}Q������f���|?�v#�ǿ�)(�2<������0�8�H*D�Ǿ�#�z:� [?��.d.����@N�u3��D0� IP}� ��A�-����5�VM� 19 | R���P �9%TU��rs՜�$h<�f� E@������! +�UU�%[N$��D��L�f����k�0�I�2ʬDv��w��Cv�� 20 | Z����cc��x�I,{���t�yN�Iq)��X=d^�������{�v_���0gO�j��YEu��9Ԭ�C�[=��Us��+���� ��؎k�W\e�!�"q��Q]���@h��~.������P- Ԙ��SW�y�e����B��d`�ds���� �6�`��T�� 21 | ���Y�M`�w�����[����l=�񟝶��w_�}�uH*��(��s2s6�L���,�(}@���z ��Wi)��U@� �PC��K�}N)׏���.2`X�V˗P`���>.���g�ܥΓ��=���'dl�3پ�D�+� 23 | }���Ͱ� )$SB* ��5:I�(Ȃ6 24 | �J^c,4��:�܊��[ 25 | �=�d[�)�4�3��M����;ɗ �/�̭��{�Q��2�:�^����Fr���6�ϞmO{� �H����p?kr'w 26 | }��Ճ_n�Ns���Ȝ���;�ə�3d�����m�֟�m�B�)~������k���Ź� 27 | ����,,�L�#ۗu�� 28 | *&*�.8��P����!\uZ]��ì҆�i9�F% ��By�L-�Uꁭ��[U��ro^�끋z]�g�PD�u��"R_I������^�nz���B<?}�x,N���[VG��e�}lN�@���3M��$kq���{Y��q�d����v����X�G�k�����5� ]L�L�u�{��͇PW7Q=�L_2�@�:Y�$^s����-� ������mۋr�]���m�FdbL��N�\��X- �h���f�I�!"):��Wd�a=�����']~�ա����87�2�gx�)�)����� ��Ϊ�E![��xY�q���S� �è�J^@p�\$�prüG��䵃��p̬�(Î�w��˔�N�� Oy𔑈6]�[[x���[Zݺ�����=�M���=����}߇d��O����{��g�O|���T �Aj+�=�0/��UZ���b �3CN�x fda�c����$��9O��ɳ?����<;�V�m=o6=�+�@9����5�����=1e+�S�� $;.*˼���M�ہ�*+K��5���� _�W � ����E�����S}�~��ԏ"�x�"�3�+���2f��5H���X����B 29 | �d��$�(�-����{��w�T7h�p�"��� _����5���LP_Q{��l��K��$G�=G�����7���}��Y���S+vUv! 30 | '��eէ>��*����y6�l��΢M 31 | ,������e3b|��ҋ��EE�W�2��b�q"&F��z��Y�k��Oēˏ�ub�T��p�L��} 32 | �O�.M�G\T�g%oG�o3�r}SB��)����H �lÉ��!�A�'����I8'���[ә��U ��alŌ8CN���*Y4^ 33 | ����{�r��,�$��"�Y[� � 40 | �ã�s�Db���V���\@ˈhА{(,g 41 | �_-�l�9j$w\�ެ�W�'n-\r��U���}a�i�T��[eS�?��T��g��$3��`�-f��qxi�0F��r{�\��L9չD3Pʉ�x,�)�F8�< h� `/Z-�.D� 42 | 4ZJ�0�F�%��!�;fG�&WU���*���Ju��ʖ��ϒ��;���Ļ$\�|g��������UZ��*˫���y(�N����`e�J�@�LT} X��ڧc��k 43 | {�ө����لݳ�_��084k6%~OT���ݒ�Gљ� G/�"��`TC����� ���]́�$(B�E��MF�E�F�,4�Qxvi�棇���^��K�l�el 44 | �!�w����%zQ�[E�md� 45 | ���x 46 | h��s4?��>�Sד͚�S��8��jI 47 | e���\[i�P�0�l�eQ�E}L+��K��k���WQH�\����&��4���4!�<)���+ 48 | |J��?q��]��"� 49 | ����Ž}�_9��~N��M�t�O� 6q ^��sJ�Zfm(݉ϔZu-4��L�a�h>�JX��`9����ɓ�ۇ[=���V�:��k�6w�hToU�'�Y��at��Cp 55 | .VQX�0���C"0+�DF�����~�C�]����`�&G��Tހ�K�0�$�B��(�m�AGe;���5ߖ�1� 56 | �۹�啯�r� 57 | g>��%��}��k����)�'� 58 | g�Lg˝�e�껗V6�>����KWn��K�R�{��#Ah�Ā��(��t����!H売�s�蓥��+LO[����u6:#0n�L��/��p'Oo�����⩄�v�_{�� ��s�_� s`Sn��2k��c��Q�w�[�#�TPj.Z�0[@Q_C�O9� r�4��_�kk���s�d�Z2P�-Ҥ�$l����`�丘�я�K�H���?u���u��q�ȬO�D�L��-��:~Kh~��Cs:͡YM� .���,b�5�1�+AL܄:B��2-K� 63 | ����h���� 9^������ �ǿ��e����OA�c��f�������j��`f0�`eD�=I���@��445� �)J�`�^�MH�8���C�g�s�90�p[=8>�U[ 64 | j`�Vm�o�����"5��l�Wfʳ�?kqF�uH�]��N�)�q�гG��h���ǵ��W*�?�:��� 65 | ���u�½M�:�4s�Z�b��兵���| ���u�/�\&�����aߏtuE�ܑ.�0�=�t ������5�s({�>�a���ri��s���=��@$�+�X����] ]M��ퟚ87�R�#Fݺ&t��=����^w��Wұ�$�=�h��e�6wq����� 66 | ����g$����#<� �v�G��� ���!��{�®倠3֤��$ ��GXC�����k*&^����Ty���{���u���څ ����;�+:g�x������.��[q�W����{d��t�ş�E�܏:�x|Mb�G׼Zt��]�hD���&� b�€�����FюCˉ�����Ger�̬~��`���78�y ���F��4[��fSɾ��A��s�W�����-��X����/��M����|i��5�O/�]g~�k_yi��\}�U��{���x�7���(x�ѷ�m���%����K�g�f& 67 | k�:�Dj8��K�ӢKH 68 | _�Ԇ԰a8F�Q�H b�P��B���%O�.H�6^&(:Ic�D��̀b���(�$�m�4�����;��}���y�ru��e�I�����w��o��h�+o����w޹0K� ���.[�<Ͻ�R3�f����e�TU1k�٥� ��^E�"S����P+�`�����/�F�L֧�l���k��a.B$3�b c`o]s�dd��Y����_0{��~ 69 | �-�k=��H4��1�S2� ��uȹ��㵗���7�x��k�q�S��� ��/0�* 70 | �eD�����ƫ�m^'-3�")��kh��>2����-ܡ��G�I.�P�[�:�C�=�?�Z~���$3s����Q���V��=�pY��D uJ./LB#�i>� ��0Y��ب�H�F�I>�$f�g�� 71 | 7�=� 72 | �|O} 73 | �+�i��e����/Ճ/W�3��q������E�9���h �H�d-�A�OS�*�zrX�э��媋��O�V�rk�%}YB?�݉Y~z��5S I��2~'�F4{`��Ԁ~C��x�z̅2��œ��og{�7�$�����B�.-���(_V�"w ]/# S���69��r���]����{�%���¸+Js6~i.� 74 | �C:��p�� 75 | C#��7",��0�;�C~ "�*��)cDc �s5��(4��!��Yy<�3�����w��s�&'��� ��k|Gauh|�Y֪�w��ݫ��N�>��A��ۨN��uThPT ;O�ͣd���/{�H] 'N�h�-F������b�m�[�?���f׍)&a qs}�3~%%Z3 3)Y�� ٨>�vP"cʋ�ұ�|���4Y�1�4�4����GK�j��̇���3��B�4Y�{����9�Je\�s{��g��=�����;���CN��'��b&q"L����q�Dd7M��U1׈w��R��}�OE�ň'&���Ȩx� 80 | �`+p�1�K�����pZ�dʎ@4G��ʶx7�LC�\64���S- ��7zPsb_,����sÞ"��L� �+D,��ڵ8^>7L 81 | �fe@�A)�O�T�q8�W��s� �TN�^��W�lr����O�|������+���R ������O��� 82 | �+��έ��7��KM�߰�b��~4?E����_��"�9_�� Xϛ�%~�3Es�����q4/��q 83 | Y'J�Zx�m���8}�W 84 | W1S�U'���C��p| �9��v���N��g��w���T�s����?_/�${@����r�^ 85 | ���av4'�N&����]��)P�ӋW>�au��'?��owE�- 8����On�X�W>��)�L���a8V�nJ����1�d��ᱽl��D��>��z�I��u_֠���}���v��,ҭ��C���`�QO2P/�@s��*�P�74�U# ?$/��!��yl/���|���k�C�� �دn�z���t�3k�S�ɿR� 86 | ����F��q��� ^u���+�����&�԰`[�\�(k��M����Ȕ���'���K��7��N�����I�7��o&��ΌG`~/����N�{ �Ql]�Wb$�����7��N���8�nޮ�����R;�׶cm 87 | ͩ|���qf9��Z�J��C�Zfit 88 | �5�/���J���Ƶ,�8�i3.W!��?�oA��|����3x��ǒH�ߎ��v��3o(�%ix{ d��N�$��Lcza��e�)��=9 ��ԆŸ�vf襝���ѽ�j��ghaw1'Eir ��כ���w�T�M�UN� ^���zbXB�m 89 | a����R±1�P�%��>�Gz?J 90 | Y�,{is��\��~�W�y�� 91 | �7˵hb�X=��R��Q��ou��%��Bh׀��e�����-/����#}�'�YZ;���ˁ��)��^�MR����aC��:�4�|���0&��1-V� �4�8iz:s��_����t-��e�����W9�q�f��y7����M�7*ƿ24��u����o:{����\w�?��ß�^�3=��U#{�3Ϻiu�k6��+ZZ^�!ΙK?��fpQR��[U�J�0��58�gFM�q{eX }�a��.&�_�cS>ٗJ��l4�0��#n�K 92 | �y�"#3��9[��kEC�g1;9������l�=˙|�|Rj�ӽ|�!g�8Q���x!VWН�! �ޙ�[#��7vK���Px�Ԋ����.���)���7z��f_2�)���5X!���3Eλ��U���ަ69��-�k[җ`�������ef2�� .O�Ue��N� � R 93 | ��B BT�Ys hjo���@c6l�Y���!U�@�4�Ҋ���� ��046�[~Ŗ/�~q���5���fw���^yJ�+)�f�{��Q����s��%/���Ҷn����� 94 | �׵a6��}ˆ�3�w��N�,L̝Xt 95 | ���Y��/�ohm�i 96 | �`� 97 | � 98 | '1_c�Κ%:��lP�/�����_3R�Eq���;����͡ؿ�8]�N��s����{��������l˝-wƍ`��+�~%د��+�~���v�)��=��t%jF�p:H[�ם�M�d�������`PH�z���-�<��.����lS����~����u�+��c���Lf�3�����w�,o[��w�����_���sѓԭ����A}��&��_ڔ08M��6�t�ض�"/���1�3g���%fh9z���|���� ����$*w�aVc�(rsGFIP9�Î8e͒��͝儯V�Z�N�%`���h��ð�KP�|������ 99 | ��"�dH\0b���h0&�>'ٴ~�z�����Š��7������۽=2��^�~X}Z�GG���k��M��i�Y^Ѽl�Y���F���p5��{�'ua(�jR�9eV1����<��i�0��>F���?�� 9��_�va��.)T��4�ľ_�0$[TKa������������¸@�>��i~Y�Фm/�eǍ3Bk|��[�}��M�(\`�9p��z@/)p��QR��}X �������O�ϩO����!<�J�]�2zP_B�?����y�v��_�]R�v�!���e�#b<��e��=����������#70Z��ps7��)G���ղ��j�1�O�bLG��N�F��R��qp���� aKK�rU\�ˑ(���l��l��1?֖զ:I�m�25�U���N�3�=�4�o��iL�����2� /��Bג�u����'��o6��"�G-�j<���k�(q���O�'�Q�/�Ԑ����Z���bg�-Q2P��ViYVS�w�VP9B��E��Vh�#�>�'��4-sW�`��a�&����"OZ��O��zWQK��Cod 106 | �;_�[k��,����su� � 107 | `�вk �����ei�t�È~� %0L;�Hi^�rÆ�q����K���r3�<7��X�� 108 | aY� ����3��bs�U�_��Iȼ�0 ����GXA�E�}�� ��%G�=SQߵYI�DNV˭���gh^ �,���u6�W�hFk$�2՟-�Ӝ�����f��C�9���G��� 109 | ���T�,�F��TА3���4�5y�W�t^��mt{�����3��ަ��.^����2c�;H�M�7�:�"r�z��_���� J�V�q���6���$w��+��[��P��S��A�AԷh�)�K��� ��;% ���eov�����?����������>z����,����\����5���EĘ4�4��vc�X��k��֪�w�`D ,m-���dAGg��$D%.���eqh��H:�~h(�~�y(�m���p������Gݎm�>\\�'�#�Ů����Nnk~�_� �r����� 110 | ���ڰ%:���r3�j�z{�6�US��glva���a�a��iM��ڛh��+@԰L�Ew��օ.p�^�ݭtª�F�A=I9� ��٣O�z�X�M"0S�<�0�> �"����7�Q ��w2� 111 | ȓ�鼄��h��5���kt���%�4Cۋh�{h�|-�9.��Zrm7ͨ��Er݀�~���I�¦V@9����O���H��=3:BhIV����*A�z�2G���,����ML�b��A.tXE����^���՛� MN�I�1��569�r�]j�Xy3'��!�˗�%=E}�ۖ�r�����=��ˆ�;���Uӫ/�d��8��Z�f�S��������������Up�8���2�8��8̓'�43t}�E�7=����i�C]6tȺ�}��V��L��zM�6`A�D2�����=\����$XP��=�%��~��=�z�C,��H���%]_}`r��7]��` 120 | �4��l���P�b�%7�u�-�دU��KK�aWI 121 | �� �<@tm�+�I=�D�zT}��W^�B�a�Fb�:Z��{<�NDc���V�A�,��_޼>)�r���R�i$��#6���_����\G��>sU8�i�c�hjI��.��y�����2�5mm�����"�}F�)�͖��L���Y��J���� ��CNi��<��!�,��-��]ͭ�)�����~ �G 126 | c2�>� 127 | K:i:3��Ǹ���Zf�;�Qv��k�V�L 4 =���+`U�����QW�}M߫`H��/8��Џch'ٷ�k�W�^~/�w���>�,a~�wlwV�S�(����,��Ӿ��r�Y�I��Z� 128 | )�$��Qk'v�Hj��pUvѸɂ�‚٦N��Z�O�~X�J0��8h[��0H�R� �?0�3;=|F�: 129 | k=�l��g_G��0n�iI8J\,ep���u�����>�O�-l�zʹ�ZA��'� tq$��"�«��'�l�\G�ڎ� v΂ ��#p���O�>�6��ﻢ-�o����Ç;��}��\n��oC�d�o�,� 130 | �RU��@����U�W�o`J)�9�ٯ����`SRHr��9jDa��eqU�+���0�,�7����%�~ 6� ��jf��7P���@’���y3�Gg���Drg��l:�kN�W��k��)�t���wa�T��9�5����{�6�䳶��ӎ� sY�����sWm:�m�ʐC���V����� ���:����+���*�KnM�/�̌�jm��� 131 | y^�}�����#F$��ƺϵF ~�1ͷ����ǯ��g����ԏ#d ����X��5`���fl}.8�|.D5h~ uGa�vTL�)X�����d0m�Y�\cNJ'㊗n����������_� �:/�72���Có|gl\y�m��� 132 | �fl�<�`���ٗn��ϦO�h����,ϸy�I��_tj�i�IþS/=�R�����7�z��h���5�O����@`� mz��>��`�'@��.� &D/����1�3FH���������=˝F��l$��~&�Fv��q�,�#d�Y�v��W�=��l����Y���Ÿ߲�om{r��pddD��,M�W�ށ�A%�y�4��V��zd�Z��wkU��5���� 133 | ʦ����P����U\��Q�^�_<��'�\���V�h����ڡ��E�[R6��ұ� ���8����K�?��`�1��G�do�/+�W@Ł��&�� TZk��tt8H�hU�x�'d�O�v�N�-'~���R��� GR����0=������c�����r7O=.�I�NHw���cn���9��e��@f]�.�Y��30 Nod�n�J��� :��澩Z��M�0���W�DŌ��n�m�W�o0��� �Wܘ1��p�q�4���|��)��q 134 | ����F�Ģw�7����M_I��u��6=�,]�}y19w�`'���oѬ���B[yw�Kk�{]b��Y�����+Ii�9N���L������-�=]3/Y�خV��k����?a]�L\׶� 135 | ���Q��m�t�:k~@� ����? 136 | ����*v�(aMl���ղ�>���i*R�i��l�O����β@�_�U�;5�Rҏ�o��#�bN�9k���'�;������� 137 | �KF,u 138 | j��� hI�J��>BCK(���>��I�紌}ђ4C&5l���c~���e�7>v�����5�����y�$I�3�gK�/D� fۗ�:�eSke�(YD�h�fke�{ 139 | ���g��/_ݻ�9$u�7�����C}V������ڬw���*Z 140 | w���5����Dj�?ņ�D�(%+����T4.�Y|gi �e�FiI 141 | ���݂�=V�F� �~��Ƙ!�m�hb��Zbx`o;͓���r�FGC2�@�>K8�,m�����0��.�-�#_,���Ԅ��]����}n�d��r�M�i�����DX��5�ZH�.*"�f�Gi�i �h��8Qk�T�}��1��"��9�x:��[� !h�W<��8:� 142 | �*� 4q�:��G�, �(��|�ލ��ݴ���{`�X��`E��>;�S�8X4D���D|�qHP�5M5�@[�iġH��?ʕ�DR��� p&b�����jD\�T��;���$`Rl;I���,f|��m5�8�ZK��/X핓j�փ�ֶ���@tڶ�����kx�^0 |,t���^����I\�ux+�z3��[��՝w���6O-�����Ԃ���cX�����=�E���Q�\����T+wh���j��Ћ9 ��ThPd� h�%Sj��f�x%�!�t��FX����&Y!K�}�#�iu�����#G��~�kxc��F�x�&,�C4��#��?<�" ���w�F9��6�a%��hL����l �f����K� �� S_���+�Z�cPd��D�@��Z��"� 147 | ���cB�'_._�Z{�[�Ex����0>lB!.��^Aw��*Ō���%��F�1�׬%C�<��w�L€-A˸�����f�s�2�������L2I�6�f��fe��a6���ɗYV0������b+x�E^�jr�� <�Hx��i3��?W��S�˔n~�L���fšl,5 148 | Ҽ���Զj����D�%*�Z�Q�B>����c�Y��y�)�o&��"�Î�g<��LT�1�����-^`�whP@�lCM@�ieV�p:�� 149 | ��U��$Q���9 iiE��8V-c5�����ѠH�m�"딠{ݴ��B 150 | ��j@�Mˮ�UT?�eQ��wȟ�������'4�8{������e��up2�r!�%����ٯn<�&a��?�j?������xdA.��P�<�U��7rN1�7$�|���~���� ���I��΃����V>��qN+�ǚ3��Ԅ���잱 152 | �!�u��R�&{��c�k2�Hq�*̥ �FH#H|�#[6��<왲�����1R��!ZJ�4���'k^!M��sdZ1�:n,�x��#��w�؜]�)V,������<� 諛C���ô������bP?�B'e�sx��Bm�����D`�*����u�$�~�Dˣ�q��w�٦~!�{�5d��j�7����w͍` Nn�^m垨���࠰�L�>+���DCg�*B��i�i(���8� ���N��O�X�?��!������M_�� �Iݔv�5h破s�Ict���r�o���� 153 | 3��@:]����ǖ�N� �(�`i9��%$�v�2���@NJfM)�hV�F�ͪ�����+ 154 | 4;�z� 155 | #�>�Ra���i���x�L��x%$b�G �B�V[�C�HNFA(-�o&�(T��Ph�_=؈�%:6:����g��2�v@��\��]�+z�:2z��'��kŘ�� Ɩ΃�{F�����7c��� 氽IIn��,Y�9|\d��ҩ#�Z�Z�+ 156 | �>� 157 | S"Y-hU4�Շ� 158 | x���c@n�$j��OP9J� �3!a�t[�n�z�`ֿ�_�ѣz�h� ���iD�r�L�{�^����Z]6-�fjNيK�>�K6a�g�՘��n�RGa�&E���ڛP�g��b��xy�I��lV�O��F�V �n 159 | ����k`j���D{`�s1���� 160 | ڏoe�#^)΍4�6^��0C�F#m9%W-�Vڻm���9���)|V�x�k&�[hS�h!�����-��I~�>4p�Kn�9��(�8@�Q�ɛ 161 | �͋�-�X�\;2ݖ$w�[���Ӊ�,9�k|�N���rg������l'?�̴���f�Lٯk 162 | � ���R��@������,h�Z�8�J*�د�n�Ge)褢$���,s�N��4Z�t�uE��b�� 0S�c�PiWk�؜���b����}v�86�[�qq1.�!�!|F�;��a.7��a�'0MR�a���N�"��{�;���_�<" 163 | ��xz][v;w�ht|���~��}�w<��{���aw�q����{l�����(><1�׷��_ �㚡y{'eJ#�/Mh_f`������Y�h��P ��a.��+��Q4+��I���k�%/v��?��c�I$���%Wn^��B.vH(d������2��n�ŭ�o;�3����Ao�A2Y����M�KV�#��vx�R���1���)��b 164 | ���.E�ڢVK}�bp�';�F�D4�=]%��=}�2}z�G�7n���к�Wv�O�����s���L;ڴ�vo�J;�!�M��Ti ���z�Z��\}����B�~����p�4��&&>KJ漢��jl��Op�힮�����}��>�%�֡u#����d[�V�9����<�<�i]� 165 | 9t(�:�}蕭�����U���(�c/*����3r�Pm���{5!F��E͡��N�O�]246 �����bT�?��:F�|�@[�3�֩�$tl�y��P�}�`s�cFF��'�\�h��D (�~**&�4��T؛�a���K>���qa7��nr\�u);T��]xx׮�<#S�9uR/� ųآ1A���������Y�*�.o%��6�i�:.������$<.���������v��k߾=y�i�q���׮ݾ[fM�qZ�:y:��Bg����&̇X����qۉ� ���у���p�3� �hUO)f�lڦbӮc�W 166 | 6�#�D���`S��5��ű�U�|����>2�4��� ��� ��Nf�8>�L)�ZU��5��� S��I�0du����f� ��Ɛc�~���^U�]4)+����)5aQh�^��8>ydk=N$��H���K�s���+���)�B�H*$iirߙ�Vh����h�R�Cx�c㺇��R^�_���ч�)���ɻ�&� �VY�]�W��ԯ���6����N���C�Dλи�w�;�A����:�-��àf���M����p �ϖ[h�NK,�:��@�Q�,>�TwĶxiJuVb�.>Xv����)AbQ� a�9ʲ?�V��@��,�:Q�'�B������� ��F��xb�| 167 | ���~�у��I�� 168 | �� 7�]V옩bҪ�� 169 | f6��j����4>kE��_)��� ���f��`|t���hO]���NI{2 G%3�6��@�0$�� D�`;.[���'��&����%_�%;��̠7y���O�c�տx `slR��ـ��� u���G�f1h�V3�䬉`h���|�|��k'��9/(_U/~�x��S �5�蹺�}�� ��FI�`�P�CÌ� f����������ݻ��`���V�z-�N�� 170 | k���d�L�e "�7y�8�t |f�]۟�/X4� ��[t�9;p�)�/�y�#�ü��@~���-� �����d�,�GZ�:���S.{�J�ɳ0�.��x�c`d```dp\��SO<��Wy� 171 | @��<�z0���9�wY%�\&�(h3 �x�c`d``���&��]f��A��;Kx�c������� ���L= ��q�100܄��@> ���� 9���_@��� f�� 5���!j��`�aX���j�z��4#�f�1����Y���� ��yI�!�+�VĮ��l�~��(��z��P� T;u�v���43 �' ��A� g �����{��c P�<�n@� 172 | H !‡Q��^@,���*��L@� 173 | gE� ,G �0���  � '��G(Ƅ�&�dAg@)` ��sP!H��O�?�*R�|x�c``Ђ�4�%� ��cc �*�s���̘f0�azǬ����5���M�ͅ����S8 174 | 88�pqq�pup�����ǎg� o�*>+��.�;�7|:� � � NJ�%,&�'�#�$�KTMt�X��-q�6�M�$u$gH��򒪑�&uMꉴ�����t��6��_d�d�d�ȼ�5�=$' �%�F�M~���G 175 | l 176 | Z 177 | n 178 | y 179 | >)f)QrR:�\��NEDe��3U��9��TߩE�u��S{�Χ��~N�B#Ec�����<�7�ڛ�����ݧ�L/Mo��/}+ �m�j�u���8�v'O0�2Yd�b�f��L�,�l�9�y���?[,%,#,�Y^�����j��f�c]b}���&�掭�� 180 | ;;�=v�� 181 | �g909$8lqTr�p�����ù��K��<Qˆ���xڭR�N�@�4�I8���� 182 | "��x��FѣT(�B��T��g��ŃG�@�ç�`�]$��ivw��|��S���/��h��+�zX���1��#�ó�Q���n��“�jO 183 | O!��+#�Px���3����g 184 | �"��=�!�߇ah�n�]w,�囖��&<���5ب#��G�4�Ha��·vp��]�;Ă߀��\>Ɛ�/wU�U�Ηdn���(��m�z��W����C}�=G�۸aE��bgRz)�����W��SiyD����Sy��=�������?u2X��t�X�\@�� 185 | j 186 | N�Uqr���X�#���X��-����P>&�]~�6};ʵϪ@���B� 2�W����3���2�,2��c� �Ɉ�x�m�UהeF�ـ`��ݭs����������(*vwwwwawwǁ?Ÿ�������^3kf?��5k:c:��� :E���?;�0�3�3�3�q,�x&�(��8K�$��R,�2,���X�X��X�UX��X�5X��X�uX��X� 187 | ؐ�ؘMؔ�؜-ؒ�� 188 | z�T�4��ٚmؖ�؞ؑ����2`��م]ٍ�ك=ً�ه}ُ�9�9��9�C9��9�#9��9�c9��9�9�iLg's 189 | 39�Y�f�1��9�y��Y��|��\��|.�B.�b.�R.�r��J��j��Z��zn�Fn�fn�Vn�v��N��n��^��~�A�a�Q�q��I��i��Y��y^�E^�e^�U^c��o�o������� ����_�_� 190 | ����?�?� ������i3�ϙ� �f��v�S�;��� �p�n�-�ʭ��mݾ;y���p��q�ysg���F��n�a�_j��x���x���<|��x�k'vb'�k/�b/�b��W�+�� 191 | {���^a��W���������������������+��J{���^i��W�+��*{���^e��W٫�U�*{���^m��S۩��vj;���Nc��^���^c����k�5�{���^k����k��Z{���^�^�^�^�^�^�^�^؋���>��­����{�;�G��G����G����G����G����G����G����G����G����G����G��}t�G��}t�G��}tݧ����?�����?�����?�����?�����?�����?�����?�����?�����?�����; �=��]3@�����K�PX��Y�F+X!�YK�RX!��Y�+\XY�+R�X� 192 | -------------------------------------------------------------------------------- /resources/public/md/docs.md: -------------------------------------------------------------------------------- 1 | 2 | ### Managing Your Middleware 3 | 4 | Request middleware functions are located under the `hipstr.middleware` namespace. 5 | A request logging helper called `log-request` has already been defined for you there. 6 | 7 | This namespace also defines two vectors for organizing the middleware called `development-middleware` and `production-middleware`. 8 | Any middleware that you only wish to run in development mode, such as `log-request`, should be added to the first vector. 9 | 10 | ### Here are some links to get started 11 | 12 | 1. [HTML templating](http://www.luminusweb.net/docs/html_templating.md) 13 | 2. [Accessing the database](http://www.luminusweb.net/docs/database.md) 14 | 3. [Serving static resources](http://www.luminusweb.net/docs/static_resources.md) 15 | 4. [Setting response types](http://www.luminusweb.net/docs/responses.md) 16 | 5. [Defining routes](http://www.luminusweb.net/docs/routes.md) 17 | 6. [Adding middleware](http://www.luminusweb.net/docs/middleware.md) 18 | 7. [Sessions and cookies](http://www.luminusweb.net/docs/sessions_cookies.md) 19 | 8. [Security](http://www.luminusweb.net/docs/security.md) 20 | 9. [Deploying the application](http://www.luminusweb.net/docs/deployment.md) 21 | -------------------------------------------------------------------------------- /resources/templates/about.html: -------------------------------------------------------------------------------- 1 | {% extends "templates/base.html" %} 2 | {% block content %} 3 |

this is the story of hipstr... work in progress

4 | {% endblock %} 5 | -------------------------------------------------------------------------------- /resources/templates/albums/add-album.html: -------------------------------------------------------------------------------- 1 | {% if form.error %} 2 |

{{form.error}}

3 | {% endif %} 4 |
5 |
6 | 7 |
    8 | {% for e in form.validation-errors.artist_name %} 9 |
  • {{e}}
  • 10 | {% endfor %} 11 |
12 | 13 |
14 |
15 | 16 |
    17 | {% for e in form.validation-errors.album_name %} 18 |
  • {{e}}
  • 19 | {% endfor %} 20 |
21 | 22 |
23 |
24 | 25 |
    26 | {% for e in form.validation-errors.release_date %} 27 |
  • {{e}}
  • 28 | {% endfor %} 29 |
30 | 31 |

yyyy-mm-dd

32 |
33 |
34 | 35 |
36 |
37 | -------------------------------------------------------------------------------- /resources/templates/albums/artist-albums.html: -------------------------------------------------------------------------------- 1 | {% extends "templates/base.html" %} 2 | {% block content %} 3 |

{{artist}}

4 |
    5 | {% for a in albums %} 6 |
  1. 7 | 9 |
    {{a.album_name}}
    10 |
    Released {{a.release_date}}
    11 |
  2. 12 | {% endfor %} 13 |
14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /resources/templates/albums/recently-added.html: -------------------------------------------------------------------------------- 1 | {% extends "templates/base.html" %} 2 | {% block content %} 3 |

Recently Added

4 |
5 |
    6 | {% for a in albums %} 7 |
  1. 8 | 10 |
    {{a.album_name}}
    11 |
    {{a.release_date}}
    12 |
  2. 13 | {% endfor %} 14 |
15 |
16 |
17 | {% with form=form %} 18 | {% include "templates/albums/add-album.html" %} 19 | {% endwith %} 20 |
21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /resources/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Welcome to hipstr 6 | 7 | 8 | 9 | 29 | 30 |
31 | {% block content %} 32 | {% endblock %} 33 |
34 | 35 | 36 | 37 | {% style "/css/screen.css" %} 38 | 39 | 40 | 41 | 42 | 45 | {% block page-scripts %} 46 | {% endblock %} 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /resources/templates/home.html: -------------------------------------------------------------------------------- 1 | {% extends "templates/base.html" %} 2 | {% block content %} 3 |
4 |

Welcome to hipstr

5 |

Obscurely builing your vinyl cred since, like, now.

6 |

Sign Up 7 | or 8 | Login

9 |
10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /resources/templates/login.html: -------------------------------------------------------------------------------- 1 | {% extends "templates/base.html" %} 2 | {% block content %} 3 |

Login. That last session was so lame.

4 |
5 |
6 | {% if invalid-credentials? %} 7 |

The provided username and/or 8 | password are incorrect.

9 | {% endif %} 10 |
11 |
12 | 13 | 16 |
17 |
18 | 19 | 21 |
22 |
23 |
24 |
25 | 27 | Remember me on this computer 28 |
29 | 31 |
32 |
33 |
34 | {% endblock %} 35 | -------------------------------------------------------------------------------- /resources/templates/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "templates/base.html" %} 2 | {% block content %} 3 |

Sign Up Nobody will ever know.

4 | 5 |
6 |
7 |
8 |
9 | 10 |
    11 | {% for e in errors.username %} 12 |
  • {{e}}
  • 13 | {% endfor %} 14 |
15 | 16 |
17 |
18 | 19 |
    20 | {% for e in errors.email %} 21 |
  • {{e}}
  • 22 | {% endfor %} 23 |
24 | 25 |
26 |
27 | 28 |
    29 | {% for e in errors.password %} 30 |
  • {{e}}
  • 31 | {% endfor %} 32 |
33 | 34 |
35 | 36 |
37 |
38 |
39 | {% endblock %} 40 | -------------------------------------------------------------------------------- /src/hipstr/cookies.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.cookies 2 | (:require [noir.cookies :as c])) 3 | 4 | (defn remember-me 5 | "Gets the username in the remember-me cookie." 6 | ([] 7 | (c/get :remember-me)) 8 | ([username] 9 | "Sets a remember-me cookie to the user's browser with the 10 | user's username." 11 | (if username 12 | (c/put! :remember-me {:value username :path "/" :max-age (* 60 60 24 365)}) 13 | (c/put! :remember-me {:value "" :path "/" :max-age -1})))) 14 | -------------------------------------------------------------------------------- /src/hipstr/handler.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.handler 2 | (:require [compojure.core :refer [defroutes]] 3 | [hipstr.models.connection :refer [db-spec]] 4 | [hipstr.routes.access :as access] 5 | [hipstr.routes.albums :refer [album-routes]] 6 | [hipstr.routes.home :refer [home-routes]] 7 | [hipstr.routes.test-routes :refer [test-routes]] 8 | [hipstr.middleware :refer [load-middleware]] 9 | [hipstr.session-manager :as session-manager] 10 | [migratus.core :as migratus] 11 | [noir.response :refer [redirect]] 12 | [noir.util.middleware :refer [app-handler]] 13 | [ring.middleware.defaults :refer [site-defaults]] 14 | [compojure.route :as route] 15 | [taoensso.timbre :as timbre] 16 | [taoensso.timbre.appenders.rolling :as rolling] 17 | [selmer.parser :as parser] 18 | [environ.core :refer [env]] 19 | [cronj.core :as cronj])) 20 | 21 | (def migratus-config 22 | {:store :database 23 | :migration-dir "migrations" 24 | :migration-table-name "_migrations" 25 | :db db-spec}) 26 | 27 | (defroutes base-routes 28 | (route/resources "/") 29 | (route/not-found "Not Found")) 30 | 31 | (defn migrate-db [] 32 | (timbre/info "checking migrations") 33 | (try 34 | (migratus/migrate migratus-config) 35 | (catch Exception e 36 | (timbre/error e))) 37 | (timbre/info "finished migrations")) 38 | 39 | (defn init 40 | "init will be called once when 41 | app is deployed as a servlet on 42 | an app server such as Tomcat 43 | put any initialization code here" 44 | [] 45 | (timbre/set-config! 46 | [:appenders :rolling] 47 | (rolling/make-rolling-appender {:min-level :info})) 48 | 49 | (timbre/set-config! 50 | [:shared-appender-config :rolling :path] "logs/hipstr.log") 51 | 52 | (if (env :dev) (parser/cache-off!)) 53 | ;;start the expired session cleanup job 54 | (migrate-db) 55 | (cronj/start! session-manager/cleanup-job) 56 | (timbre/info "\n-=[ hipstr started successfully" 57 | (when (env :dev) "using the development profile") "]=-")) 58 | 59 | (defn destroy 60 | "destroy will be called when your application 61 | shuts down, put any clean up code here" 62 | [] 63 | (timbre/info "hipstr is shutting down...") 64 | (cronj/shutdown! session-manager/cleanup-job) 65 | (timbre/info "shutdown complete!")) 66 | 67 | ;; timeout sessions after 30 minutes 68 | (def session-defaults 69 | {:timeout (* 60 30) 70 | :timeout-response (redirect "/")}) 71 | 72 | (defn- mk-defaults 73 | "set to true to enable XSS protection" 74 | [xss-protection?] 75 | (-> site-defaults 76 | (update-in [:session] merge session-defaults) 77 | (assoc-in [:security :anti-forgery] xss-protection?))) 78 | 79 | (def app (app-handler 80 | ;; add your application routes here 81 | [home-routes album-routes test-routes base-routes] 82 | ;; add custom middleware here 83 | :middleware (load-middleware) 84 | :ring-defaults (mk-defaults false) 85 | ;; add access rules here 86 | :access-rules access/rules 87 | ;; serialize/deserialize the following data formats 88 | ;; available formats: 89 | ;; :json :json-kw :yaml :yaml-kw :edn :yaml-in-html 90 | :formats [:json-kw :edn :transit-json])) 91 | -------------------------------------------------------------------------------- /src/hipstr/layout.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.layout 2 | (:require [selmer.parser :as parser] 3 | [clojure.string :as s] 4 | [ring.util.response :refer [content-type response]] 5 | [compojure.response :refer [Renderable]] 6 | [environ.core :refer [env]] 7 | [hipstr.models.user-model :as user])) 8 | 9 | (def template-path "templates/") 10 | 11 | (deftype RenderableTemplate [template params] 12 | Renderable 13 | (render [this request] 14 | (content-type 15 | (->> (assoc params 16 | (keyword (s/replace template #".html" "-selected")) "active" 17 | :dev (env :dev) 18 | :servlet-context 19 | (if-let [context (:servlet-context request)] 20 | ;; If we're not inside a serlvet environment (for 21 | ;; example when using mock requests), then 22 | ;; .getContextPath might not exist 23 | (try (.getContextPath context) 24 | (catch IllegalArgumentException _ context)))) 25 | (parser/render-file (str template-path template)) 26 | response) 27 | "text/html; charset=utf-8"))) 28 | 29 | (defn render [template & [params]] 30 | (let [params (-> (or params {}) 31 | (assoc :is-authed? (user/is-authed? nil)))] 32 | (RenderableTemplate. template params))) 33 | 34 | -------------------------------------------------------------------------------- /src/hipstr/middleware.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.middleware 2 | (:require [taoensso.timbre :as timbre] 3 | [selmer.parser :as parser] 4 | [environ.core :refer [env]] 5 | [selmer.middleware :refer [wrap-error-page]] 6 | [prone.middleware :refer [wrap-exceptions]] 7 | [noir-exception.core :refer [wrap-internal-error]])) 8 | 9 | (defn log-request [handler] 10 | (fn [req] 11 | (timbre/debug req) 12 | (handler req))) 13 | 14 | (defn go-bowling? [handler] 15 | (fn [request] 16 | (let [request (assoc request :go-bowling? "YES! NOW!")] 17 | (handler request)))) 18 | 19 | (def development-middleware 20 | [go-bowling? 21 | wrap-error-page 22 | wrap-exceptions]) 23 | 24 | (def production-middleware 25 | [#(wrap-internal-error % :log (fn [e] (timbre/error e)))]) 26 | 27 | (defn load-middleware [] 28 | (concat (when (env :dev) development-middleware) 29 | production-middleware)) 30 | -------------------------------------------------------------------------------- /src/hipstr/models/album_model.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.models.album-model 2 | (:require [clojure.java.jdbc :as jdbc] 3 | [yesql.core :refer [defqueries]] 4 | [hipstr.models.connection :refer [db-spec]])) 5 | 6 | (defqueries "hipstr/models/albums.sql" {:connection db-spec}) 7 | (defqueries "hipstr/models/artists.sql" {:connection db-spec}) 8 | 9 | (defn add-album! 10 | "Adds a new album to the database." 11 | ([album] 12 | (jdbc/with-db-transaction [tx db-spec] 13 | (add-album! album tx))) 14 | ([album tx] 15 | (let [artist-info {:artist_name (:artist_name album)} 16 | txn {:connection tx} 17 | ;fetch or insert the artist record 18 | artist (or (first (get-artists-by-name artist-info txn)) 19 | (insert-artist> (password/encrypt (:password user)) 13 | (assoc user :password) 14 | insert-user #'app 14 | ; Makes static assets in $PROJECT_DIR/resources/public/ available. 15 | (wrap-file "resources") 16 | ; Content-Type, Content-Length, and Last Modified headers for files in body 17 | (wrap-file-info))) 18 | 19 | (defn start-server 20 | "used for starting the server in development mode from REPL" 21 | [& [port]] 22 | (let [port (if port (Integer/parseInt port) 3000)] 23 | (reset! server 24 | (serve (get-handler) 25 | {:port port 26 | :init init 27 | :auto-reload? true 28 | :destroy destroy 29 | :join? false})) 30 | (println (str "You can view the site at http://localhost:" port)))) 31 | 32 | (defn stop-server [] 33 | (.stop @server) 34 | (reset! server nil)) 35 | -------------------------------------------------------------------------------- /src/hipstr/routes/access.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.routes.access 2 | (:require [hipstr.models.user-model :refer [is-authed?]])) 3 | 4 | (def rules 5 | "The rules for accessing various routes in our application." 6 | [{:redirect "/login" :rule is-authed?}]) 7 | -------------------------------------------------------------------------------- /src/hipstr/routes/albums.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.routes.albums 2 | (:require [compojure.core :refer :all] 3 | [hipstr.layout :as layout] 4 | [hipstr.models.album-model :as album] 5 | [hipstr.validators.album-validator :as v] 6 | [noir.util.route :refer [restricted]] 7 | [taoensso.timbre :as timbre])) 8 | 9 | (defn render-recently-added-html 10 | "Simply renders the recently added page with the given context." 11 | [ctx] 12 | (layout/render "albums/recently-added.html" ctx)) 13 | 14 | (defn recently-added-page 15 | "Renders the recently-added page." 16 | [] 17 | (render-recently-added-html {:albums (album/get-recently-added)})) 18 | 19 | (defn recently-added-submit 20 | "Handles the add-album form on the recently-added page. 21 | In the case of validation errors or other unexpected errors, 22 | the :new key in the context will be set to the album 23 | information submitted by the user." 24 | [album] 25 | (let [errors (v/validate-new-album album) 26 | form-ctx (if (not-empty errors) 27 | {:validation-errors errors :new album} 28 | (try 29 | (album/add-album! album) 30 | {:new {} :success true} 31 | (catch Exception e 32 | (timbre/error e) 33 | {:new album 34 | :error "Oh snap! We lost the album. Try it again?"}))) 35 | ctx (merge {:form form-ctx} {:albums (album/get-recently-added)})] 36 | (render-recently-added-html ctx))) 37 | 38 | (defn artist-albums-page 39 | "Renders the albums for a given artist." 40 | [artist] 41 | (layout/render "albums/artist-albums.html" 42 | {:artist artist 43 | :albums (album/get-by-artist {:artist artist})})) 44 | 45 | (defroutes album-routes 46 | (GET "/albums/recently-added" [] (restricted (recently-added-page))) 47 | (POST "/albums/recently-added" [& album-form] (restricted (recently-added-submit album-form))) 48 | (GET "/albums/:artist" [artist] (artist-albums-page artist))) 49 | -------------------------------------------------------------------------------- /src/hipstr/routes/home.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.routes.home 2 | (:require [compojure.core :refer :all] 3 | [hipstr.cookies :as cookies] 4 | [hipstr.layout :as layout] 5 | [hipstr.models.user-model :as u] 6 | [hipstr.util :as util] 7 | [hipstr.validators.user-validator :as v] 8 | [ring.util.response :as response])) 9 | 10 | (defn home-page [] 11 | (layout/render 12 | "home.html" {:content (util/md->html "/md/docs.md")})) 13 | 14 | (defn about-page [] 15 | (layout/render "about.html")) 16 | 17 | (defn foo-response [request] 18 | {:status 200 19 | :headers {"Content-Type" "text/html"} 20 | :body (str "
Go bowling?
" 21 | "
" (:go-bowling? request) "
")}) 22 | 23 | (defn signup-page [] 24 | (layout/render "signup.html")) 25 | 26 | (defn signup-page-submit [user] 27 | (let [errors (v/validate-signup user)] 28 | (if (empty? errors) 29 | (do 30 | (u/add-user! user) 31 | (response/redirect "/signup-success")) 32 | (layout/render "signup.html" (assoc user :errors errors))))) 33 | 34 | (defn login-page 35 | "Renders the login form." 36 | ([] 37 | (layout/render "login.html" {:username (cookies/remember-me)})) 38 | ([credentials] 39 | (if (apply u/auth-user (map credentials [:username :password])) 40 | (do (if (:remember-me credentials) 41 | (cookies/remember-me (:username credentials)) 42 | (cookies/remember-me "")) 43 | (response/redirect "/albums/recently-added")) 44 | (layout/render "login.html" {:invalid-credentials? true})))) 45 | 46 | (defn logout 47 | "Logs the user out of this session." 48 | [] 49 | (u/invalidate-auth) 50 | (response/redirect "/")) 51 | 52 | (defroutes home-routes 53 | (GET "/" [] (home-page)) 54 | (GET "/about" request (foo-response request)) 55 | (GET "/login" [] (login-page)) 56 | (POST "/login" [& login-form] (login-page login-form)) 57 | (ANY "/logout" [] (logout)) 58 | (GET "/signup" [] (signup-page)) 59 | (POST "/signup" [& form] (signup-page-submit form)) 60 | (GET "/signup-success" [] "Success!")) 61 | -------------------------------------------------------------------------------- /src/hipstr/routes/test_routes.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.routes.test-routes 2 | (:require [compojure.core :refer :all])) 3 | 4 | (defn render-request-val [request-map & [request-key]] 5 | "Simply returns the value of request-key in request-map, 6 | if request-key is provided; Otherwise return the request-map. 7 | If request-key is provided, but not found in the request-map, 8 | a message indicating as such will be returned." 9 | (str (if request-key 10 | (if-let [result ((keyword request-key) request-map)] 11 | result 12 | (str request-key " is not a valid key.")) 13 | request-map))) 14 | 15 | (defroutes test-routes 16 | (POST "/req" request (render-request-val request)) 17 | ;no access to the full request map 18 | (GET "/req/:val" [val] (str val)) 19 | ;use :as to get access to full request map 20 | (GET "/req/:val" [val :as full-req] (str val "
" full-req)) 21 | ;use & to get access to unbound params, and call our route handler function 22 | (GET "/req/:val/:another-val/:and-another" [val & remainders] 23 | (str val "
" remainders)) 24 | ;giving the route a different URL from /req/:val will ensure its execution 25 | (GET "/req/key/:key" [key :as request] (render-request-val request key))) 26 | -------------------------------------------------------------------------------- /src/hipstr/session_manager.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.session-manager 2 | (:require [noir.session :refer [clear-expired-sessions]] 3 | [cronj.core :refer [cronj]])) 4 | 5 | (def cleanup-job 6 | (cronj 7 | :entries 8 | [{:id "session-cleanup" 9 | :handler (fn [_ _] (clear-expired-sessions)) 10 | :schedule "* /30 * * * * *" 11 | :opts {}}])) 12 | -------------------------------------------------------------------------------- /src/hipstr/util.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.util 2 | (:require [noir.io :as io] 3 | [markdown.core :as md])) 4 | 5 | (defn md->html 6 | "reads a markdown file from public/md and returns an HTML string" 7 | [filename] 8 | (md/md-to-html-string (io/slurp-resource filename))) 9 | -------------------------------------------------------------------------------- /src/hipstr/validators/album_validator.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.validators.album-validator 2 | (:require [validateur.validation :refer :all] 3 | [noir.validation :as v] 4 | [clj-time.core :as t] 5 | [clj-time.format :as f])) 6 | 7 | (def artist-name-validations 8 | "Returns a validation set, ensuring an artist name is valid." 9 | (validation-set 10 | (length-of :artist_name :within (range 1 256) 11 | :message-fn(fn [type m attributes & args] 12 | (if (= type :blank) 13 | "Artist name is required." 14 | "Artist name must be less than or equal to 255 characters long."))))) 15 | 16 | (def album-name-validations 17 | (validation-set 18 | (length-of :album_name :within (range 1 256) 19 | :message-fn (fn [type m attributes & args] 20 | (if (= type :blank) 21 | "Album name is required." 22 | "Album name must be less than 255 characters long."))))) 23 | 24 | (def release-date-format-message 25 | "The release date's format is incorrect. Must be yyyy-mm-dd.") 26 | 27 | (def release-date-invalid-message 28 | "The release date is not a valid date.") 29 | 30 | (def release-date-format-validator 31 | "Returns a validator function which ensures the format of the 32 | date-string is correct." 33 | (format-of :release_date 34 | :format #"\d{4}-\d{2}-\d{2}$" 35 | :blank-message release-date-format-message 36 | :message release-date-format-message)) 37 | 38 | (def release-date-formatter 39 | (f/formatter "yyyy-mm-dd")) 40 | 41 | (defn parse-date 42 | "Retruns a date/time object if the provided date-string is valid; 43 | otherwise nil." 44 | [date] 45 | (try 46 | (f/parse release-date-formatter date) 47 | (catch Exception e))) 48 | 49 | (def release-date-validator 50 | "Returns a validator function which ensures the provided 51 | date--string is a validate date." 52 | (validate-when #(valid? (validation-set release-date-format-validator) %) 53 | (validate-with-predicate :release_date 54 | #(v/not-nil? (parse-date (:release_date %))) 55 | :message release-date-invalid-message))) 56 | 57 | (def release-date-validations 58 | "Returns a validator which, when the format of the date-string 59 | is correct, ensures the date itself is valid." 60 | (validation-set release-date-format-validator release-date-validator)) 61 | 62 | (def validate-new-album 63 | "Returns a validator that knows how to validate all the fields for a new album." 64 | (compose-sets artist-name-validations album-name-validations release-date-validations)) 65 | -------------------------------------------------------------------------------- /src/hipstr/validators/user_validator.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.validators.user-validator 2 | (:require [noir.validation :as v] 3 | [validateur.validation :refer :all])) 4 | 5 | (def email-blank-msg 6 | "Email is a required field") 7 | 8 | (def email-format-msg 9 | "The email's format is incorrect") 10 | 11 | (def email-validator 12 | (validation-set 13 | (validate-with-predicate :email 14 | #(v/is-email? (:email %)) 15 | :message-fn (fn [validation-map] 16 | (if (v/has-value? (:email validation-map)) 17 | email-format-msg 18 | email-blank-msg))))) 19 | 20 | (def username-blank-msg 21 | "Username is a required field") 22 | 23 | (def username-invalid-msg 24 | "Only letters, numbers, and underscores allowed.") 25 | 26 | (def username-validator 27 | (validation-set 28 | (format-of :username 29 | :format #"^[a-zA-Z0-9_]*$" 30 | :blank-message username-blank-msg 31 | :message username-invalid-msg))) 32 | 33 | (def password-blank-msg 34 | "Password is a required field") 35 | 36 | (def password-invalid-msg 37 | "Passwords must be between 8 and 100 characters long.") 38 | 39 | (def password-validator 40 | (validation-set 41 | (length-of :password 42 | :within (range 8 101) 43 | :message-fn (fn [type m attribute & args] 44 | (if (= type :blank) 45 | password-blank-msg 46 | password-invalid-msg))))) 47 | 48 | (defn validate-signup [signup] 49 | ((compose-sets email-validator username-validator password-validator) signup)) 50 | -------------------------------------------------------------------------------- /src/migrations/00000000000100-users.down.sql: -------------------------------------------------------------------------------- 1 | DROP TRIGGER update_user_updated_at ON users; 2 | --;; 3 | DROP FUNCTION update_updated_at(); 4 | --;; 5 | DROP TABLE users; 6 | -------------------------------------------------------------------------------- /src/migrations/00000000000100-users.up.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE users 2 | (user_id SERIAL NOT NULL PRIMARY KEY, 3 | username VARCHAR(30) NOT NULL, 4 | email VARCHAR(60), 5 | password VARCHAR(100), 6 | created_at TIMESTAMP NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), 7 | updated_at TIMESTAMP NOT NULL DEFAULT (now() AT TIME ZONE 'utc')); 8 | --;; 9 | -- create a function which simply sets the update_date column to the current date/time. 10 | CREATE OR REPLACE FUNCTION update_updated_at() 11 | RETURNS TRIGGER AS $$ 12 | BEGIN 13 | NEW.updated_at = now() AT TIME ZONE 'utc'; 14 | RETURN NEW; 15 | END 16 | $$ language 'plpgsql'; 17 | --;; 18 | -- create an update trigger which updates our update_date column by calling the above function 19 | CREATE TRIGGER update_user_updated_at BEFORE UPDATE 20 | ON users FOR EACH ROW EXECUTE PROCEDURE 21 | update_updated_at(); 22 | -------------------------------------------------------------------------------- /src/migrations/00000000000200-artists.down.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE artists; 2 | -------------------------------------------------------------------------------- /src/migrations/00000000000200-artists.up.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE artists -- #1 2 | ( artist_id SERIAL NOT NULL PRIMARY KEY, 3 | name VARCHAR(255) NOT NULL, 4 | created_at TIMESTAMP NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), 5 | updated_at TIMESTAMP NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), 6 | CONSTRAINT artist_name UNIQUE(name)); 7 | --;; 8 | -- create an update trigger which updates our update_date -- column by calling the above function 9 | CREATE TRIGGER update_artist_updated_at BEFORE UPDATE --#2 10 | ON artists FOR EACH ROW EXECUTE PROCEDURE 11 | update_updated_at(); 12 | --;; 13 | INSERT INTO artists (name) VALUES ('The Arthur Digby Sellers Band'); 14 | --;; 15 | INSERT INTO artists (name) VALUES ('Fort Knox Harrington'); 16 | --;; 17 | INSERT INTO artists (name) VALUES ('Hungus'); 18 | --;; 19 | INSERT INTO artists (name) VALUES ('Smokey Fouler'); 20 | --;; 21 | INSERT INTO artists (name) VALUES ('Brant'); 22 | -------------------------------------------------------------------------------- /src/migrations/00000000000210-albums.down.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE albums; 2 | -------------------------------------------------------------------------------- /src/migrations/00000000000210-albums.up.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE albums 2 | (album_id SERIAL NOT NULL PRIMARY KEY, 3 | artist_id BIGINT NOT NULL REFERENCES artists (artist_id), 4 | name VARCHAR(255) NOT NULL, 5 | release_date DATE NOT NULL, 6 | created_at TIMESTAMP NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), 7 | updated_at TIMESTAMP NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), 8 | CONSTRAINT artist_album_name UNIQUE (artist_id, name)); 9 | --;; 10 | -- create an update trigger which updates our update_date column by calling the above function 11 | CREATE TRIGGER update_album_update_date BEFORE UPDATE 12 | ON albums FOR EACH ROW EXECUTE PROCEDURE 13 | update_updated_at(); 14 | --;; 15 | INSERT INTO albums (artist_id, name, release_date) 16 | SELECT a.artist_id, 'My Iron Lung', '1978-11-24' 17 | FROM artists a 18 | WHERE a.name = 'The Arthur Digby Sellers Band' 19 | --;; 20 | INSERT INTO albums (artist_id, name, release_date) 21 | SELECT a.artist_id, 'American History Fail', '2000-04-18' 22 | FROM artists a 23 | WHERE a.name = 'The Arthur Digby Sellers Band' 24 | --;; 25 | INSERT INTO albums (artist_id, name, release_date) 26 | SELECT a.artist_id, 'Giggles and Mustaches', '1992-11-29' 27 | FROM artists a 28 | WHERE a.name = 'Fort Knox Harrington' 29 | --;; 30 | INSERT INTO albums (artist_id, name, release_date) 31 | SELECT a.artist_id, '20 Tons of Video Gold', '1990-10-09' 32 | FROM artists a 33 | WHERE a.name = 'Fort Knox Harrington' 34 | --;; 35 | INSERT INTO albums (artist_id, name, release_date) 36 | SELECT a.artist_id, 'Fixing the Cable', '1989-06-02' 37 | FROM artists a 38 | WHERE a.name = 'Hungus' 39 | --;; 40 | INSERT INTO albums (artist_id, name, release_date) 41 | SELECT a.artist_id, 'Over the Line', '1998-08-08' 42 | FROM artists a 43 | WHERE a.name = 'Smokey Fouler' 44 | --;; 45 | INSERT INTO albums (artist_id, name, release_date) 46 | SELECT a.artist_id, 'Petulant Suckup', '1995-05-21' 47 | FROM artists a 48 | WHERE a.name = 'Brant' 49 | -------------------------------------------------------------------------------- /test/hipstr/test/handler_test.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.test.handler-test 2 | (:use clojure.test 3 | ring.mock.request 4 | hipstr.handler)) 5 | 6 | (deftest test-app 7 | (testing "main route" 8 | (let [response (app (request :get "/"))] 9 | (is (= 200 (:status response))))) 10 | 11 | (testing "not-found route" 12 | (let [response (app (request :get "/invalid"))] 13 | (is (= 404 (:status response)))))) 14 | 15 | (deftest invalid-signup-parameter-redisplays-the-signup-form 16 | (let [response (app (request :post "/signup" 17 | {:username "TheDude" :password "123456789"}))] 18 | (is (= 200 (:status response))))) 19 | -------------------------------------------------------------------------------- /test/hipstr/test/validators/user_validator_test.clj: -------------------------------------------------------------------------------- 1 | (ns hipstr.test.validators.user-validator-test 2 | (:require [hipstr.validators.user-validator :as uv]) 3 | (:use clojure.test)) 4 | 5 | (defn validate-email [email] 6 | "Validates the provided email for us, and returns the 7 | set of validation messages for the email, if any." 8 | (:email (uv/email-validator {:email email}))) 9 | 10 | (defn validate-username [username] 11 | "Validates the provided username for us, and returns the 12 | set of validation messages for the username, if any." 13 | (:username (uv/username-validator {:username username}))) 14 | 15 | (defn validate-password [password] 16 | "Validates the provided password for us, and returns the 17 | set of validation messages for the username, if any." 18 | (:password (uv/password-validator {:password password}))) 19 | 20 | (defn assert-error-message 21 | "Asserts that a given error message set contains a single error messsage 22 | and matches an expected message." 23 | [expected errors] 24 | (is (= 1 (count errors))) 25 | (is (= expected (first errors)))) 26 | 27 | (deftest blank-email-returns-email-is-required-message 28 | (assert-error-message uv/email-blank-msg (validate-email ""))) 29 | 30 | (deftest invalid-email-returns-appropriate-message 31 | (assert-error-message uv/email-format-msg (validate-email "dude@bides."))) 32 | 33 | (deftest valid-email-returns-0-messages 34 | (let [result (validate-email "dude@bides.net")] 35 | (is (= 0 (count result))))) 36 | 37 | (deftest blank-username-returns-a-username-required-message 38 | (assert-error-message uv/username-blank-msg (validate-username ""))) 39 | 40 | (deftest invalid-username-returns-appropriate-message 41 | (assert-error-message uv/username-invalid-msg 42 | (validate-username "Yea! Spaces! Illegal Characters!"))) 43 | 44 | (deftest valid-username-returns-0-messages 45 | (let [result (validate-username "TheDude")] 46 | (is (= 0 (count result))))) 47 | 48 | (deftest password-must-be-at-least-8-characters-long 49 | (assert-error-message uv/password-invalid-msg (validate-password "123456"))) 50 | 51 | (deftest password-must-be-less-than-100-characters-long 52 | (let [pwd (clojure.string/join (repeat 101 "a"))] 53 | (assert-error-message uv/password-invalid-msg (validate-password pwd)))) 54 | 55 | (deftest blank-password-returns-a-password-required-message 56 | (assert-error-message uv/password-blank-msg (validate-password ""))) 57 | 58 | (deftest valid-albeit-crappy-password-returns-0-messages 59 | (let [result (validate-password "12345678")] 60 | (is (= 0 (count result))))) 61 | --------------------------------------------------------------------------------