├── .gitignore ├── LICENSE ├── README.markdown ├── img_prep.py ├── index.html ├── inputs ├── content.png └── style.png ├── lbfgs.py ├── neural_style.py ├── requirements-full.txt ├── requirements.txt ├── result.json ├── result ├── 0.png ├── 1.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png └── 9.png ├── settings.py ├── snapshots ├── 1000.png ├── 1700.png ├── 188.png ├── 2000.png ├── 200x200 │ ├── 2804.png │ ├── overall.png │ └── vc.png ├── 287.png ├── 340.png ├── 400x400 │ ├── 1005.png │ └── 607.png ├── 992.png ├── default.png ├── logarithm.png ├── neural_style_board.png ├── percent.png ├── percent2.png ├── value.png └── very-high-lr.png ├── start_training.py ├── static ├── board.js ├── highslide.config.js ├── highslide │ ├── graphics │ │ ├── close.png │ │ ├── closeX.png │ │ ├── controlbar-black-border.gif │ │ ├── controlbar-text-buttons.png │ │ ├── controlbar-white-small.gif │ │ ├── controlbar-white.gif │ │ ├── controlbar2.gif │ │ ├── controlbar3.gif │ │ ├── controlbar4-hover.gif │ │ ├── controlbar4.gif │ │ ├── fullexpand.gif │ │ ├── geckodimmer.png │ │ ├── icon.gif │ │ ├── loader.gif │ │ ├── loader.white.gif │ │ ├── outlines │ │ │ ├── Outlines.psd │ │ │ ├── beveled.png │ │ │ ├── drop-shadow.png │ │ │ ├── glossy-dark.png │ │ │ ├── outer-glow.png │ │ │ ├── rounded-black.png │ │ │ └── rounded-white.png │ │ ├── resize.gif │ │ ├── scrollarrows.png │ │ ├── zoomin.cur │ │ └── zoomout.cur │ ├── highslide-full.js │ ├── highslide-full.min.js │ ├── highslide-full.packed.js │ ├── highslide-ie6.css │ ├── highslide-with-gallery.js │ ├── highslide-with-gallery.min.js │ ├── highslide-with-gallery.packed.js │ ├── highslide-with-html.js │ ├── highslide-with-html.min.js │ ├── highslide-with-html.packed.js │ ├── highslide.css │ ├── highslide.js │ ├── highslide.min.js │ └── highslide.packed.js ├── jquery.min.js └── stock │ ├── highstock.js │ ├── modules │ └── exporting.js │ └── themes │ ├── dark-unica-nofont.js │ └── dark-unica.js ├── training.py ├── training_record.py ├── vgg16_cnn_only_weights.h5 └── vgg16_cnnonly_model.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Example user template template 3 | ### Example user template 4 | 5 | *.lua 6 | .DS_Store 7 | 8 | # IntelliJ project files 9 | .idea 10 | *.iml 11 | out 12 | gen### Python template 13 | # Byte-compiled / optimized / DLL files 14 | __pycache__/ 15 | *.py[cod] 16 | *$py.class 17 | 18 | # C extensions 19 | *.so 20 | 21 | # Distribution / packaging 22 | .Python 23 | env/ 24 | build/ 25 | develop-eggs/ 26 | dist/ 27 | downloads/ 28 | eggs/ 29 | .eggs/ 30 | lib/ 31 | lib64/ 32 | parts/ 33 | sdist/ 34 | var/ 35 | *.egg-info/ 36 | .installed.cfg 37 | *.egg 38 | 39 | # PyInstaller 40 | # Usually these files are written by a python script from a template 41 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 42 | *.manifest 43 | *.spec 44 | 45 | # Installer logs 46 | pip-log.txt 47 | pip-delete-this-directory.txt 48 | 49 | # Unit test / coverage reports 50 | htmlcov/ 51 | .tox/ 52 | .coverage 53 | .coverage.* 54 | .cache 55 | nosetests.xml 56 | coverage.xml 57 | *,cover 58 | 59 | # Translations 60 | *.mo 61 | *.pot 62 | 63 | # Django stuff: 64 | *.log 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 suquark 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # Neural-Style Visualization 2 | 3 | This project aims at visualize loss and other important metrics for analysis. 4 | 5 | This project also implement an instance of neural-style, follows the idea of a keras example `keras/examples/neural_style_transfer.py`, 6 | but with a mostly different design. 7 | 8 | Visualization is important and fun. It tells us what's going on. 9 | 10 | ## Requirements 11 | 12 | - python 3 13 | - keras 14 | - tensorflow >= 0.9.0 / Theano 15 | - h5py 16 | - Pillow 17 | - requests 18 | - tornado 19 | 20 | 21 | 22 | ## Usage 23 | 24 | make sure you have the requirements above, or type this in your command line: 25 | 26 | sudo pip install -r requirements.txt 27 | 28 | if you want to use tensorflow as backend, follow the [instruction](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md) to install tensorflow first 29 | 30 | then 31 | 32 | python neural_style.py 33 | 34 | now you can see the neural style board in `localhost:8000` 35 | 36 | ![](snapshots/neural_style_board.png) 37 | 38 | ## Loss analysis 39 | 40 | For example, you may find an bad output 41 | 42 | ![](snapshots/1000.png) 43 | 44 | after comparing the loss, you will found negative correlation between style loss and content loss(against the assumption of neural-style): 45 | 46 | ![](snapshots/200x200/2804.png) 47 | 48 | so a very small picture may not be very suitable for neural-style task. 49 | 50 | Here's a better result with nearly independent loss: 51 | 52 | ![](snapshots/340.png) 53 | ![](snapshots/992.png) 54 | 55 | A very high learning rate: 56 | 57 | ![](snapshots/very-high-lr.png) 58 | 59 | ## Realtime watch 60 | 61 | ![](snapshots/default.png) 62 | 63 | ## Headstart 64 | 65 | You can stop your training at any time and continue at the last epoch. 66 | 67 | ## Realtime hyperparameter adjusting 68 | 69 | You are free to adjust hyperparameter 70 | 71 | ## Speed 72 | 73 | Using TensorFlow as backend. 74 | 75 | CPU: about 30 seconds/iter on Macbook Pro 76 | 77 | GPU: about 0.3 s/iter on an K20 78 | -------------------------------------------------------------------------------- /img_prep.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | from os.path import exists 3 | import numpy as np 4 | from settings import img_width, img_height 5 | from scipy.misc import imread, imresize, imsave 6 | 7 | 8 | def preprocess_image(image_path): 9 | """ 10 | util function to open, resize and format pictures into appropriate tensors 11 | :param image_path: PAth to read the image 12 | :return: 13 | """ 14 | img = imresize(imread(image_path), (img_width, img_height)) 15 | img = img.transpose((2, 0, 1)).astype('float64') 16 | img = np.expand_dims(img, axis=0) 17 | return img 18 | 19 | 20 | def deprocess_image(x): 21 | """ 22 | util function to convert a tensor into a valid image 23 | :param x: numpy array for image 24 | :return: a tuned array 25 | """ 26 | x = x.transpose((1, 2, 0)) 27 | x = np.clip(x, 0, 255).astype('uint8') 28 | return x 29 | 30 | 31 | # def random_image(): 32 | # """ 33 | # Create a random image 34 | # :return: A random image 35 | # """ 36 | # return np.random.uniform(0, 255, (1, 3, img_width, img_height)) 37 | 38 | 39 | def grey_image(): 40 | """ 41 | Create a random image 42 | :return: A random image 43 | """ 44 | return np.ones((1, 3, img_width, img_height)) * 128.0 45 | 46 | 47 | def img_in(content_path, style_path): 48 | content = preprocess_image(content_path) 49 | style = preprocess_image(style_path) 50 | return content, style 51 | 52 | 53 | def img_save(x, fname, allow_override=False): 54 | """ 55 | Save image 56 | :param x: numpy array of image 57 | :param fname: filename 58 | :param allow_override: if a image exist, override it only when it is necessary 59 | :return: 60 | """ 61 | img = deprocess_image(x.reshape((3, img_width, img_height))) 62 | if not allow_override and exists(fname): 63 | raise Exception('Image exists') 64 | imsave(fname, img) 65 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | neural style board 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 | 74 | 75 | 102 |
103 | -------------------------------------------------------------------------------- /inputs/content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/inputs/content.png -------------------------------------------------------------------------------- /inputs/style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/inputs/style.png -------------------------------------------------------------------------------- /lbfgs.py: -------------------------------------------------------------------------------- 1 | # TODO: implement the l-bfgs algorithm 2 | # local x, losses = optim.lbfgs(feval, img, {}) 3 | 4 | -------------------------------------------------------------------------------- /neural_style.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import os 3 | from tornado.ioloop import IOLoop 4 | from tornado.web import RequestHandler, Application 5 | from tornado.escape import json_decode 6 | import json 7 | # from main import start_training 8 | import multiprocessing 9 | from tornado.concurrent import Future 10 | from tornado import gen 11 | import uuid 12 | # from training_record import TrainingRecorder 13 | 14 | __author__ = 'xymeow' 15 | 16 | # TODO: show training messages on the front end 17 | 18 | start = False 19 | trained = False 20 | stop = False 21 | lr = 1.0 22 | 23 | p = None 24 | record_cache = None 25 | # use long polling to update the training results 26 | # I copied these codes from tornado/demo/chat 27 | class MessageBuffer(object): 28 | def __init__(self): 29 | self.waiters = set() 30 | self.cache = [] 31 | self.cache_size = 200 32 | 33 | def wait_for_messages(self, cursor=None): 34 | # Construct a Future to return to our caller. This allows 35 | # wait_for_messages to be yielded from a coroutine even though 36 | # it is not a coroutine itself. We will set the result of the 37 | # Future when results are available. 38 | result_future = Future() 39 | if cursor: 40 | new_count = 0 41 | for msg in reversed(self.cache): 42 | if msg["id"] == cursor: 43 | break 44 | new_count += 1 45 | if new_count: 46 | result_future.set_result(self.cache[-new_count:]) 47 | return result_future 48 | self.waiters.add(result_future) 49 | return result_future 50 | 51 | def cancel_wait(self, future): 52 | self.waiters.remove(future) 53 | # Set an empty result to unblock any coroutines waiting. 54 | future.set_result([]) 55 | 56 | def new_messages(self, messages): 57 | # logging.info("Sending new message to %r listeners", len(self.waiters)) 58 | for future in self.waiters: 59 | future.set_result(messages) 60 | self.waiters = set() 61 | self.cache.extend(messages) 62 | if len(self.cache) > self.cache_size: 63 | self.cache = self.cache[-self.cache_size:] 64 | 65 | 66 | record_pool = MessageBuffer() 67 | message_pool = MessageBuffer() 68 | 69 | class MainHandler(RequestHandler): 70 | def get(self): 71 | self.render('index.html', json='/json') 72 | 73 | def post(self): 74 | json = json_decode(self.request.body) 75 | self.render('index.html', json=json) 76 | 77 | 78 | class RecordHandler(RequestHandler): 79 | 80 | def post(self): 81 | global record_cache 82 | json_dict = json_decode(self.request.body) 83 | print(self.request.body) 84 | record_cache = json_dict['cache'] 85 | json_dict.pop('cache') 86 | myjson = { 87 | 'id': str(uuid.uuid4()), 88 | 'json': json_dict 89 | } 90 | 91 | record_pool.new_messages([myjson]) 92 | 93 | 94 | class PullRecordHandler(RequestHandler): 95 | def get(self): 96 | return 97 | 98 | @gen.coroutine 99 | def post(self): 100 | cursor = self.get_argument("cursor", None) 101 | # Save the future returned by wait_for_messages so we can cancel 102 | # it in wait_for_messages 103 | self.future = record_pool.wait_for_messages(cursor=cursor) 104 | messages = yield self.future 105 | if self.request.connection.stream.closed(): 106 | return 107 | self.write(dict(messages=messages)) 108 | 109 | def on_connection_close(self): 110 | record_pool.cancel_wait(self.future) 111 | 112 | 113 | class TrainHandler(RequestHandler): 114 | def get(self): 115 | global trained 116 | global start 117 | global p 118 | if not start: 119 | start = True 120 | trained = True 121 | p = multiprocessing.Process(target=start_training) 122 | p.start() 123 | elif trained: 124 | trained = False 125 | elif not trained: 126 | trained = True 127 | self.write(json.dumps(trained)) 128 | 129 | 130 | class StatusHandler(RequestHandler): 131 | def get(self): 132 | global trained 133 | status = 'training' 134 | if not trained and not stop: 135 | status = 'pause' 136 | if stop or not start: 137 | status = 'stop' 138 | self.write(status) 139 | 140 | 141 | class StopHandler(RequestHandler): 142 | def get(self): 143 | global stop 144 | global start 145 | global p 146 | stop = True 147 | start = False 148 | if p != None: 149 | p.terminate() 150 | 151 | 152 | class PictureHandler(RequestHandler): 153 | def get(self): 154 | print(self.get_argument('path')) 155 | p = open(self.get_argument('path'), 'rb') 156 | self.write(p.read()) 157 | p.close() 158 | 159 | 160 | class InitJSONHandler(RequestHandler): 161 | def get(self): 162 | global record_cache 163 | if record_cache == None: 164 | with open('result.json', 'rb') as f: 165 | self.write(f.read()) 166 | else: 167 | self.write(record_cache) 168 | 169 | 170 | class LearningRateHandler(RequestHandler): 171 | def get(self): 172 | global lr 173 | self.write(str(lr)) 174 | 175 | def post(self): 176 | global lr 177 | # print(self.get_argument('lr')) 178 | lr = float(self.get_argument('lr')) 179 | print('set learnig rate to {}'.format(lr)) 180 | 181 | 182 | class PullMessageHandler(RequestHandler): 183 | 184 | @gen.coroutine 185 | def post(self): 186 | cursor = self.get_argument("cursor", None) 187 | # Save the future returned by wait_for_messages so we can cancel 188 | # it in wait_for_messages 189 | self.future = message_pool.wait_for_messages(cursor=cursor) 190 | messages = yield self.future 191 | if self.request.connection.stream.closed(): 192 | return 193 | self.write(dict(messages=messages)) 194 | 195 | def on_connection_close(self): 196 | message_pool.cancel_wait(self.future) 197 | 198 | 199 | class SetMessageHandler(RequestHandler): 200 | def post(self): 201 | # global record_cache 202 | json_dict = json_decode(self.request.body) 203 | print(self.request.body) 204 | myjson = { 205 | 'id': str(uuid.uuid4()), 206 | 'json': json_dict 207 | } 208 | message_pool.new_messages([myjson]) 209 | 210 | 211 | 212 | settings = { 213 | "static_path": os.path.join(os.path.dirname(__file__), "static") 214 | } 215 | 216 | application = Application([ 217 | (r"/", MainHandler), 218 | (r"/json", PullRecordHandler), 219 | (r"/stop", StopHandler), 220 | (r"/record", RecordHandler), 221 | (r"/status", StatusHandler), 222 | (r"/picture", PictureHandler), 223 | (r"/init", InitJSONHandler), 224 | (r"/lr", LearningRateHandler), 225 | (r"/train", TrainHandler), 226 | (r"/setmsg", SetMessageHandler), 227 | (r"/getmsg", PullMessageHandler) 228 | ], **settings) 229 | 230 | if __name__ == "__main__": 231 | print('server start at localhost:8000') 232 | application.listen(8000) 233 | IOLoop.instance().start() 234 | -------------------------------------------------------------------------------- /requirements-full.txt: -------------------------------------------------------------------------------- 1 | Keras==1.0.6 2 | Pillow==3.0.0 3 | requests==2.10.0 4 | h5py==2.5.0 5 | Theano==0.7.0 6 | tornado==4.4 7 | tensorflow==0.9.0 8 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Keras==1.0.6 2 | Pillow==3.0.0 3 | requests==2.10.0 4 | h5py==2.5.0 5 | tornado==4.4 6 | -------------------------------------------------------------------------------- /result.json: -------------------------------------------------------------------------------- 1 | {"output": [[0, "result/0.png"], [1, "result/1.png"], [2, "result/2.png"], [3, "result/3.png"], [4, "result/4.png"], [5, "result/5.png"], [6, "result/6.png"], [7, "result/7.png"], [9, "result/9.png"], [10, "result/10.png"], [11, "result/11.png"], [12, "result/12.png"], [13, "result/13.png"], [14, "result/14.png"], [15, "result/15.png"]], "loss": {"total": [[0, 2871786471424.0], [1, 2848126140416.0], [2, 2824304328704.0], [3, 2787302178816.0], [4, 2728991653888.0], [5, 2667188584448.0], [6, 2557790912512.0], [7, 2466287190016.0], [9, 2378919051264.0], [10, 2291293749248.0], [11, 2202746224640.0], [12, 2113198227456.0], [13, 2023123845120.0], [14, 1933020889088.0], [15, 1843270647808.0]], "content": [[0, 32352552960.0], [1, 32260364288.0], [2, 32087347200.0], [3, 31683610624.0], [4, 32703326208.0], [5, 33826881536.0], [6, 35298365440.0], [7, 36299169792.0], [9, 37217050624.0], [10, 38147252224.0], [11, 39084449792.0], [12, 40074539008.0], [13, 41224269824.0], [14, 42584903680.0], [15, 44183437312.0]], "total variation": [[0, 0.0], [1, 0.0], [2, 0.0], [3, 0.0], [4, 0.0], [5, 0.0], [6, 0.0], [7, 0.0], [9, 0.0], [10, 0.0], [11, 0.0], [12, 0.0], [13, 0.0], [14, 0.0], [15, 0.0]], "style": [[0, 2839433969664.0], [1, 2815865651200.0], [2, 2792216854528.0], [3, 2755618668544.0], [4, 2696288403456.0], [5, 2633361784832.0], [6, 2522492436480.0], [7, 2429988110336.0], [9, 2341701943296.0], [10, 2253146554368.0], [11, 2163661733888.0], [12, 2073123749888.0], [13, 1981899603968.0], [14, 1890435989504.0], [15, 1799087194112.0]]}} -------------------------------------------------------------------------------- /result/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/0.png -------------------------------------------------------------------------------- /result/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/1.png -------------------------------------------------------------------------------- /result/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/10.png -------------------------------------------------------------------------------- /result/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/11.png -------------------------------------------------------------------------------- /result/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/12.png -------------------------------------------------------------------------------- /result/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/13.png -------------------------------------------------------------------------------- /result/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/14.png -------------------------------------------------------------------------------- /result/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/15.png -------------------------------------------------------------------------------- /result/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/2.png -------------------------------------------------------------------------------- /result/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/3.png -------------------------------------------------------------------------------- /result/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/4.png -------------------------------------------------------------------------------- /result/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/5.png -------------------------------------------------------------------------------- /result/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/6.png -------------------------------------------------------------------------------- /result/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/7.png -------------------------------------------------------------------------------- /result/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/9.png -------------------------------------------------------------------------------- /settings.py: -------------------------------------------------------------------------------- 1 | # dimensions of the generated picture. 2 | img_width = 500 3 | img_height = 500 4 | input_shape = (None, 3, img_width, img_height) 5 | # You can resize the picture later if necessary 6 | assert img_height == img_width, 'Due to the use of the Gram matrix, width and height must match.' 7 | 8 | # where the output should be released 9 | result_dir = "result" 10 | 11 | # The path of content & style image 12 | content_path = 'inputs/content.png' 13 | style_path = 'inputs/style.png' 14 | 15 | 16 | learning_rate = 1.0 17 | # layers which provide us with features 18 | content_feature_layers = ['conv4_2'] 19 | style_feature_layers = ['conv1_1', 'conv2_1', 'conv3_1', 'conv4_1', 'conv5_1'] 20 | 21 | # these are the weights of the different loss components 22 | loss_set = [('content', 1.0), 23 | ('style', 50.0), 24 | ('total variation', 0.0)] 25 | -------------------------------------------------------------------------------- /snapshots/1000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/1000.png -------------------------------------------------------------------------------- /snapshots/1700.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/1700.png -------------------------------------------------------------------------------- /snapshots/188.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/188.png -------------------------------------------------------------------------------- /snapshots/2000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/2000.png -------------------------------------------------------------------------------- /snapshots/200x200/2804.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/200x200/2804.png -------------------------------------------------------------------------------- /snapshots/200x200/overall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/200x200/overall.png -------------------------------------------------------------------------------- /snapshots/200x200/vc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/200x200/vc.png -------------------------------------------------------------------------------- /snapshots/287.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/287.png -------------------------------------------------------------------------------- /snapshots/340.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/340.png -------------------------------------------------------------------------------- /snapshots/400x400/1005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/400x400/1005.png -------------------------------------------------------------------------------- /snapshots/400x400/607.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/400x400/607.png -------------------------------------------------------------------------------- /snapshots/992.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/992.png -------------------------------------------------------------------------------- /snapshots/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/default.png -------------------------------------------------------------------------------- /snapshots/logarithm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/logarithm.png -------------------------------------------------------------------------------- /snapshots/neural_style_board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/neural_style_board.png -------------------------------------------------------------------------------- /snapshots/percent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/percent.png -------------------------------------------------------------------------------- /snapshots/percent2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/percent2.png -------------------------------------------------------------------------------- /snapshots/value.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/value.png -------------------------------------------------------------------------------- /snapshots/very-high-lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/very-high-lr.png -------------------------------------------------------------------------------- /start_training.py: -------------------------------------------------------------------------------- 1 | """Neural style transfer with Keras. 2 | 3 | # References 4 | - [A Neural Algorithm of Artistic Style](http://arxiv.org/abs/1508.06576) 5 | """ 6 | 7 | from __future__ import print_function 8 | from training import Model 9 | from training_record import TrainingRecorder 10 | from img_prep import img_in, img_save, preprocess_image, grey_image 11 | from settings import content_path, style_path, loss_set, result_dir 12 | import requests, time, signal, sys 13 | 14 | 15 | # load content and style image 16 | # record_cache = None 17 | tr = None 18 | 19 | 20 | def signal_term_handler(signal, frame): 21 | global tr 22 | if tr == None: 23 | print('stop training.') 24 | requests.post('http://localhost:8000/setmsg', None, 25 | {'msg': 'stop training.'}) 26 | # sys.exit(0) 27 | else: 28 | print('stop training and save weights into json file.') 29 | requests.post('http://localhost:8000/setmsg', None, 30 | {'msg': 'stop training and save weights into json file.'}) 31 | tr.export_file() 32 | sys.exit(0) 33 | 34 | signal.signal(signal.SIGTERM, signal_term_handler) 35 | 36 | 37 | def start_training(): 38 | 39 | content, style = img_in(content_path, style_path) 40 | global tr 41 | tr = TrainingRecorder(loss_set, result_dir, img_save, '.png') 42 | 43 | idx = tr.get_head() - 1 44 | if idx > 0: 45 | x = preprocess_image(tr.get_name(idx)) 46 | else: 47 | x = content 48 | 49 | idx += 1 50 | 51 | model = Model(content, style, x) 52 | 53 | lst_lr = 1.0 54 | try: 55 | for i in range(idx, 10000): 56 | status = requests.get('http://localhost:8000/status').text 57 | lr = float(requests.get('http://localhost:8000/lr').text) 58 | if status == 'pause': 59 | i -= 1 60 | requests.post('http://localhost:8000/setmsg', None, 61 | {'msg': 'pause'}) 62 | while True: 63 | time.sleep(1) 64 | status = requests.get('http://localhost:8000/status').text 65 | if status != 'pause': 66 | break 67 | elif status == 'training': 68 | print('Start of iteration', i) 69 | requests.post('http://localhost:8000/setmsg', None, {'msg': 'Start of iteration ' + str(i)}) 70 | # msg = 'Start of iteration ' + str(i) 71 | if lst_lr != lr: 72 | # if learning rate has changes, set a new lr for the optimizer 73 | model.set_lr(lr) 74 | loss, result = model.update() 75 | # save current generated image 76 | tr.record(i, loss, result) 77 | lst_lr = lr 78 | elif status == 'stop': 79 | print('stop training and save weights into json file.') 80 | requests.post('http://localhost:8000/setmsg', None, 81 | {'msg': 'stop training and save weights into json file.'}) 82 | # msg = 'stop training and save weights into json file.' 83 | tr.export_file() 84 | break 85 | 86 | except KeyboardInterrupt: 87 | print('stop training and save weights into json file.') 88 | requests.post('http://localhost:8000/setmsg', None, 89 | {'msg': 'stop training and save weights into json file.'}) 90 | tr.export_file() 91 | -------------------------------------------------------------------------------- /static/board.js: -------------------------------------------------------------------------------- 1 | var seriesOptions = [], 2 | seriesCounter = 0, 3 | names = ['total', 'style', 'content', 'total variation']; //['MSFT', 'AAPL', 'GOOG']; 4 | 5 | 6 | var outputs = [] 7 | var title = { 8 | text: 'neural-style board' 9 | }; 10 | var compare = undefined; 11 | 12 | var options = { 13 | title: title, 14 | 15 | subtitle: { 16 | 17 | }, 18 | 19 | chart: { 20 | zoomType: 'x' 21 | }, 22 | 23 | rangeSelector: { 24 | selected: 4 25 | }, 26 | 27 | yAxis: { 28 | //type: 'logarithmic', 29 | labels: { 30 | formatter: function () { 31 | return this.value.toExponential(2) // (this.value > 0 ? ' + ' : '') + this.value + '%'; 32 | } 33 | }, 34 | 35 | plotLines: [{ 36 | value: 0, 37 | width: 2, 38 | color: 'silver' 39 | }] 40 | }, 41 | 42 | xAxis: { 43 | //floor : 10, 44 | tickInterval: 1, 45 | labels: { 46 | formatter: function () { 47 | return this.value 48 | } 49 | }, 50 | plotLines: [{ 51 | value: 0, 52 | width: 2, 53 | color: 'silver' 54 | }] 55 | }, 56 | 57 | plotOptions: { 58 | series: { 59 | //compare: 'percent', //'value',undefined 60 | //compare: 'percent', 61 | cursor: 'pointer', 62 | point: { 63 | events: { 64 | click: function (e) { 65 | 66 | hs.htmlExpand(null, { 67 | pageOrigin: { 68 | x: e.pageX || e.clientX, 69 | y: e.pageY || e.clientY 70 | }, 71 | headingText: this.series.name + ' loss@' + this.x+'=' + this.y.toExponential(3), 72 | maincontentText: '' , 73 | width: 200, 74 | height: 200 75 | }); 76 | } 77 | } 78 | }, 79 | marker: { 80 | lineWidth: 1 81 | } 82 | } 83 | }, 84 | 85 | tooltip: { 86 | shared: true, 87 | crosshairs: true, 88 | pointFormatter: function () { 89 | var change = ''; 90 | if (compare === 'percent') 91 | change = '('+this.change.toFixed(2)+'% )'; 92 | else if (compare === 'value') 93 | change = '('+this.change.toExponential(3)+')' 94 | return ''+ this.series.name +': '+ 95 | this.y.toExponential(3) +change +'
'; 96 | }, 97 | //pointFormat: '{series.name}: {point.y} ({point.change}%)
', 98 | //valueDecimals: 2 99 | }, 100 | series: seriesOptions 101 | } 102 | 103 | 104 | 105 | /** 106 | * Create the chart when all data is loaded 107 | * @returns {undefined} 108 | */ 109 | function createChart() { 110 | $('#container').highcharts(options); 111 | } 112 | 113 | /** 114 | TODO: fix the bug in logarithmic view 115 | */ 116 | //function toLogarithmic() { 117 | // //options.subtitle.text = 'Logarithmic View'; 118 | // options.yAxis.type = 'logarithmic'; 119 | // createChart() 120 | // //options.plotOptions.series.compare = undefined; 121 | // //options.tooltip.pointFormatter = function () { 122 | // // return ''+ this.series.name +': '+ 123 | // // this.y.toExponential(3) + '
' 124 | // //} 125 | // //createChart(); 126 | // var chart = $('#container').highcharts(); 127 | // chart.setTitle(title, {'text': 'Logarithmic View'}); 128 | // chart.yAxis[0].setCompare('null'); 129 | // compare = undefined 130 | // 131 | //} 132 | 133 | function toPercent() { 134 | var chart = $('#container').highcharts(); 135 | chart.setTitle(title, {'text': 'Percent compare View'}); 136 | chart.yAxis[0].setCompare('percent'); 137 | chart.series[3].hide(); 138 | compare = 'percent' 139 | } 140 | 141 | function toValue() { 142 | var chart = $('#container').highcharts(); 143 | chart.setTitle(title, {'text': 'Value compare View'}); 144 | chart.series[3].hide(); 145 | chart.yAxis[0].setCompare('value'); 146 | compare = 'value' 147 | } 148 | 149 | function toDefault() { 150 | var chart = $('#container').highcharts(); 151 | chart.setTitle(title); 152 | chart.series[3].show(); 153 | chart.yAxis[0].setCompare('null'); 154 | compare = undefined 155 | } 156 | 157 | function loadjson(json) { 158 | $(function () { 159 | $.each(names, function (i, name) { 160 | 161 | //$.getJSON(fname, function(data) { 162 | 163 | seriesOptions[i] = { 164 | name: name, 165 | data: json['loss'][name], 166 | }; 167 | 168 | for(var item in json.output) 169 | { 170 | outputs[json.output[item][0]] = json.output[item][1]; 171 | } 172 | 173 | // As we're loading the data asynchronously, we don't know what order it will arrive. So 174 | // we keep a counter and create the chart when all the data is loaded. 175 | seriesCounter += 1; 176 | 177 | if (seriesCounter === names.length) { 178 | createChart(); 179 | toDefault(); 180 | } 181 | //}); 182 | 183 | }); 184 | }); 185 | } 186 | 187 | function getOutputs() { 188 | return outputs; 189 | } 190 | 191 | function setOutputs(output) { 192 | outputs = output; 193 | } 194 | 195 | var updater = { 196 | errorSleepTime: 500, 197 | cursor: null, 198 | 199 | poll: function() { 200 | $.ajax({url: "/json", type: "POST", dataType: "text", 201 | success: updater.onSuccess, 202 | error: updater.onError}); 203 | }, 204 | 205 | onSuccess: function(response) { 206 | try { 207 | updater.newMessages(eval("(" + response + ")")); 208 | } catch (e) { 209 | updater.onError(); 210 | return; 211 | } 212 | updater.errorSleepTime = 500; 213 | window.setTimeout(updater.poll, 0); 214 | }, 215 | 216 | onError: function(response) { 217 | updater.errorSleepTime *= 2; 218 | console.log("Poll error; sleeping for", updater.errorSleepTime, "ms"); 219 | window.setTimeout(updater.poll, updater.errorSleepTime); 220 | }, 221 | 222 | newMessages: function(response) { 223 | if (!response.messages) return; 224 | updater.cursor = response.cursor; 225 | var messages = response.messages; 226 | updater.cursor = messages[messages.length - 1].id; 227 | //console.log(messages.length, "new messages, cursor:", updater.cursor); 228 | for (var i = 0; i < messages.length; i++) { 229 | updater.showMessage(messages[i]); 230 | } 231 | }, 232 | 233 | showMessage: function(message) { 234 | var existing = $("#m" + message.id); 235 | if (existing.length > 0) return; 236 | json = message.json; 237 | //console.log(json) 238 | var chart = $('#container').highcharts(); 239 | if (json !== undefined) { 240 | chart.series[0].addPoint([json['iter'], json['losses'][0]]); 241 | chart.series[1].addPoint([json['iter'], json['losses'][2]]); 242 | chart.series[2].addPoint([json['iter'], json['losses'][1]]); 243 | chart.series[3].addPoint([json['iter'], json['losses'][3]]); 244 | var outputs = getOutputs(); 245 | outputs[json['output'][0]] = json['output'][1]; 246 | setOutputs(outputs); 247 | } 248 | } 249 | }; 250 | 251 | -------------------------------------------------------------------------------- /static/highslide.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Site-specific configuration settings for Highslide JS 3 | */ 4 | hs.graphicsDir = 'https://www.highcharts.com/samples/graphics/highslide/'; 5 | hs.outlineType = 'rounded-white'; 6 | hs.wrapperClassName = 'draggable-header'; 7 | hs.captionEval = 'this.a.title'; 8 | hs.showCredits = false; 9 | hs.marginTop = 20; 10 | hs.marginRight = 20; 11 | hs.marginBottom = 20; 12 | hs.marginLeft = 20; 13 | //hs.allowMultipleInstances = false; -------------------------------------------------------------------------------- /static/highslide/graphics/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/close.png -------------------------------------------------------------------------------- /static/highslide/graphics/closeX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/closeX.png -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar-black-border.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-black-border.gif -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar-text-buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-text-buttons.png -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar-white-small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-white-small.gif -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar-white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-white.gif -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar2.gif -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar3.gif -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar4-hover.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar4-hover.gif -------------------------------------------------------------------------------- /static/highslide/graphics/controlbar4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar4.gif -------------------------------------------------------------------------------- /static/highslide/graphics/fullexpand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/fullexpand.gif -------------------------------------------------------------------------------- /static/highslide/graphics/geckodimmer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/geckodimmer.png -------------------------------------------------------------------------------- /static/highslide/graphics/icon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/icon.gif -------------------------------------------------------------------------------- /static/highslide/graphics/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/loader.gif -------------------------------------------------------------------------------- /static/highslide/graphics/loader.white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/loader.white.gif -------------------------------------------------------------------------------- /static/highslide/graphics/outlines/Outlines.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/Outlines.psd -------------------------------------------------------------------------------- /static/highslide/graphics/outlines/beveled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/beveled.png -------------------------------------------------------------------------------- /static/highslide/graphics/outlines/drop-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/drop-shadow.png -------------------------------------------------------------------------------- /static/highslide/graphics/outlines/glossy-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/glossy-dark.png -------------------------------------------------------------------------------- /static/highslide/graphics/outlines/outer-glow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/outer-glow.png -------------------------------------------------------------------------------- /static/highslide/graphics/outlines/rounded-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/rounded-black.png -------------------------------------------------------------------------------- /static/highslide/graphics/outlines/rounded-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/rounded-white.png -------------------------------------------------------------------------------- /static/highslide/graphics/resize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/resize.gif -------------------------------------------------------------------------------- /static/highslide/graphics/scrollarrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/scrollarrows.png -------------------------------------------------------------------------------- /static/highslide/graphics/zoomin.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/zoomin.cur -------------------------------------------------------------------------------- /static/highslide/graphics/zoomout.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/zoomout.cur -------------------------------------------------------------------------------- /static/highslide/highslide-ie6.css: -------------------------------------------------------------------------------- 1 | .closebutton { 2 | /* NOTE! This URL is relative to the HTML page, not the CSS */ 3 | filter:progid:DXImageTransform.Microsoft.AlphaImageLoader( 4 | src='../highslide/graphics/close.png', sizingMethod='scale'); 5 | 6 | background: none; 7 | cursor: hand; 8 | } 9 | 10 | /* Viewport fixed hack */ 11 | .highslide-viewport { 12 | position: absolute; 13 | left: expression( ( ( ignoreMe1 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); 14 | top: expression( ( ignoreMe2 = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) + 'px' ); 15 | width: expression( ( ( ignoreMe3 = document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) ) + 'px' ); 16 | height: expression( ( ( ignoreMe4 = document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) ) + 'px' ); 17 | } 18 | 19 | /* Thumbstrip PNG fix */ 20 | .highslide-scroll-down, .highslide-scroll-up { 21 | position: relative; 22 | overflow: hidden; 23 | } 24 | .highslide-scroll-down div, .highslide-scroll-up div { 25 | /* NOTE! This URL is relative to the HTML page, not the CSS */ 26 | filter:progid:DXImageTransform.Microsoft.AlphaImageLoader( 27 | src='../highslide/graphics/scrollarrows.png', sizingMethod='scale'); 28 | background: none !important; 29 | position: absolute; 30 | cursor: hand; 31 | width: 75px; 32 | height: 75px !important; 33 | } 34 | .highslide-thumbstrip-horizontal .highslide-scroll-down div { 35 | left: -50px; 36 | top: -15px; 37 | } 38 | .highslide-thumbstrip-horizontal .highslide-scroll-up div { 39 | top: -15px; 40 | } 41 | .highslide-thumbstrip-vertical .highslide-scroll-down div { 42 | top: -50px; 43 | } 44 | 45 | /* Thumbstrip marker arrow trasparent background fix */ 46 | .highslide-thumbstrip .highslide-marker { 47 | border-color: white; /* match the background */ 48 | } 49 | .dark .highslide-thumbstrip-horizontal .highslide-marker { 50 | border-color: #111; 51 | } 52 | .highslide-viewport .highslide-marker { 53 | border-color: #333; 54 | } 55 | .highslide-thumbstrip { 56 | float: left; 57 | } 58 | 59 | /* Positioning fixes for the control bar */ 60 | .text-controls .highslide-controls { 61 | width: 480px; 62 | } 63 | .text-controls a span { 64 | width: 4em; 65 | } 66 | .text-controls .highslide-full-expand a span { 67 | width: 0; 68 | } 69 | .text-controls .highslide-close a span { 70 | width: 0; 71 | } 72 | 73 | /* Special */ 74 | .in-page .highslide-thumbstrip-horizontal .highslide-marker { 75 | border-bottom: gray; 76 | } 77 | -------------------------------------------------------------------------------- /static/highslide/highslide-with-gallery.packed.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Name: Highslide JS 3 | * Version: 5.0.0 (2016-05-24) 4 | * Config: default +slideshow +positioning +transitions +viewport +thumbstrip +packed 5 | * Author: Torstein Hønsi 6 | * Support: www.highslide.com/support 7 | * License: MIT 8 | */ 9 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={18:{9D:\'9t\',9f:\'b6...\',9g:\'8o 1L b7\',9X:\'8o 1L bg 1L bx\',7p:\'bw 1L bl B (f)\',aR:\'bs by 8H 8I\',aY:\'bm 1L bj 8H 8I bv\',8T:\'8C\',8U:\'8D\',8v:\'8E\',8z:\'8J\',8r:\'8J (br)\',bh:\'ba\',8P:\'8G\',8A:\'8G 1g (8B)\',8N:\'8F\',8M:\'8F 1g (8B)\',8S:\'8C (8l 11)\',8O:\'8D (8l 2W)\',8w:\'8E\',8u:\'1:1\',3n:\'b9 %1 b3 %2\',84:\'8o 1L 26 2I, c4 8L c5 1L 3g. c7 8l c0 K 1p 8L 31.\'},4u:\'L/c9/\',5P:\'bX.4J\',5h:\'bH.4J\',7h:54,8n:54,4s:15,9H:15,4n:15,9L:15,4H:bJ,91:0.75,9j:J,7A:5,3G:2,bL:3,59:1f,at:\'42 2W\',aq:1,a3:J,aF:\'bP://L.bQ/\',aE:\'c2\',8V:J,8e:[\'a\'],2X:[],aG:54,3P:0,7G:50,3K:\'2k\',76:\'2k\',8y:H,8x:H,7v:J,4S:8R,5l:8R,5y:J,1B:\'bN-bR\',a7:{2A:\'<7V>\'+\'<1R 2s="L-31">\'+\'\'+\'<23>{m.18.8T}\'+\'\'+\'<1R 2s="L-3i">\'+\'\'+\'<23>{m.18.8P}\'+\'\'+\'<1R 2s="L-2N">\'+\'\'+\'<23>{m.18.8N}\'+\'\'+\'<1R 2s="L-1p">\'+\'\'+\'<23>{m.18.8U}\'+\'\'+\'<1R 2s="L-3g">\'+\'\'+\'<23>{m.18.8v}\'+\'\'+\'<1R 2s="L-19-2D">\'+\'\'+\'<23>{m.18.8u}\'+\'\'+\'<1R 2s="L-26">\'+\'\'+\'<23>{m.18.8z}\'+\'\'+\'\'},4O:[],7e:J,V:[],6Q:[\'5y\',\'36\',\'3K\',\'76\',\'8y\',\'8x\',\'1B\',\'3G\',\'bB\',\'bF\',\'bG\',\'8s\',\'bI\',\'bW\',\'ce\',\'8t\',\'aZ\',\'7v\',\'3D\',\'5b\',\'2X\',\'3P\',\'M\',\'1a\',\'7B\',\'4S\',\'5l\',\'6a\',\'73\',\'9i\',\'2t\',\'2r\',\'aS\',\'aD\',\'1G\'],1x:[],4R:0,7q:{x:[\'9G\',\'11\',\'3W\',\'2W\',\'9M\'],y:[\'51\',\'14\',\'8h\',\'42\',\'6H\']},6m:{},8t:{},8s:{},3v:[],5m:[],45:{},7I:{},5D:[],21:R.cd||8p((5w.6C.5H().2K(/.+(?:8Q|cc|ca|2m)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),2m:(R.5r&&!1A.3r),4t:/cf/.1b(5w.6C),5O:/cg.+8Q:1\\.[0-8].+ci/.1b(5w.6C),$:z(1M){q(1M)D R.ch(1M)},2q:z(2o,3k){2o[2o.T]=3k},1c:z(9y,4m,3J,8b,9m){u C=R.1c(9y);q(4m)m.3a(C,4m);q(9m)m.W(C,{bZ:0,aL:\'1F\',74:0});q(3J)m.W(C,3J);q(8b)8b.2E(C);D C},3a:z(C,4m){K(u x 2Q 4m)C[x]=4m[x];D C},W:z(C,3J){K(u x 2Q 3J){q(m.44&&x==\'1n\'){q(3J[x]>0.99)C.G.c3(\'5A\');I C.G.5A=\'9o(1n=\'+(3J[x]*28)+\')\'}I C.G[x]=3J[x]}},2b:z(C,X,30){u 43,4A,49;q(1q 30!=\'61\'||30===H){u 2Z=9Q;30={3I:2Z[2],2r:2Z[3],6f:2Z[4]}}q(1q 30.3I!=\'3n\')30.3I=54;30.2r=1d[30.2r]||1d.93;30.5J=m.3a({},X);K(u 35 2Q X){u e=24 m.1E(C,30,35);43=8p(m.7U(C,35))||0;4A=8p(X[35]);49=35!=\'1n\'?\'F\':\'\';e.3F(43,4A,49)}},7U:z(C,X){q(C.G[X]){D C.G[X]}I q(R.6O){D R.6O.9P(C,H).9V(X)}I{q(X==\'1n\')X=\'5A\';u 3k=C.ck[X.2j(/\\-(\\w)/g,z(a,b){D b.92()})];q(X==\'5A\')3k=3k.2j(/9o\\(1n=([0-9]+)\\)/,z(a,b){D b/28});D 3k===\'\'?1:3k}},6D:z(){u d=R,w=1A,4T=d.6z&&d.6z!=\'7P\'?d.4k:d.3y,44=m.2m&&(m.21<9||1q 9l==\'1C\');u M=44?4T.8m:(d.4k.8m||5Z.bc),1a=44?4T.aK:5Z.bd;m.41={M:M,1a:1a,5d:44?4T.5d:9l,5u:44?4T.5u:b5};D m.41},6E:z(C){u p={x:C.4d,y:C.9h};4o(C.9k){C=C.9k;p.x+=C.4d;p.y+=C.9h;q(C!=R.3y&&C!=R.4k){p.x-=C.5d;p.y-=C.5u}}D p},2D:z(a,2S,3F,S){q(!a)a=m.1c(\'a\',H,{1u:\'1F\'},m.22);q(1q a.52==\'z\')D 2S;2d{24 m.56(a,2S,3F);D 1f}1W(e){D J}},a6:z(C,4G,U){u 1i=C.2J(4G);K(u i=0;i<1i.T;i++){q((24 5I(U)).1b(1i[i].U)){D 1i[i]}}D H},a9:z(s){s=s.2j(/\\s/g,\' \');u 1T=/{m\\.18\\.([^}]+)\\}/g,58=s.2K(1T),18;q(58)K(u i=0;i<58.T;i++){18=58[i].2j(1T,"$1");q(1q m.18[18]!=\'1C\')s=s.2j(58[i],m.18[18])}D s},9w:z(){u 7J=0,6y=-1,V=m.V,A,1r;K(u i=0;i7J){7J=1r;6y=i}}}q(6y==-1)m.3w=-1;I V[6y].4b()},4Z:z(a,55){a.52=a.2F;u p=a.52?a.52():H;a.52=H;D(p&&1q p[55]!=\'1C\')?p[55]:(1q m[55]!=\'1C\'?m[55]:H)},78:z(a){u 1G=m.4Z(a,\'1G\');q(1G)D 1G;D a.1Y},4N:z(1M){u 3x=m.$(1M),47=m.7I[1M],a={};q(!3x&&!47)D H;q(!47){47=3x.77(J);47.1M=\'\';m.7I[1M]=47;D 3x}I{D 47.77(J)}},3H:z(d){q(d)m.8j.2E(d);m.8j.2T=\'\'},1m:z(A){q(!m.2a){7E=J;m.2a=m.1c(\'Z\',{U:\'L-bp L-1Z-B\',4E:\'\',2F:z(){m.26()}},{1e:\'1D\',1n:0},m.22,J);q(/(bk|bi|bo|bn)/.1b(5w.6C)){u 3y=R.3y;z 7H(){m.W(m.2a,{M:3y.bq+\'F\',1a:3y.bu+\'F\'})}7H();m.1Q(1A,\'3O\',7H)}}m.2a.G.1u=\'\';u 7E=m.2a.4E==\'\';m.2a.4E+=\'|\'+A.P;q(7E){q(m.5O&&m.9q)m.W(m.2a,{9e:\'5W(\'+m.4u+\'b4.97)\',1n:1});I m.2b(m.2a,{1n:A.3P},m.7G)}},7Q:z(P){q(!m.2a)D;q(1q P!=\'1C\')m.2a.4E=m.2a.4E.2j(\'|\'+P,\'\');q((1q P!=\'1C\'&&m.2a.4E!=\'\')||(m.1U&&m.4Z(m.1U,\'3P\')))D;q(m.5O&&m.9q)m.2a.G.1u=\'1F\';I m.2b(m.2a,{1n:0},m.7G,H,z(){m.2a.G.1u=\'1F\'})},83:z(6i,A){u Y=A||m.2h();A=Y;q(m.1U)D 1f;I m.Y=Y;m.3U(R,1A.3r?\'5X\':\'5Y\',m.5t);2d{m.1U=6i;6i.2F()}1W(e){m.Y=m.1U=H}2d{q(!6i||A.2X[1]!=\'4i\')A.26()}1W(e){}D 1f},6g:z(C,1P){u A=m.2h(C);q(A)D m.83(A.6Y(1P),A);I D 1f},31:z(C){D m.6g(C,-1)},1p:z(C){D m.6g(C,1)},5t:z(e){q(!e)e=1A.29;q(!e.2i)e.2i=e.7l;q(1q e.2i.9x!=\'1C\')D J;u A=m.2h();u 1P=H;8Y(e.bK){1I 70:q(A)A.6q();D J;1I 32:1P=2;4P;1I 34:1I 39:1I 40:1P=1;4P;1I 8:1I 33:1I 37:1I 38:1P=-1;4P;1I 27:1I 13:1P=0}q(1P!==H){q(1P!=2)m.3U(R,1A.3r?\'5X\':\'5Y\',m.5t);q(!m.8V)D J;q(e.4F)e.4F();I e.9W=1f;q(A){q(1P==0){A.26()}I q(1P==2){q(A.1g)A.1g.ac()}I{q(A.1g)A.1g.2N();m.6g(A.P,1P)}D 1f}}D J},d1:z(O){m.2q(m.1x,m.3a(O,{1H:\'1H\'+m.4R++}))},cW:z(1h){u 2C=1h.2t;q(1q 2C==\'61\'){K(u i=0;i<2C.T;i++){u o={};K(u x 2Q 1h)o[x]=1h[x];o.2t=2C[i];m.2q(m.5m,o)}}I{m.2q(m.5m,1h)}},86:z(7N,6e){u C,1T=/^L-Q-([0-9]+)$/;C=7N;4o(C.1O){q(C.5B!==1C)D C.5B;q(C.1M&&1T.1b(C.1M))D C.1M.2j(1T,"$1");C=C.1O}q(!6e){C=7N;4o(C.1O){q(C.4G&&m.5U(C)){K(u P=0;P1)D J;q(!e.2i)e.2i=e.7l;u C=e.2i;4o(C.1O&&!(/L-(2I|3g|5S|3O)/.1b(C.U))){C=C.1O}u A=m.2h(C);q(A&&(A.8c||!A.5e))D J;q(A&&e.S==\'aB\'){q(e.2i.9x)D J;u 2K=C.U.2K(/L-(2I|3g|3O)/);q(2K){m.2R={A:A,S:2K[1],11:A.x.E,M:A.x.B,14:A.y.E,1a:A.y.B,9v:e.6d,9u:e.66};m.1Q(R,\'6o\',m.5T);q(e.4F)e.4F();q(/L-(2I|5S)-89/.1b(A.17.U)){A.4b();m.7R=J}D 1f}}I q(e.S==\'aA\'){m.3U(R,\'6o\',m.5T);q(m.2R){q(m.4C&&m.2R.S==\'2I\')m.2R.A.17.G.4c=m.4C;u 3z=m.2R.3z;q(!3z&&!m.7R&&!/(3g|3O)/.1b(m.2R.S)){A.26()}I q(3z||(!3z&&m.cY)){m.2R.A.5f(\'1s\')}m.7R=1f;m.2R=H}I q(/L-2I-89/.1b(C.U)){C.G.4c=m.4C}}D 1f},5T:z(e){q(!m.2R)D J;q(!e)e=1A.29;u a=m.2R,A=a.A;a.5K=e.6d-a.9v;a.7o=e.66-a.9u;u 7s=1d.cl(1d.9r(a.5K,2)+1d.9r(a.7o,2));q(!a.3z)a.3z=(a.S!=\'2I\'&&7s>0)||(7s>(m.da||5));q(a.3z&&e.6d>5&&e.66>5){q(a.S==\'3O\')A.3O(a);I{A.7C(a.11+a.5K,a.14+a.7o);q(a.S==\'2I\')A.17.G.4c=\'3g\'}}D 1f},9n:z(e){2d{q(!e)e=1A.29;u 6p=/di/i.1b(e.S);q(!e.2i)e.2i=e.7l;q(!e.69)e.69=6p?e.do:e.dm;u A=m.2h(e.2i);q(!A.5e)D;q(!A||!e.69||m.2h(e.69,J)==A||m.2R)D;K(u i=0;i=k.1h.3I+k.80){k.4a=k.4A;k.E=k.7X=1;k.85();k.1h.5J[k.X]=J;u 8d=J;K(u i 2Q k.1h.5J)q(k.1h.5J[i]!==J)8d=1f;q(8d){q(k.1h.6f)k.1h.6f.95(k.2G)}D 1f}I{u n=t-k.80;k.7X=n/k.1h.3I;k.E=k.1h.2r(n,0,1,k.1h.3I);k.4a=k.43+((k.4A-k.43)*k.E);k.85()}D J}};m.3a(m.1E,{3l:{1n:z(1E){m.W(1E.2G,{1n:1E.4a})},96:z(1E){2d{q(1E.2G.G&&1E.2G.G[1E.X]!=H)1E.2G.G[1E.X]=1E.4a+1E.49;I 1E.2G[1E.X]=1E.4a}1W(e){}}}});m.5q=z(1B,3Y){k.3Y=3Y;k.1B=1B;u v=m.21,3M;k.7j=m.2m&&m.21<7;q(!1B){q(3Y)3Y();D}m.7c();k.1V=m.1c(\'1V\',{cP:0},{1e:\'1s\',1j:\'2v\',cR:\'cL\',M:0},m.22,J);u 3S=m.1c(\'3S\',H,H,k.1V,1);k.2e=[];K(u i=0;i<=8;i++){q(i%3==0)3M=m.1c(\'3M\',H,{1a:\'2k\'},3S,J);k.2e[i]=m.1c(\'2e\',H,H,3M,J);u G=i!=4?{cK:0,cF:0}:{1j:\'8i\'};m.W(k.2e[i],G)}k.2e[4].U=1B+\' L-16\';k.98()};m.5q.5s={98:z(){u 1G=m.4u+(m.cE||"cD/")+k.1B+".97";u 9a=m.4t&&m.21<6B?m.22:H;k.3f=m.1c(\'1y\',H,{1j:\'2v\',14:\'-4W\'},9a,J);u 7T=k;k.3f.6A=z(){7T.9b()};k.3f.1G=1G},9b:z(){u o=k.1k=k.3f.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1m={1a:(2*o)+\'F\',M:(2*o)+\'F\'};K(u i=0;i<=8;i++){q(E[i]){q(k.7j){u w=(i==1||i==7)?\'28%\':k.3f.M+\'F\';u Z=m.1c(\'Z\',H,{M:\'28%\',1a:\'28%\',1j:\'8i\',3c:\'1s\'},k.2e[i],J);m.1c(\'Z\',H,{5A:"cJ:cn.cv.cw(cS=dk, 1G=\'"+k.3f.1G+"\')",1j:\'2v\',M:w,1a:k.3f.1a+\'F\',11:(E[i][0]*o)+\'F\',14:(E[i][1]*o)+\'F\'},Z,J)}I{m.W(k.2e[i],{9e:\'5W(\'+k.3f.1G+\') \'+(E[i][0]*o)+\'F \'+(E[i][1]*o)+\'F\'})}q(1A.3r&&(i==3||i==5))m.1c(\'Z\',H,1m,k.2e[i],J);m.W(k.2e[i],1m)}}k.3f=H;q(m.45[k.1B])m.45[k.1B].5j();m.45[k.1B]=k;q(k.3Y)k.3Y()},4g:z(E,1k,9d,3t,2r){u A=k.A,dp=A.Q.G,1k=1k||0,E=E||{x:A.x.E+1k,y:A.y.E+1k,w:A.x.N(\'1N\')-2*1k,h:A.y.N(\'1N\')-2*1k};q(9d)k.1V.G.1e=(E.h>=4*k.1k)?\'1D\':\'1s\';m.W(k.1V,{11:(E.x-k.1k)+\'F\',14:(E.y-k.1k)+\'F\',M:(E.w+2*k.1k)+\'F\'});E.w-=2*k.1k;E.h-=2*k.1k;m.W(k.2e[4],{M:E.w>=0?E.w+\'F\':0,1a:E.h>=0?E.h+\'F\':0});q(k.7j)k.2e[3].G.1a=k.2e[5].G.1a=k.2e[4].G.1a},5j:z(9c){q(9c)k.1V.G.1e=\'1s\';I m.3H(k.1V)}};m.68=z(A,1m){k.A=A;k.1m=1m;k.3o=1m==\'x\'?\'au\':\'ao\';k.3A=k.3o.5H();k.5i=1m==\'x\'?\'ag\':\'ab\';k.6s=k.5i.5H();k.71=1m==\'x\'?\'a4\':\'ah\';k.90=k.71.5H();k.1o=k.2z=0};m.68.5s={N:z(P){8Y(P){1I\'6U\':D k.1K+k.3p+(k.t-m.1S[\'1k\'+k.3o])/2;1I\'6J\':D k.E+k.cb+k.1o+(k.B-m.1S[\'1k\'+k.3o])/2;1I\'1N\':D k.B+2*k.cb+k.1o+k.2z;1I\'4r\':D k.3X-k.2O-k.3V;1I\'6V\':D k.N(\'4r\')-2*k.cb-k.1o-k.2z;1I\'53\':D k.E-(k.A.16?k.A.16.1k:0);1I\'7M\':D k.N(\'1N\')+(k.A.16?2*k.A.16.1k:0);1I\'2f\':D k.1z?1d.2y((k.B-k.1z)/2):0}},7f:z(){k.cb=(k.A.17[\'1k\'+k.3o]-k.t)/2;k.3V=m[\'74\'+k.71]},72:z(){k.t=k.A.C[k.3A]?7L(k.A.C[k.3A]):k.A.C[\'1k\'+k.3o];k.1K=k.A.1K[k.1m];k.3p=(k.A.C[\'1k\'+k.3o]-k.t)/2;q(k.1K==0||k.1K==-1){k.1K=(m.41[k.3A]/2)+m.41[\'1J\'+k.5i]}},6S:z(){u A=k.A;k.2p=\'2k\';q(A.76==\'3W\')k.2p=\'3W\';I q(24 5I(k.6s).1b(A.3K))k.2p=H;I q(24 5I(k.90).1b(A.3K))k.2p=\'5n\';k.E=k.1K-k.cb+k.3p;q(k.73&&k.1m==\'x\')A.6a=1d.2Y(A.6a||k.19,A.73*k.19/A.y.19);k.B=1d.2Y(k.19,A[\'5n\'+k.3o]||k.19);k.2n=A.5y?1d.2Y(A[\'2Y\'+k.3o],k.19):k.19;q(A.3B&&A.36){k.B=A[k.3A];k.1z=k.19}q(k.1m==\'x\'&&m.59)k.2n=A.4S;k.2i=A[\'2i\'+k.1m.92()];k.2O=m[\'74\'+k.5i];k.1J=m.41[\'1J\'+k.5i];k.3X=m.41[k.3A]},82:z(i){u A=k.A;q(A.3B&&(A.36||m.59)){k.1z=i;k.B=1d.5n(k.B,k.1z);A.17.G[k.6s]=k.N(\'2f\')+\'F\'}I k.B=i;A.17.G[k.3A]=i+\'F\';A.Q.G[k.3A]=k.N(\'1N\')+\'F\';q(A.16)A.16.4g();q(k.1m==\'x\'&&A.1l)A.4j(J);q(k.1m==\'x\'&&A.1g&&A.3B){q(i==k.19)A.1g.4B(\'19-2D\');I A.1g.3Z(\'19-2D\')}},7Z:z(i){k.E=i;k.A.Q.G[k.6s]=i+\'F\';q(k.A.16)k.A.16.4g()}};m.56=z(a,2S,3F,2P){q(R.cG&&m.2m&&!m.7i){m.1Q(R,\'3u\',z(){24 m.56(a,2S,3F,2P)});D}k.a=a;k.3F=3F;k.2P=2P||\'2I\';k.3B=!k.cQ;m.7e=1f;k.1x=[];k.Y=m.Y;m.Y=H;m.7c();u P=k.P=m.V.T;K(u i=0;ip.1J+p.3X-p.3V)p.E=p.1J+p.3X-p.B-p.2O-p.3V-p.1o-p.2z;q(p.E(k.x.1z||k.x.B)){k.ap();q(k.1x.T==1)k.4j()}}k.b1()}1W(e){k.7D(e)}},2p:z(p,4w){u 46,2l=p.2i,1m=p==k.x?\'x\':\'y\';q(2l&&2l.2K(/ /)){46=2l.d3(\' \');2l=46[0]}q(2l&&m.$(2l)){p.E=m.6E(m.$(2l))[1m];q(46&&46[1]&&46[1].2K(/^[-]?[0-9]+F$/))p.E+=7L(46[1]);q(p.Bp.1J+p.3X-p.3V){q(!4w&&7a&&4K){p.B=1d.2Y(p.B,p.N(1m==\'y\'?\'4r\':\'6V\'))}I q(p.N(\'1N\')2x){ 2B=3b*2x;q(2Bk.5l&&x.B>k.4S&&y.N(\'1N\')>y.N(\'4r\')){y.B-=10;q(2x)x.B=y.B*2x;k.4j(0,1);3e=J}}D 3e},b1:z(){u x=k.x,y=k.y;k.5f(\'1s\');q(k.1g&&k.1g.2g)k.1g.2g.4z();k.8f(1,{Q:{M:x.N(\'1N\'),1a:y.N(\'1N\'),11:x.E,14:y.E},17:{11:x.1o+x.N(\'2f\'),14:y.1o+y.N(\'2f\'),M:x.1z||x.B,1a:y.1z||y.B}},m.7h)},8f:z(1t,1L,3t){u 5p=k.2X,6I=1t?(k.Y?k.Y.a:H):m.1U,t=(5p[1]&&6I&&m.4Z(6I,\'2X\')[1]==5p[1])?5p[1]:5p[0];q(k[t]&&t!=\'2D\'){k[t](1t,1L);D}q(k.16&&!k.3G){q(1t)k.16.4g();I k.16.5j()}q(!1t)k.6l();u A=k,x=A.x,y=A.y,2r=k.2r;q(!1t)2r=k.aS||2r;u ay=1t?z(){q(A.16)A.16.1V.G.1e="1D";4q(z(){A.6n()},50)}:z(){A.5g()};q(1t)m.W(k.Q,{M:x.t+\'F\',1a:y.t+\'F\'});q(k.aD){m.W(k.Q,{1n:1t?0:1});m.3a(1L.Q,{1n:1t})}m.2b(k.Q,1L.Q,{3I:3t,2r:2r,3l:z(3k,2Z){q(A.16&&A.3G&&2Z.X==\'14\'){u 5o=1t?2Z.E:1-2Z.E;u E={w:x.t+(x.N(\'1N\')-x.t)*5o,h:y.t+(y.N(\'1N\')-y.t)*5o,x:x.1K+(x.E-x.1K)*5o,y:y.1K+(y.E-y.1K)*5o};A.16.4g(E,0,1)}}});m.2b(k.17,1L.17,3t,2r,ay);q(1t){k.Q.G.1e=\'1D\';k.17.G.1e=\'1D\';k.a.U+=\' L-48-3K\'}},4U:z(1t,1L){k.3G=1f;u A=k,t=1t?m.7h:0;q(1t){m.2b(k.Q,1L.Q,0);m.W(k.Q,{1n:0,1e:\'1D\'});m.2b(k.17,1L.17,0);k.17.G.1e=\'1D\';m.2b(k.Q,{1n:1},t,H,z(){A.6n()})}q(k.16){k.16.1V.G.1r=k.Q.G.1r;u 5R=1t||-1,1k=k.16.1k,6R=1t?3:1k,6K=1t?1k:3;K(u i=6R;5R*i<=5R*6K;i+=5R,t+=25){(z(){u o=1t?6K-i:6R-i;4q(z(){A.16.4g(0,o,1)},t)})()}}q(1t){}I{4q(z(){q(A.16)A.16.5j(A.cm);A.6l();m.2b(A.Q,{1n:0},m.8n,H,z(){A.5g()})},t)}},4i:z(1t,1L,7b){q(!1t)D;u A=k,Y=k.Y,x=k.x,y=k.y,2V=Y.x,2U=Y.y,Q=k.Q,17=k.17,1l=k.1l;m.3U(R,\'6o\',m.5T);m.W(17,{M:(x.1z||x.B)+\'F\',1a:(y.1z||y.B)+\'F\'});q(1l)1l.G.3c=\'1D\';k.16=Y.16;q(k.16)k.16.A=A;Y.16=H;u 4x=m.1c(\'Z\',{U:\'L-\'+k.2P},{1j:\'2v\',1r:4,3c:\'1s\',1u:\'1F\'});u 64={aN:Y,aQ:k};K(u n 2Q 64){k[n]=64[n].17.77(!64[n].cq);m.W(k[n],{1j:\'2v\',aL:0,1e:\'1D\'});4x.2E(k[n])}Q.2E(4x);q(1l){1l.U=\'\';Q.2E(1l)}4x.G.1u=\'\';Y.17.G.1u=\'1F\';q(m.4t&&m.21<6B){k.Q.G.1e=\'1D\'}m.2b(Q,{M:x.B},{3I:m.aG,3l:z(3k,2Z){u E=2Z.E,4f=1-E;u X,B={},6P=[\'E\',\'B\',\'1o\',\'2z\'];K(u n 2Q 6P){X=6P[n];B[\'x\'+X]=1d.2y(4f*2V[X]+E*x[X]);B[\'y\'+X]=1d.2y(4f*2U[X]+E*y[X]);B.aJ=1d.2y(4f*(2V.1z||2V.B)+E*(x.1z||x.B));B.65=1d.2y(4f*2V.N(\'2f\')+E*x.N(\'2f\'));B.aM=1d.2y(4f*(2U.1z||2U.B)+E*(y.1z||y.B));B.6G=1d.2y(4f*2U.N(\'2f\')+E*y.N(\'2f\'))}q(A.16)A.16.4g({x:B.2H,y:B.2L,w:B.4V+B.3s+B.6L+2*x.cb,h:B.4X+B.3C+B.6T+2*y.cb});Y.Q.G.cB=\'cC(\'+(B.2L-2U.E)+\'F, \'+(B.4V+B.3s+B.6L+B.2H+2*2V.cb-2V.E)+\'F, \'+(B.4X+B.3C+B.6T+B.2L+2*2U.cb-2U.E)+\'F, \'+(B.2H-2V.E)+\'F)\';m.W(17,{14:(B.3C+y.N(\'2f\'))+\'F\',11:(B.3s+x.N(\'2f\'))+\'F\',4n:(y.E-B.2L)+\'F\',4s:(x.E-B.2H)+\'F\'});m.W(Q,{14:B.2L+\'F\',11:B.2H+\'F\',M:(B.3s+B.6L+B.4V+2*x.cb)+\'F\',1a:(B.3C+B.6T+B.4X+2*y.cb)+\'F\'});m.W(4x,{M:(B.aJ||B.4V)+\'F\',1a:(B.aM||B.4X)+\'F\',11:(B.3s+B.65)+\'F\',14:(B.3C+B.6G)+\'F\',1e:\'1D\'});m.W(A.aN,{14:(2U.E-B.2L+2U.1o-B.3C+2U.N(\'2f\')-B.6G)+\'F\',11:(2V.E-B.2H+2V.1o-B.3s+2V.N(\'2f\')-B.65)+\'F\'});m.W(A.aQ,{1n:E,14:(y.E-B.2L+y.1o-B.3C+y.N(\'2f\')-B.6G)+\'F\',11:(x.E-B.2H+x.1o-B.3s+x.N(\'2f\')-B.65)+\'F\'});q(1l)m.W(1l,{M:B.4V+\'F\',1a:B.4X+\'F\',11:(B.3s+x.cb)+\'F\',14:(B.3C+y.cb)+\'F\'})},6f:z(){Q.G.1e=17.G.1e=\'1D\';17.G.1u=\'4D\';m.3H(4x);A.6n();Y.5g();A.Y=H}})},9N:z(o,C){q(!k.Y)D 1f;K(u i=0;i\'+s+\'\'+k[k.5b].2T}}},aH:z(){q(!k.Y){K(u i=0;ik.x.N(\'53\')+k.x.N(\'7M\'));u a0=(3h.y+3h.hk.y.N(\'53\')+k.y.N(\'7M\'))}u 5M=m.86(1i[i]);q(!a1&&!a0&&5M!=k.P){q(!2u){1i[i].4M(\'1s-by\',\'[\'+k.P+\']\');1i[i].88=1i[i].G[X];1i[i].G[X]=\'1s\'}I q(2u.9Z(\'[\'+k.P+\']\')==-1){1i[i].4M(\'1s-by\',2u+\'[\'+k.P+\']\')}}I q((2u==\'[\'+k.P+\']\'||m.3w==5M)&&5M!=k.P){1i[i].4M(\'1s-by\',\'\');1i[i].G[X]=1i[i].88||\'\'}I q(2u&&2u.9Z(\'[\'+k.P+\']\')>-1){1i[i].4M(\'1s-by\',2u.2j(\'[\'+k.P+\']\',\'\'))}}}}},4b:z(){k.Q.G.1r=m.4H+=2;K(u i=0;iO.1O.2c)O.G.M=\'28%\'}I q(O.1O!=k.1l)k.1l.2E(O);q(/11$/.1b(p))O.G.11=5E+\'F\';q(/3W$/.1b(p))m.W(O,{11:\'50%\',4s:(5E-1d.2y(O.2c/2))+\'F\'});q(/2W$/.1b(p))O.G.2W=-5E+\'F\';q(/^9G$/.1b(p)){m.W(O,{2W:\'28%\',9H:k.x.cb+\'F\',14:-k.y.cb+\'F\',42:-k.y.cb+\'F\',3c:\'2k\'});k.x.1o=O.2c}I q(/^9M$/.1b(p)){m.W(O,{11:\'28%\',4s:k.x.cb+\'F\',14:-k.y.cb+\'F\',42:-k.y.cb+\'F\',3c:\'2k\'});k.x.2z=O.2c}u 8g=O.1O.3j;O.G.1a=\'2k\';q(4y&&O.3j>8g)O.G.1a=m.3E?8g+\'F\':\'28%\';q(/^14/.1b(p))O.G.14=5C+\'F\';q(/^8h/.1b(p))m.W(O,{14:\'50%\',4n:(5C-1d.2y(O.3j/2))+\'F\'});q(/^42/.1b(p))O.G.42=-5C+\'F\';q(/^51$/.1b(p)){m.W(O,{11:(-k.x.1o-k.x.cb)+\'F\',2W:(-k.x.2z-k.x.cb)+\'F\',42:\'28%\',9L:k.y.cb+\'F\',M:\'2k\'});k.y.1o=O.3j}I q(/^6H$/.1b(p)){m.W(O,{1j:\'8i\',11:(-k.x.1o-k.x.cb)+\'F\',2W:(-k.x.2z-k.x.cb)+\'F\',14:\'28%\',4n:k.y.cb+\'F\',M:\'2k\'});k.y.2z=O.3j;O.G.1j=\'2v\'}},9I:z(){k.9J([\'6x\',\'dh\'],J);k.a2();q(k.6x&&k.7v)k.6x.U+=\' L-3g\';q(m.a3)k.an();K(u i=0;i0)4I=0;q(2w>0)2w=0;q(2w<4I)2w=4I}I{K(u j=0;j0?as[i-1].1O[4d]:3L[4d],7x=3L[4d]+3L[2c]+(as[i+1]?as[i+1].1O[2c]:0);q(7x>6u-4L)2w=6u-7x;I q(7F<-4L)2w=-7F}u 7r=3L[4d]+(3L[2c]-63[2c])/2+2w;m.2b(1V,3q?{11:2w}:{14:2w},H,\'7n\');m.2b(63,3q?{11:7r}:{14:7r},H,\'7n\');7Y.G.1u=2w<0?\'4D\':\'1F\';8a.G.1u=(2w>4I)?\'4D\':\'1F\'};u 5c=m.3T.2M[m.V[1g.3N].2t||\'1F\'],1h=1g.2g,4v=1h.4v||\'ak\',81=(4v==\'bz\'),3Q=81?[\'Z\',\'7V\',\'1R\',\'23\']:[\'1V\',\'3S\',\'3M\',\'2e\'],3q=(4v==\'ak\'),3R=m.1c(\'Z\',{U:\'L-2g L-2g-\'+4v,2T:\'\'+\'<\'+3Q[0]+\'><\'+3Q[1]+\'>\'+\'\'+\'\'+\'\'},{1u:\'1F\'},m.22),5z=3R.6b,Z=5z[0],7Y=5z[1],8a=5z[2],63=5z[3],1V=Z.bb,3S=3R.2J(3Q[1])[0],3M;K(u i=0;i<5c.T;i++){q(i==0||!3q)3M=m.1c(3Q[2],H,H,3S);(z(){u a=5c[i],3L=m.1c(3Q[3],H,H,3M),c6=i;m.1c(\'a\',{1Y:a.1Y,1X:a.1X,2F:z(){q(/L-48-3K/.1b(k.U))D 1f;m.2h(k).4b();D m.83(a)},2T:m.9K?m.9K(a):a.2T},H,3L)})()}q(!81){7Y.2F=z(){1J(-1)};8a.2F=z(){1J(1)};m.1Q(3S,R.bA!==1C?\'bY\':\'c8\',z(e){u 3d=0;e=e||1A.29;q(e.9F){3d=e.9F/cj;q(m.3r)3d=-3d}I q(e.9O){3d=-e.9O/3}q(3d)1J(-3d*0.2);q(e.4F)e.4F();e.9W=1f})}D{6c:6c,4z:4z}};m.5L=m.18;u bC=m.56;q(m.2m&&1A==1A.14){(z(){2d{R.4k.bD(\'11\')}1W(e){4q(9Q.bE,50);D}m.3u()})()}m.1Q(R,\'bM\',m.3u);m.1Q(1A,\'az\',m.3u);m.1Q(R,\'3u\',z(){q(m.5P||m.3P){u G=m.1c(\'G\',{S:\'bT/7U\'},H,R.2J(\'bU\')[0]),8k=R.6z==\'7P\';z 5k(7w,7W){q(m.2m&&(m.21<9||8k)){u Y=R.9S[R.9S.T-1];q(1q(Y.5k)=="61")Y.5k(7w,7W)}I{G.2E(R.bV(7w+" {"+7W+"}"))}}z 5x(X){D\'bS( ( ( bO = R.4k.\'+X+\' ? R.4k.\'+X+\' : R.3y.\'+X+\' ) ) + \\\'F\\\' );\'}q(m.5P)5k(\'.L 1y\',\'4c: 5W(\'+m.4u+m.5P+\'), 5F !c1;\');5k(\'.L-1Z-B\',m.2m&&(m.21<7||8k)?\'1j: 2v; \'+\'11:\'+5x(\'5d\')+\'14:\'+5x(\'5u\')+\'M:\'+5x(\'8m\')+\'1a:\'+5x(\'aK\'):\'1j: be; M: 28%; 1a: 28%; 11: 0; 14: 0\')}});m.1Q(1A,\'3O\',z(){m.6D();q(m.1Z)K(u i=0;i35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1e:{77:\'9f\',8z:\'cp...\',92:\'7e 2d cB\',9r:\'7e 2d cD 2d bY\',9Z:\'bX 2d bV G (f)\',9G:\'cF by 8d 8j\',9K:\'d5 2d d7 8d 8j dg\',8A:\'8o\',8Z:\'9h\',96:\'93\',9e:\'8u\',97:\'8u (dj)\',9c:\'de\',d2:\'8k\',d3:\'8k 8s (8h)\',cO:\'8v\',bS:\'8v 8s (8h)\',91:\'8o (7o 1f)\',8Y:\'9h (7o 2H)\',90:\'93\',aO:\'1:1\',7B:\'7e 2d 2a 2E, aP 94 aL 2d 3z. aK 7o aJ Y 1L 94 5I.\'},4D:\'U/aH/\',5V:\'bE.6y\',52:\'bQ.6y\',6N:6d,a6:6d,4j:15,6B:15,3F:15,6h:15,3Y:bu,8g:0.75,6o:J,7D:5,3k:2,aR:3,58:1m,a0:\'3S 2H\',9V:1,a2:J,9F:\'b9://U.b3/\',ah:\'aX\',8U:J,87:[\'a\'],5h:1m,5n:J,4g:J,2S:\'57\',6L:J,7M:J,3E:95,4F:95,53:J,1y:\'aY-aZ\',8L:{8S:\'<1h 3s="U-b1"><9d>\'+\'<3m 3s="U-5I">\'+\'\'+\'<2o>{m.1e.8A}\'+\'\'+\'<3m 3s="U-1L">\'+\'\'+\'<2o>{m.1e.8Z}\'+\'\'+\'<3m 3s="U-3z">\'+\'\'+\'<2o>{m.1e.96}\'+\'\'+\'<3m 3s="U-2a">\'+\'\'+\'<2o>{m.1e.9e}\'+\'\'+\'\'+\'<1h 3s="U-V">\'+\'<1h 3s="U-b8"><1h>\'+\'<2o 3s="U-3q" 2D="{m.1e.9c}"><2o>\'+\'\'},4A:[],7m:J,P:[],7k:[\'53\',\'2K\',\'1y\',\'3k\',\'b7\',\'aI\',\'aQ\',\'8W\',\'aM\',\'aN\',\'b5\',\'9a\',\'9J\',\'7M\',\'K\',\'M\',\'6W\',\'5h\',\'5n\',\'4g\',\'bG\',\'be\',\'bC\',\'2b\',\'6L\',\'3b\',\'3D\',\'2S\',\'6R\',\'8a\',\'3E\',\'4F\',\'5l\',\'6p\',\'8x\',\'3U\',\'2c\',\'an\',\'aF\',\'S\'],1P:[],4t:0,bJ:{x:[\'ae\',\'1f\',\'6I\',\'2H\',\'ad\'],y:[\'54\',\'18\',\'7T\',\'3S\',\'5M\']},5Y:{},9a:{},8W:{},6R:{aA:{},1E:{},aB:{}},3d:[],3x:{},3L:[],5T:[],3Z:[],65:{},7f:{},5u:[],29:N.bK||6J((4G.6u.5x().2Z(/.+(?:8V|bL|bM|1M)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1M:(N.4r&&!1w.36),56:/bz/.1a(4G.6u),8b:/bx.+8V:1\\.[0-8].+bk/.1a(4G.6u),$:B(1i){q(1i)D N.6m(1i)},22:B(1R,2P){1R[1R.1c]=2P},14:B(8I,3g,3o,4y,8G){u C=N.14(8I);q(3g)m.3r(C,3g);q(8G)m.Q(C,{7i:0,aj:\'2e\',6q:0});q(3o)m.Q(C,3o);q(4y)4y.1F(C);D C},3r:B(C,3g){Y(u x 3C 3g)C[x]=3g[x];D C},Q:B(C,3o){Y(u x 3C 3o){q(m.31&&x==\'1C\'){q(3o[x]>0.99)C.F.bv(\'4W\');L C.F.4W=\'8F(1C=\'+(3o[x]*2t)+\')\'}L C.F[x]=3o[x]}},43:B(C,1b,2M){u 3G,4e,3J;q(1t 2M!=\'6O\'||2M===H){u 2L=ak;2M={3y:2L[2],2c:2L[3],7P:2L[4]}}q(1t 2M.3y!=\'4o\')2M.3y=6d;2M.2c=1r[2M.2c]||1r.8D;2M.5m=m.3r({},1b);Y(u 2C 3C 1b){u e=1x m.1B(C,2M,2C);3G=6J(m.6s(C,2C))||0;4e=6J(1b[2C]);3J=2C!=\'1C\'?\'E\':\'\';e.2G(3G,4e,3J)}},6s:B(C,1b){q(C.F[1b]){D C.F[1b]}L q(N.7O){D N.7O.9j(C,H).9k(1b)}L{q(1b==\'1C\')1b=\'4W\';u 2P=C.4s[1b.2h(/\\-(\\w)/g,B(a,b){D b.br()})];q(1b==\'4W\')2P=2P.2h(/8F\\(1C=([0-9]+)\\)/,B(a,b){D b/2t});D 2P===\'\'?1:2P}},5X:B(){u d=N,w=1w,4P=d.61&&d.61!=\'6H\'?d.45:d.V,31=m.1M&&(m.29<9||1t 8C==\'1X\');u K=31?4P.8B:(d.45.8B||5r.bs),M=31?4P.bt:5r.bw;m.3t={K:K,M:M,5k:31?4P.5k:8C,5f:31?4P.5f:bh};D m.3t},7K:B(C){u p={x:C.8K,y:C.7l};4a(C.8E){C=C.8E;p.x+=C.8K;p.y+=C.7l;q(C!=N.V&&C!=N.45){p.x-=C.5k;p.y-=C.5f}}D p},4N:B(a,1E,2G,T){q(!a)a=m.14(\'a\',H,{1N:\'2e\'},m.1S);q(1t a.4T==\'B\')D 1E;q(T==\'2O\'){Y(u i=0;i6C){6C=1s;6a=i}}}q(6a==-1)m.2n=-1;L P[6a].3h()},4k:B(a,4U){a.4T=a.2Q;u p=a.4T?a.4T():H;a.4T=H;D(p&&1t p[4U]!=\'1X\')?p[4U]:(1t m[4U]!=\'1X\'?m[4U]:H)},5G:B(a){u S=m.4k(a,\'S\');q(S)D S;D a.2y},3R:B(1i){u 1D=m.$(1i),3H=m.7f[1i],a={};q(!1D&&!3H)D H;q(!3H){3H=1D.5b(J);3H.1i=\'\';m.7f[1i]=3H;D 1D}L{D 3H.5b(J)}},3f:B(d){q(d)m.6x.1F(d);m.6x.2r=\'\'},8M:B(8c,A){u 3i=A||m.3n();A=3i;q(m.3I)D 1m;L m.3i=3i;m.3V(N,1w.36?\'5v\':\'5q\',m.4E);1k{m.3I=8c;8c.2Q()}1l(e){m.3i=m.3I=H}1k{A.2a()}1l(e){}D 1m},5C:B(C,2w){u A=m.3n(C);q(A)D m.8M(A.6D(2w),A);L D 1m},5I:B(C){D m.5C(C,-1)},1L:B(C){D m.5C(C,1)},4E:B(e){q(!e)e=1w.1Z;q(!e.2j)e.2j=e.7R;q(1t e.2j.6K!=\'1X\')D J;u A=m.3n();u 2w=H;9b(e.bR){1H 70:q(A)A.7H();D J;1H 32:1H 34:1H 39:1H 40:2w=1;7A;1H 8:1H 33:1H 37:1H 38:2w=-1;7A;1H 27:1H 13:2w=0}q(2w!==H){m.3V(N,1w.36?\'5v\':\'5q\',m.4E);q(!m.8U)D J;q(e.5R)e.5R();L e.bd=1m;q(A){q(2w==0){A.2a()}L{m.5C(A.R,2w)}D 1m}}D J},b4:B(16){m.22(m.1P,m.3r(16,{2R:\'2R\'+m.4t++}))},7I:B(7z,5E){u C,2A=/^U-11-([0-9]+)$/;C=7z;4a(C.2W){q(C.1i&&2A.1a(C.1i))D C.1i.2h(2A,"$1");C=C.2W}q(!5E){C=7z;4a(C.2W){q(C.4b&&m.5w(C)){Y(u R=0;R1)D J;q(!e.2j)e.2j=e.7R;u C=e.2j;4a(C.2W&&!(/U-(2E|3z|2O|3q)/.1a(C.1p))){C=C.2W}u A=m.3n(C);q(A&&(A.4v||!A.4l))D J;q(A&&e.T==\'74\'){q(e.2j.6K)D J;u 2Z=C.1p.2Z(/U-(2E|3z|3q)/);q(2Z){m.2g={A:A,T:2Z[1],1f:A.x.I,K:A.x.G,18:A.y.I,M:A.y.G,8w:e.60,8r:e.5Z};m.1Q(N,\'6T\',m.7s);q(e.5R)e.5R();q(/U-(2E|2O)-7r/.1a(A.O.1p)){A.3h();m.7t=J}D 1m}L q(/U-2O/.1a(C.1p)&&m.2n!=A.R){A.3h();A.4m(\'1n\')}}L q(e.T==\'9t\'){m.3V(N,\'6T\',m.7s);q(m.2g){q(m.44&&m.2g.T==\'2E\')m.2g.A.O.F.3A=m.44;u 3p=m.2g.3p;q(!3p&&!m.7t&&!/(3z|3q)/.1a(m.2g.T)){A.2a()}L q(3p||(!3p&&m.8t)){m.2g.A.4m(\'1n\')}q(m.2g.A.2V)m.2g.A.2V.F.1N=\'2e\';m.7t=1m;m.2g=H}L q(/U-2E-7r/.1a(C.1p)){C.F.3A=m.44}}D 1m},7s:B(e){q(!m.2g)D J;q(!e)e=1w.1Z;u a=m.2g,A=a.A;q(A.W){q(!A.2V)A.2V=m.14(\'1h\',H,{1d:\'21\',K:A.x.G+\'E\',M:A.y.G+\'E\',1f:A.x.cb+\'E\',18:A.y.cb+\'E\',1s:4,8P:(m.31?\'b0\':\'2e\'),1C:0.bi},A.11,J);q(A.2V.F.1N==\'2e\')A.2V.F.1N=\'\'}a.59=e.60-a.8w;a.5e=e.5Z-a.8r;u 7y=1r.cE(1r.8n(a.59,2)+1r.8n(a.5e,2));q(!a.3p)a.3p=(a.T!=\'2E\'&&7y>0)||(7y>(m.cT||5));q(a.3p&&e.60>5&&e.5Z>5){q(a.T==\'3q\')A.3q(a);L{A.7E(a.1f+a.59,a.18+a.5e);q(a.T==\'2E\')A.O.F.3A=\'3z\'}}D 1m},8l:B(e){1k{q(!e)e=1w.1Z;u 5N=/cW/i.1a(e.T);q(!e.2j)e.2j=e.7R;q(!e.5L)e.5L=5N?e.d1:e.d0;u A=m.3n(e.2j);q(!A.4l)D;q(!A||!e.5L||m.3n(e.5L,J)==A||m.2g)D;Y(u i=0;i=k.1O.3y+k.7v){k.3N=k.4e;k.I=k.7q=1;k.7C();k.1O.5m[k.1b]=J;u 7Q=J;Y(u i 3C k.1O.5m)q(k.1O.5m[i]!==J)7Q=1m;q(7Q){q(k.1O.7P)k.1O.7P.8X(k.2k)}D 1m}L{u n=t-k.7v;k.7q=n/k.1O.3y;k.I=k.1O.2c(n,0,1,k.1O.3y);k.3N=k.3G+((k.4e-k.3G)*k.I);k.7C()}D J}};m.3r(m.1B,{3c:{1C:B(1B){m.Q(1B.2k,{1C:1B.3N})},8H:B(1B){1k{q(1B.2k.F&&1B.2k.F[1B.1b]!=H)1B.2k.F[1B.1b]=1B.3N+1B.3J;L 1B.2k[1B.1b]=1B.3N}1l(e){}}}});m.55=B(1y,2F){k.2F=2F;k.1y=1y;u v=m.29,5d;k.6M=m.1M&&m.29<7;q(!1y){q(2F)2F();D}m.64();k.2m=m.14(\'2m\',{d4:0},{1q:\'1n\',1d:\'21\',d8:\'d9\',K:0},m.1S,J);u 80=m.14(\'80\',H,H,k.2m,1);k.24=[];Y(u i=0;i<=8;i++){q(i%3==0)5d=m.14(\'5d\',H,{M:\'1J\'},80,J);k.24[i]=m.14(\'24\',H,H,5d,J);u F=i!=4?{dd:0,dc:0}:{1d:\'3w\'};m.Q(k.24[i],F)}k.24[4].1p=1y+\' U-1o\';k.8R()};m.55.4Q={8R:B(){u S=m.4D+(m.db||"da/")+k.1y+".cM";u 8N=m.56&&m.29<8p?m.1S:H;k.30=m.14(\'1u\',H,{1d:\'21\',18:\'-3P\'},8N,J);u 3a=k;k.30.3O=B(){3a.8O()};k.30.S=S},8O:B(){u o=k.1v=k.30.K/4,I=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1G={M:(2*o)+\'E\',K:(2*o)+\'E\'};Y(u i=0;i<=8;i++){q(I[i]){q(k.6M){u w=(i==1||i==7)?\'2t%\':k.30.K+\'E\';u 1h=m.14(\'1h\',H,{K:\'2t%\',M:\'2t%\',1d:\'3w\',1T:\'1n\'},k.24[i],J);m.14(\'1h\',H,{4W:"c8:c7.a7.c6(c5=c9, S=\'"+k.30.S+"\')",1d:\'21\',K:w,M:k.30.M+\'E\',1f:(I[i][0]*o)+\'E\',18:(I[i][1]*o)+\'E\'},1h,J)}L{m.Q(k.24[i],{8P:\'7h(\'+k.30.S+\') \'+(I[i][0]*o)+\'E \'+(I[i][1]*o)+\'E\'})}q(1w.36&&(i==3||i==5))m.14(\'1h\',H,1G,k.24[i],J);m.Q(k.24[i],1G)}}k.30=H;q(m.3x[k.1y])m.3x[k.1y].5D();m.3x[k.1y]=k;q(k.2F)k.2F()},4J:B(I,1v,8Q,3u,2c){u A=k.A,4x=A.11.F,1v=1v||0,I=I||{x:A.x.I+1v,y:A.y.I+1v,w:A.x.19(\'1K\')-2*1v,h:A.y.19(\'1K\')-2*1v};q(8Q)k.2m.F.1q=(I.h>=4*k.1v)?\'2l\':\'1n\';m.Q(k.2m,{1f:(I.x-k.1v)+\'E\',18:(I.y-k.1v)+\'E\',K:(I.w+2*k.1v)+\'E\'});I.w-=2*k.1v;I.h-=2*k.1v;m.Q(k.24[4],{K:I.w>=0?I.w+\'E\':0,M:I.h>=0?I.h+\'E\':0});q(k.6M)k.24[3].F.M=k.24[5].F.M=k.24[4].F.M},5D:B(8J){q(8J)k.2m.F.1q=\'1n\';L m.3f(k.2m)}};m.5t=B(A,1G){k.A=A;k.1G=1G;k.2T=1G==\'x\'?\'cf\':\'ce\';k.2x=k.2T.5x();k.4Z=1G==\'x\'?\'cd\':\'cc\';k.7a=k.4Z.5x();k.6v=1G==\'x\'?\'c4\':\'c3\';k.bW=k.6v.5x();k.1V=k.2Y=0};m.5t.4Q={19:B(R){9b(R){1H\'6S\':D k.1z+k.2s+(k.t-m.20[\'1v\'+k.2T])/2;1H\'1K\':D k.G+2*k.cb+k.1V+k.2Y;1H\'4p\':D k.5c-k.3B-k.5j;1H\'6w\':D k.19(\'4p\')-2*k.cb-k.1V-k.2Y;1H\'4M\':D k.I-(k.A.1o?k.A.1o.1v:0);1H\'7J\':D k.19(\'1K\')+(k.A.1o?2*k.A.1o.1v:0);1H\'5z\':D k.1U?1r.6e((k.G-k.1U)/2):0}},6Z:B(){k.cb=(k.A.O[\'1v\'+k.2T]-k.t)/2;k.5j=m[\'6q\'+k.6v]},78:B(){k.t=k.A.C[k.2x]?3X(k.A.C[k.2x]):k.A.C[\'1v\'+k.2T];k.1z=k.A.1z[k.1G];k.2s=(k.A.C[\'1v\'+k.2T]-k.t)/2;q(k.1z==0||k.1z==-1){k.1z=(m.3t[k.2x]/2)+m.3t[\'3e\'+k.4Z]}},6Y:B(){u A=k.A;k.49=\'1J\';k.I=k.1z-k.cb+k.2s;q(k.6p&&k.1G==\'x\')A.5l=1r.2I(A.5l||k.Z,A.6p*k.Z/A.y.Z);k.G=1r.2I(k.Z,A[\'7W\'+k.2T]||k.Z);k.2B=A.53?1r.2I(A[\'2I\'+k.2T],k.Z):k.Z;q(A.2p&&A.2K){k.G=A[k.2x];k.1U=k.Z}q(k.1G==\'x\'&&m.58)k.2B=A.3E;k.3B=m[\'6q\'+k.4Z];k.3e=m.3t[\'3e\'+k.4Z];k.5c=m.3t[k.2x]},89:B(i){u A=k.A;q(A.2p&&(A.2K||m.58)){k.1U=i;k.G=1r.7W(k.G,k.1U);A.O.F[k.7a]=k.19(\'5z\')+\'E\'}L k.G=i;A.O.F[k.2x]=i+\'E\';A.11.F[k.2x]=k.19(\'1K\')+\'E\';q(A.1o)A.1o.4J();q(A.2V)A.2V.F[k.2x]=i+\'E\';q(k.1G==\'y\'&&A.4C&&A.V.F.M!=\'1J\')1k{A.4C.V.F.1T=\'1J\'}1l(e){}q(A.1Y){u d=A.26;q(k.79===1X)k.79=A.1g[\'1v\'+k.2T]-d[\'1v\'+k.2T];d.F[k.2x]=(k.G-k.79)+\'E\';q(k.1G==\'x\')A.3K.F.K=\'1J\';q(A.V)A.V.F[k.2x]=\'1J\'}q(k.1G==\'x\'&&A.1A)A.48(J)},88:B(i){k.I=i;k.A.11.F[k.7a]=i+\'E\';q(k.A.1o)k.A.1o.4J()}};m.4H=B(a,1E,2G,2z){q(N.9M&&m.1M&&!m.7b){m.1Q(N,\'3l\',B(){1x m.4H(a,1E,2G,2z)});D}k.a=a;k.2G=2G;k.2z=2z||\'2E\';k.1Y=(2z==\'2O\');k.2p=!k.1Y;m.7m=1m;k.1P=[];m.64();u R=k.R=m.P.1c;Y(u i=0;i(k.x.1U||k.x.G)){k.9X();q(k.1P.1c==1)k.48()}}k.6P()}1l(e){k.7w(e)}},7g:B(4y,1J){u c=m.3T(4y,\'67\',\'U-V\');q(/(W|3j)/.1a(k.2b)){q(k.3b)c.F.K=k.3b+\'E\';q(k.3D)c.F.M=k.3D+\'E\'}},5a:B(){q(k.aD)D;u A=k;k.V=m.3T(k.1g,\'67\',\'U-V\');q(k.2b==\'W\'){k.4u();u 4q=m.2J.5b(1);k.V.1F(4q);k.co=k.1g.28;q(!k.3b)k.3b=4q.28;u 3W=k.1g.1I-k.V.1I,h=k.3D||m.3t.M-3W-m.3F-m.6h,3O=k.2S==\'57\'?\' 3O="q (m.P[\'+k.R+\']) m.P[\'+k.R+\'].4z()" \':\'\';k.V.2r+=\'\';k.4q=k.V.3M(\'1h\')[0];k.W=k.V.3M(\'W\')[0];q(k.2S==\'4c\')k.6r()}q(k.2b==\'3j\'){k.V.1i=k.V.1i||\'m-cm-1i-\'+k.R;u a=k.6R;q(!a.1E)a.1E={};q(1t a.1E.aw==\'1X\')a.1E.aw=\'ck\';q(6G)6G.cl(k.S,k.V.1i,k.3b,k.3D,a.cC||\'7\',a.cz,a.aA,a.1E,a.aB)}k.aD=J},7j:B(){q(k.W&&!k.3D){k.W.F.M=k.V.F.M=k.ax()+\'E\'}k.1g.1F(m.2J);q(!k.x.Z)k.x.Z=k.1g.28;k.y.Z=k.1g.1I;k.1g.ar(m.2J);q(m.1M&&k.az>3X(k.1g.4s.M)){k.az=3X(k.1g.4s.M)}m.Q(k.11,{1d:\'21\',7i:\'0\'});m.Q(k.O,{K:k.x.t+\'E\',M:k.y.t+\'E\'})},ax:B(){u h;1k{u 1W=k.4C=k.W.6l||k.W.4L.N;u 2J=1W.14(\'1h\');2J.F.aC=\'ay\';1W.V.1F(2J);h=2J.7l;q(m.1M)h+=3X(1W.V.4s.3F)+3X(1W.V.4s.6h)-1}1l(e){h=c0}D h},6r:B(){u 4d=k.1g.28-k.4q.28;m.3f(k.4q);q(4d<0)4d=0;u 3W=k.1g.1I-k.W.1I;q(k.4C&&!k.3D&&!k.M&&k.y.G==k.y.Z)1k{k.4C.V.F.1T=\'1n\'}1l(e){}m.Q(k.W,{K:1r.7V(k.x.G-4d)+\'E\',M:1r.7V(k.y.G-3W)+\'E\'});m.Q(k.V,{K:k.W.F.K,M:k.W.F.M});k.4h=k.W;k.26=k.4h},ai:B(){k.7g(k.1g);q(k.2b==\'3j\'&&k.2S==\'57\')k.5a();q(k.x.G1D.1I){1D.F.K=(3X(1D.F.K)+5s)+\'E\'}k.4h=1D;k.26=k.4h}q(k.W&&k.2S==\'57\')k.6r();q(!k.4h&&k.y.Gk.26.2W.1I){51("1k { m.P["+k.R+"].26.F.1T = \'1J\'; } 1l(e) {}",m.6N)}},49:B(p,46){u bT,bU=p.2j,1G=p==k.x?\'x\':\'y\';u 6t=1m;u 42=p.A.53;p.I=1r.6e(p.I-((p.19(\'1K\')-p.t)/2));q(p.Ip.3e+p.5c-p.5j){q(!46&&6t&&42){p.G=1r.2I(p.G,p.19(1G==\'y\'?\'4p\':\'6w\'))}L q(p.19(\'1K\')2i){ 2q=2N*2i;q(2qk.4F&&x.G>k.3E&&y.19(\'1K\')>y.19(\'4p\')){y.G-=10;q(2i)x.G=y.G*2i;k.48(0,1);35=J}}D 35},6P:B(){u x=k.x,y=k.y;k.4m(\'1n\');k.7G(1,{11:{K:x.19(\'1K\'),M:y.19(\'1K\'),1f:x.I,18:y.I},O:{1f:x.1V+x.19(\'5z\'),18:y.1V+y.19(\'5z\'),K:x.1U||x.G,M:y.1U||y.G}},m.6N)},7G:B(2v,2d,3u){q(k.1o&&!k.3k){q(2v)k.1o.4J();L k.1o.5D((k.1Y&&k.4g))}q(!2v)k.9W();u A=k,x=A.x,y=A.y,2c=k.2c;q(!2v)2c=k.an||2c;u 4c=2v?B(){q(A.1o)A.1o.2m.F.1q="2l";51(B(){A.aE()},50)}:B(){A.7x()};q(2v)m.Q(k.11,{K:x.t+\'E\',M:y.t+\'E\'});q(2v&&k.1Y){m.Q(k.11,{1f:(x.1z-x.cb+x.2s)+\'E\',18:(y.1z-y.cb+y.2s)+\'E\'})}q(k.aF){m.Q(k.11,{1C:2v?0:1});m.3r(2d.11,{1C:2v})}m.43(k.11,2d.11,{3y:3u,2c:2c,3c:B(2P,2L){q(A.1o&&A.3k&&2L.1b==\'18\'){u 4I=2v?2L.I:1-2L.I;u I={w:x.t+(x.19(\'1K\')-x.t)*4I,h:y.t+(y.19(\'1K\')-y.t)*4I,x:x.1z+(x.I-x.1z)*4I,y:y.1z+(y.I-y.1z)*4I};A.1o.4J(I,0,1)}q(A.1Y){q(2L.1b==\'1f\')A.3K.F.1f=(x.I-2P)+\'E\';q(2L.1b==\'18\')A.3K.F.18=(y.I-2P)+\'E\'}}});m.43(k.O,2d.O,3u,2c,4c);q(2v){k.11.F.1q=\'2l\';k.O.F.1q=\'2l\';q(k.1Y)k.1g.F.1q=\'2l\';k.a.1p+=\' U-9U-9R\'}},aE:B(){k.4l=J;k.3h();q(k.1Y&&k.2S==\'4c\')k.5a();q(k.W){1k{u A=k,1W=k.W.6l||k.W.4L.N;m.1Q(1W,\'74\',B(){q(m.2n!=A.R)A.3h()})}1l(e){}q(m.1M&&1t k.4v!=\'ca\')k.W.F.K=(k.3b-1)+\'E\'}q(m.3I&&m.3I==k.a)m.3I=H;k.ag();u p=m.3t,6A=m.5Y.x+p.5k,6z=m.5Y.y+p.5f;k.7S=k.x.I<6A&&6Ak.x.19(\'4M\')+k.x.19(\'7J\'));u 9w=(2U.y+2U.hk.y.19(\'4M\')+k.y.19(\'7J\'));u 5p=m.7I(1j[i]);q(!9q&&!9w&&5p!=k.R){q(!2f){1j[i].4X(\'1n-by\',\'[\'+k.R+\']\');1j[i].7u=1j[i].F[1b];1j[i].F[1b]=\'1n\'}L q(2f.9u(\'[\'+k.R+\']\')==-1){1j[i].4X(\'1n-by\',2f+\'[\'+k.R+\']\')}}L q((2f==\'[\'+k.R+\']\'||m.2n==5p)&&5p!=k.R){1j[i].4X(\'1n-by\',\'\');1j[i].F[1b]=1j[i].7u||\'\'}L q(2f&&2f.9u(\'[\'+k.R+\']\')>-1){1j[i].4X(\'1n-by\',2f.2h(\'[\'+k.R+\']\',\'\'))}}}}},3h:B(){k.11.F.1s=m.3Y+=2;Y(u i=0;i=5.5){s=s.2h(1x 66(\']*>\',\'al\'),\'\').2h(1x 66(\']*>.*?\',\'al\'),\'\');q(k.W){u 1W=k.W.6l;q(!1W&&k.W.4L)1W=k.W.4L.N;q(!1W){u 3a=k;51(B(){3a.4Y()},25);D}1W.aq();1W.bP(s);1W.2a();1k{s=1W.6m(k.1i).2r}1l(e){1k{s=k.W.N.6m(k.1i).2r}1l(e){}}m.3f(k.W)}L{68=/(]*>|<\\/V>)/b6;q(68.1a(s))s=s.at(68)[m.31?1:2]}}m.3T(k.O,\'67\',\'U-V\').2r=s;k.2F();Y(u x 3C k)k[x]=H}};m.62=m.1e;u bc=m.4H;q(m.1M&&1w==1w.18){(B(){1k{N.45.bb(\'1f\')}1l(e){51(ak.ba,50);D}m.3l()})()}m.1Q(N,\'aU\',m.3l);m.1Q(1w,\'71\',m.3l);m.1Q(N,\'3l\',B(){q(m.5V){u F=m.14(\'F\',{T:\'aS/6s\'},H,N.3M(\'aW\')[0]),a3=N.61==\'6H\';B 5W(7d,7c){q(m.1M&&(m.29<9||a3)){u 3i=N.a4[N.a4.1c-1];q(1t(3i.5W)=="6O")3i.5W(7d,7c)}L{F.1F(N.aG(7d+" {"+7c+"}"))}}B cV(1b){D\'cU( ( ( cS = N.45.\'+1b+\' ? N.45.\'+1b+\' : N.V.\'+1b+\' ) ) + \\\'E\\\' );\'}q(m.5V)5W(\'.U 1u\',\'3A: 7h(\'+m.4D+m.5V+\'), 5U !cX;\')}});m.1Q(1w,\'3q\',B(){m.5X()});m.1Q(N,\'6T\',B(e){m.5Y={x:e.60,y:e.5Z}});m.1Q(N,\'74\',m.73);m.1Q(N,\'9t\',m.73);m.1Q(N,\'3l\',m.4w);m.1Q(1w,\'71\',m.9v);m.1Q(1w,\'71\',m.9D)}',62,828,'||||||||||||||||||||this||hs||||if||||var||||||exp|function|el|return|px|style|size|null|pos|true|width|else|height|document|content|expanders|setStyles|key|src|type|highslide|body|iframe||for|full||wrapper|||createElement||overlay||top|get|test|prop|length|position|lang|left|innerContent|div|id|els|try|catch|false|hidden|outline|className|visibility|Math|zIndex|typeof|img|offset|window|new|outlineType|tpos|overlayBox|fx|opacity|node|params|appendChild|dim|case|offsetHeight|auto|wsize|next|ie|display|options|overlays|addEventListener|arr|container|overflow|imgSize|p1|doc|undefined|isHtml|event|loading|absolute|push|xhr|td||scrollerDiv||offsetWidth|uaVersion|close|objectType|easing|to|none|hiddenBy|dragArgs|replace|ratio|target|elem|visible|table|focusKey|span|isImage|xSize|innerHTML|tb|100|ajax|up|op|wh|href|contentType|re|minSize|name|title|image|onLoad|custom|right|min|clearing|useBox|args|opt|ySize|html|val|onclick|hsId|objectLoadTime|ucwh|elPos|releaseMask|parentNode|func|p2|match|graphic|ieLt9||||changed|opera||||pThis|objectWidth|step|timers|scroll|discardElement|attribs|focus|last|swf|outlineWhileAnimating|ready|li|getExpander|styles|hasDragged|resize|extend|class|page|dur|groups|relative|pendingOutlines|duration|move|cursor|marginMin|in|objectHeight|minWidth|marginTop|start|clone|upcoming|unit|mediumContent|sleeping|getElementsByTagName|now|onload|9999px|ieLt7|getNode|bottom|getElementByClass|slideshowGroup|removeEventListener|hDiff|parseInt|zIndexCounter|cacheBindings||cNode|allowReduce|animate|styleRestoreCursor|documentElement|moveOnly|blurExp|sizeOverlayBox|justify|while|tagName|after|wDiff|end|Id|preserveContent|scrollingContent|images|marginLeft|getParam|isExpanded|doShowHide|htmls|number|fitsize|ruler|all|currentStyle|idCounter|showLoading|isClosing|getAnchors|stl|parent|contentLoaded|preloadTheseImages|on|iDoc|graphicsDir|keyHandler|minHeight|navigator|Expander|fac|setPosition|mask|contentWindow|opos|expand|createOverlay|iebody|prototype|cache|block|getParams|param|matches|filter|setAttribute|loadHTML|uclt||setTimeout|restoreCursor|allowSizeReduction|above|Outline|safari|before|padToMinWidth|dX|writeExtendedContent|cloneNode|clientSize|tr|dY|scrollTop|onLoadStarted|allowWidthReduction|anchors|marginMax|scrollLeft|maxWidth|curAnim|allowHeightReduction|gotoEnd|wrapperKey|keydown|self|kdeBugCorr|Dimension|onReady|keypress|isHsAnchor|toLowerCase|showHideElements|imgPad|maincontent|tId|previousOrNext|destroy|expOnly|Ajax|getSrc|Date|previous|ypos|xpos|relatedTarget|below|over|overlayId|hideOnMouseOut|fullExpandLabel|preventDefault|getTime|preloadTheseAjax|pointer|expandCursor|addRule|getPageSize|mouse|clientY|clientX|compatMode|langDefaults|pre|init|cachedGets|RegExp|DIV|regBody|os|topmostKey|positionOverlay|offY|250|round|heading|preloadFullImage|marginBottom|sg|offX|thumbsUserSetId|contentDocument|getElementById|fitOverlayBox|allowMultipleInstances|maxHeight|margin|correctIframeSize|css|hasMovedMin|userAgent|ucrb|maxsize|garbageBin|cur|mY|mX|marginRight|topZ|getAdjacentAnchor|string|preloadAjaxElement|swfobject|BackCompat|center|parseFloat|form|cacheAjax|hasAlphaImageLoader|expandDuration|object|show|direction|swfOptions|loadingPos|mousemove|Create|connectOutline|contentId|getSelfRendered|calcExpanded|calcBorders||load|location|mouseClickHandler|mousedown||getCacheBinding|cssDirection|calcThumb|sizeDiff|lt|isReady|dec|sel|Click|clones|setObjContainerSize|url|padding|htmlGetSize|overrides|offsetTop|continuePreloading|fade|arrow|getElementContent|state|blur|dragHandler|hasFocused|origProp|startTime|error|afterClose|distance|element|break|restoreTitle|update|numberOfImagesToPreload|moveTo|getInline|changeSize|doFullExpand|getWrapperKey|osize|getPosition|resizeTo|dragByHeading|onError|defaultView|complete|done|srcElement|mouseIsOver|middle|cancelLoading|abs|max|doWrapper|types|run|tbody|credits|panel|ie6|thumbnailId|destroyObject|Text|openerTagNames|setPos|setSize|wrapperClassName|geckoMac|adj|Highslide|updateAnchors|detachEvent|loadingOpacity|spacebar|timerId|JS|Play|wrapperMouseHandler|from|pow|Previous|525|orig|clickY|slideshow|hasHtmlExpanders|Close|Pause|clickX|pageOrigin|thumb|loadingText|previousText|clientWidth|pageXOffset|easeInQuad|offsetParent|alpha|nopad|_default|tag|hide|offsetLeft|skin|transit|appendTo|onGraphicLoad|background|vis|preloadGraphic|contentWrapper|replaceLang|enableKeyListener|rv|captionOverlay|call|nextTitle|nextText|moveTitle|previousTitle|loadingTitle|Move|and|200|moveText|closeTitle|focusTopmost||headingOverlay|switch|resizeTitle|ul|closeText|ltr|htmlExpand|Next|preloadNext|getComputedStyle|getPropertyValue|hideIframes|hideSelects|addOverlay|Overlay|getAttribute|clearsX|focusTitle|hand|mouseup|indexOf|preloadImages|clearsY|nextSibling|_|getAnchorIndex|ie6SSL|current|cachedGet|preloadAjax|toString|creditsHref|creditsText|XMLHttpRequest|Eval|creditsPosition|creditsTitle|setRequestHeader|readyState|XMLHTTP|doPanels|showOverlays|genOverlayBox|anchor|sleep|gotOverlays|active|fullExpandOpacity|destroyOverlays|createFullExpand|javascript|fullExpandTitle|fullExpandPosition|writeCredits|showCredits|backCompat|styleSheets|htmlPrepareClose|restoreDuration|Microsoft|ActiveXObject|awake|offsetX|reOrder|getOverlays|rightpanel|leftpanel|offsetY|prepareNextOutline|creditsTarget|htmlSizeOperations|border|arguments|gi|vendor|easingClose|correctRatio|KDE|open|removeChild||split|tmpMin|script|wmode|getIframePageHeight|both|newHeight|flashvars|attributes|clear|hasExtendedContent|afterExpand|fadeInOut|createTextNode|graphics|captionText|keys|Use|drag|headingId|headingText|fullExpandText|click|captionEval|outlineStartOffset|text|button|DOMContentLoaded|xpand|HEAD|_self|drop|shadow|white|header|htmlE|com|registerOverlay|headingEval|ig|captionId|footer|http|callee|doScroll|HsExpander|returnValue|maincontentText|www|urlencoded|pageYOffset|01|application|Gecko|Content|Type|send|link|about|blank|toUpperCase|innerWidth|clientHeight|1001|removeAttribute|innerHeight|Macintosh||Safari|forceAjaxReload|dummy|maincontentEval|responseText|zoomin|Msxml2|maincontentId|onreadystatechange|GET|oPos|documentMode|it|ra|With|Requested|write|zoomout|keyCode|pauseTitle|tgtArr|tgt|actual|rb|Expand|front|allowSimultaneousLoading|300|nodeName|insertBefore|Bottom|Right|sizingMethod|AlphaImageLoader|DXImageTransform|progid|scale|boolean||Top|Left|Height|Width|onmouseover|onmouseout|htmlCreate|flushImgSize|transparent|embedSWF|flash|allowfullscreen|newWidth|Loading|static|frameborder|oncontextmenu|blockRightClick|lineNumber|Line|alert|debug|message|expressInstallSwfurl|imageCreate|cancel|version|bring|sqrt|Powered|1px|paddingTop|200px|https|linearTween|removeSWF|png|default|pauseText|StopPlay|protocol|caption|ignoreMe|dragSensitivity|expression|fix|mouseover|important|useOnHtml|attachEvent|toElement|fromElement|playText|playTitle|cellSpacing|Go|eval|the|borderCollapse|collapse|outlines|outlinesDir|fontSize|lineHeight|Resize|SELECT|homepage|clearInterval|splice|esc|setInterval|IFRAME'.split('|'),0,{})) 10 | -------------------------------------------------------------------------------- /static/highslide/highslide.css: -------------------------------------------------------------------------------- 1 | /** 2 | * @file: highslide.css 3 | * @version: 5.0.0 4 | */ 5 | .highslide-container div { 6 | font-family: Verdana, Helvetica; 7 | font-size: 10pt; 8 | } 9 | .highslide-container table { 10 | background: none; 11 | table-layout: auto; 12 | } 13 | .highslide { 14 | outline: none; 15 | text-decoration: none; 16 | } 17 | .highslide img { 18 | border: 2px solid silver; 19 | } 20 | .highslide:hover img { 21 | border-color: gray; 22 | } 23 | .highslide-active-anchor img { 24 | visibility: hidden; 25 | } 26 | .highslide-gallery .highslide-active-anchor img { 27 | border-color: black; 28 | visibility: visible; 29 | cursor: default; 30 | } 31 | .highslide-image { 32 | border-width: 2px; 33 | border-style: solid; 34 | border-color: white; 35 | } 36 | .highslide-wrapper, .highslide-outline { 37 | background: white; 38 | } 39 | .glossy-dark { 40 | background: #111; 41 | } 42 | 43 | .highslide-image-blur { 44 | } 45 | .highslide-number { 46 | font-weight: bold; 47 | color: gray; 48 | font-size: .9em; 49 | } 50 | .highslide-caption { 51 | display: none; 52 | font-size: 1em; 53 | padding: 5px; 54 | /*background: white;*/ 55 | } 56 | .highslide-heading { 57 | display: none; 58 | font-weight: bold; 59 | margin: 0.4em; 60 | } 61 | .highslide-dimming { 62 | /*position: absolute;*/ 63 | background: black; 64 | } 65 | a.highslide-full-expand { 66 | background: url(graphics/fullexpand.gif) no-repeat; 67 | display: block; 68 | margin: 0 10px 10px 0; 69 | width: 34px; 70 | height: 34px; 71 | } 72 | .highslide-loading { 73 | display: block; 74 | color: black; 75 | font-size: 9px; 76 | font-weight: bold; 77 | text-transform: uppercase; 78 | text-decoration: none; 79 | padding: 3px; 80 | border: 1px solid white; 81 | background-color: white; 82 | padding-left: 22px; 83 | background-image: url(graphics/loader.white.gif); 84 | background-repeat: no-repeat; 85 | background-position: 3px 1px; 86 | } 87 | a.highslide-credits, 88 | a.highslide-credits i { 89 | padding: 2px; 90 | color: silver; 91 | text-decoration: none; 92 | font-size: 10px; 93 | } 94 | a.highslide-credits:hover, 95 | a.highslide-credits:hover i { 96 | color: white; 97 | background-color: gray; 98 | } 99 | .highslide-move, .highslide-move * { 100 | cursor: move; 101 | } 102 | 103 | .highslide-viewport { 104 | display: none; 105 | position: fixed; 106 | width: 100%; 107 | height: 100%; 108 | z-index: 1; 109 | background: none; 110 | left: 0; 111 | top: 0; 112 | } 113 | .highslide-overlay { 114 | display: none; 115 | } 116 | .hidden-container { 117 | display: none; 118 | } 119 | /* Example of a semitransparent, offset closebutton */ 120 | .closebutton { 121 | position: relative; 122 | top: -15px; 123 | left: 15px; 124 | width: 30px; 125 | height: 30px; 126 | cursor: pointer; 127 | background: url(graphics/close.png); 128 | /* NOTE! For IE6, you also need to update the highslide-ie6.css file. */ 129 | } 130 | 131 | /*****************************************************************************/ 132 | /* Thumbnail boxes for the galleries. */ 133 | /* Remove these if you are not using a gallery. */ 134 | /*****************************************************************************/ 135 | .highslide-gallery ul { 136 | list-style-type: none; 137 | margin: 0; 138 | padding: 0; 139 | } 140 | .highslide-gallery ul li { 141 | display: block; 142 | position: relative; 143 | float: left; 144 | width: 106px; 145 | height: 106px; 146 | border: 1px solid silver; 147 | background: #ededed; 148 | margin: 2px; 149 | padding: 0; 150 | line-height: 0; 151 | overflow: hidden; 152 | } 153 | .highslide-gallery ul a { 154 | position: absolute; 155 | top: 50%; 156 | left: 50%; 157 | } 158 | .highslide-gallery ul img { 159 | position: relative; 160 | top: -50%; 161 | left: -50%; 162 | } 163 | html>/**/body .highslide-gallery ul li { 164 | display: table; 165 | text-align: center; 166 | } 167 | html>/**/body .highslide-gallery ul li { 168 | text-align: center; 169 | } 170 | html>/**/body .highslide-gallery ul a { 171 | position: static; 172 | display: table-cell; 173 | vertical-align: middle; 174 | } 175 | html>/**/body .highslide-gallery ul img { 176 | position: static; 177 | } 178 | 179 | /*****************************************************************************/ 180 | /* Controls for the galleries. */ 181 | /* Remove these if you are not using a gallery */ 182 | /*****************************************************************************/ 183 | .highslide-controls { 184 | width: 195px; 185 | height: 40px; 186 | background: url(graphics/controlbar-white.gif) 0 -90px no-repeat; 187 | margin: 20px 15px 10px 0; 188 | } 189 | .highslide-controls ul { 190 | position: relative; 191 | left: 15px; 192 | height: 40px; 193 | list-style: none; 194 | margin: 0; 195 | padding: 0; 196 | background: url(graphics/controlbar-white.gif) right -90px no-repeat; 197 | 198 | } 199 | .highslide-controls li { 200 | float: left; 201 | padding: 5px 0; 202 | margin:0; 203 | list-style: none; 204 | } 205 | .highslide-controls a { 206 | background-image: url(graphics/controlbar-white.gif); 207 | display: block; 208 | float: left; 209 | height: 30px; 210 | width: 30px; 211 | outline: none; 212 | } 213 | .highslide-controls a.disabled { 214 | cursor: default; 215 | } 216 | .highslide-controls a.disabled span { 217 | cursor: default; 218 | } 219 | .highslide-controls a span { 220 | /* hide the text for these graphic buttons */ 221 | display: none; 222 | cursor: pointer; 223 | } 224 | 225 | 226 | /* The CSS sprites for the controlbar - see http://www.google.com/search?q=css+sprites */ 227 | .highslide-controls .highslide-previous a { 228 | background-position: 0 0; 229 | } 230 | .highslide-controls .highslide-previous a:hover { 231 | background-position: 0 -30px; 232 | } 233 | .highslide-controls .highslide-previous a.disabled { 234 | background-position: 0 -60px !important; 235 | } 236 | .highslide-controls .highslide-play a { 237 | background-position: -30px 0; 238 | } 239 | .highslide-controls .highslide-play a:hover { 240 | background-position: -30px -30px; 241 | } 242 | .highslide-controls .highslide-play a.disabled { 243 | background-position: -30px -60px !important; 244 | } 245 | .highslide-controls .highslide-pause a { 246 | background-position: -60px 0; 247 | } 248 | .highslide-controls .highslide-pause a:hover { 249 | background-position: -60px -30px; 250 | } 251 | .highslide-controls .highslide-next a { 252 | background-position: -90px 0; 253 | } 254 | .highslide-controls .highslide-next a:hover { 255 | background-position: -90px -30px; 256 | } 257 | .highslide-controls .highslide-next a.disabled { 258 | background-position: -90px -60px !important; 259 | } 260 | .highslide-controls .highslide-move a { 261 | background-position: -120px 0; 262 | } 263 | .highslide-controls .highslide-move a:hover { 264 | background-position: -120px -30px; 265 | } 266 | .highslide-controls .highslide-full-expand a { 267 | background-position: -150px 0; 268 | } 269 | .highslide-controls .highslide-full-expand a:hover { 270 | background-position: -150px -30px; 271 | } 272 | .highslide-controls .highslide-full-expand a.disabled { 273 | background-position: -150px -60px !important; 274 | } 275 | .highslide-controls .highslide-close a { 276 | background-position: -180px 0; 277 | } 278 | .highslide-controls .highslide-close a:hover { 279 | background-position: -180px -30px; 280 | } 281 | 282 | /*****************************************************************************/ 283 | /* Styles for the HTML popups */ 284 | /* Remove these if you are not using Highslide HTML */ 285 | /*****************************************************************************/ 286 | .highslide-maincontent { 287 | display: none; 288 | } 289 | .highslide-html { 290 | background-color: white; 291 | } 292 | .mobile .highslide-html { 293 | border: 1px solid silver; 294 | } 295 | .highslide-html-content { 296 | display: none; 297 | width: 400px; 298 | padding: 0 5px 5px 5px; 299 | } 300 | .highslide-header { 301 | padding-bottom: 5px; 302 | } 303 | .highslide-header ul { 304 | margin: 0; 305 | padding: 0; 306 | text-align: right; 307 | } 308 | .highslide-header ul li { 309 | display: inline; 310 | padding-left: 1em; 311 | } 312 | .highslide-header ul li.highslide-previous, .highslide-header ul li.highslide-next { 313 | display: none; 314 | } 315 | .highslide-header a { 316 | font-weight: bold; 317 | color: gray; 318 | text-transform: uppercase; 319 | text-decoration: none; 320 | } 321 | .highslide-header a:hover { 322 | color: black; 323 | } 324 | .highslide-header .highslide-move a { 325 | cursor: move; 326 | } 327 | .highslide-footer { 328 | height: 16px; 329 | } 330 | .highslide-footer .highslide-resize { 331 | display: block; 332 | float: right; 333 | margin-top: 5px; 334 | height: 11px; 335 | width: 11px; 336 | background: url(graphics/resize.gif) no-repeat; 337 | } 338 | .highslide-footer .highslide-resize span { 339 | display: none; 340 | } 341 | .highslide-body { 342 | } 343 | .highslide-resize { 344 | cursor: nw-resize; 345 | } 346 | 347 | /*****************************************************************************/ 348 | /* Styles for the Individual wrapper class names. */ 349 | /* See www.highslide.com/ref/hs.wrapperClassName */ 350 | /* You can safely remove the class name themes you don't use */ 351 | /*****************************************************************************/ 352 | 353 | /* hs.wrapperClassName = 'draggable-header' */ 354 | .draggable-header .highslide-header { 355 | height: 18px; 356 | border-bottom: 1px solid #dddddd; 357 | } 358 | .draggable-header .highslide-heading { 359 | position: absolute; 360 | margin: 2px 0.4em; 361 | } 362 | 363 | .draggable-header .highslide-header .highslide-move { 364 | cursor: move; 365 | display: block; 366 | height: 16px; 367 | position: absolute; 368 | right: 24px; 369 | top: 0; 370 | width: 100%; 371 | z-index: 1; 372 | } 373 | .draggable-header .highslide-header .highslide-move * { 374 | display: none; 375 | } 376 | .draggable-header .highslide-header .highslide-close { 377 | position: absolute; 378 | right: 2px; 379 | top: 2px; 380 | z-index: 5; 381 | padding: 0; 382 | } 383 | .draggable-header .highslide-header .highslide-close a { 384 | display: block; 385 | height: 16px; 386 | width: 16px; 387 | background-image: url(graphics/closeX.png); 388 | } 389 | .draggable-header .highslide-header .highslide-close a:hover { 390 | background-position: 0 16px; 391 | } 392 | .draggable-header .highslide-header .highslide-close span { 393 | display: none; 394 | } 395 | .draggable-header .highslide-maincontent { 396 | padding-top: 1em; 397 | } 398 | 399 | /* hs.wrapperClassName = 'titlebar' */ 400 | .titlebar .highslide-header { 401 | height: 18px; 402 | border-bottom: 1px solid #dddddd; 403 | } 404 | .titlebar .highslide-heading { 405 | position: absolute; 406 | width: 90%; 407 | margin: 1px 0 1px 5px; 408 | color: #666666; 409 | } 410 | 411 | .titlebar .highslide-header .highslide-move { 412 | cursor: move; 413 | display: block; 414 | height: 16px; 415 | position: absolute; 416 | right: 24px; 417 | top: 0; 418 | width: 100%; 419 | z-index: 1; 420 | } 421 | .titlebar .highslide-header .highslide-move * { 422 | display: none; 423 | } 424 | .titlebar .highslide-header li { 425 | position: relative; 426 | top: 3px; 427 | z-index: 2; 428 | padding: 0 0 0 1em; 429 | } 430 | .titlebar .highslide-maincontent { 431 | padding-top: 1em; 432 | } 433 | 434 | /* hs.wrapperClassName = 'no-footer' */ 435 | .no-footer .highslide-footer { 436 | display: none; 437 | } 438 | 439 | /* hs.wrapperClassName = 'wide-border' */ 440 | .wide-border { 441 | background: white; 442 | } 443 | .wide-border .highslide-image { 444 | border-width: 10px; 445 | } 446 | .wide-border .highslide-caption { 447 | padding: 0 10px 10px 10px; 448 | } 449 | 450 | /* hs.wrapperClassName = 'borderless' */ 451 | .borderless .highslide-image { 452 | border: none; 453 | } 454 | .borderless .highslide-caption { 455 | border-bottom: 1px solid white; 456 | border-top: 1px solid white; 457 | background: silver; 458 | } 459 | 460 | /* hs.wrapperClassName = 'outer-glow' */ 461 | .outer-glow { 462 | background: #444; 463 | } 464 | .outer-glow .highslide-image { 465 | border: 5px solid #444444; 466 | } 467 | .outer-glow .highslide-caption { 468 | border: 5px solid #444444; 469 | border-top: none; 470 | padding: 5px; 471 | background-color: gray; 472 | } 473 | 474 | /* hs.wrapperClassName = 'colored-border' */ 475 | .colored-border { 476 | background: white; 477 | } 478 | .colored-border .highslide-image { 479 | border: 2px solid green; 480 | } 481 | .colored-border .highslide-caption { 482 | border: 2px solid green; 483 | border-top: none; 484 | } 485 | 486 | /* hs.wrapperClassName = 'dark' */ 487 | .dark { 488 | background: #111; 489 | } 490 | .dark .highslide-image { 491 | border-color: black black #202020 black; 492 | background: gray; 493 | } 494 | .dark .highslide-caption { 495 | color: white; 496 | background: #111; 497 | } 498 | .dark .highslide-controls, 499 | .dark .highslide-controls ul, 500 | .dark .highslide-controls a { 501 | background-image: url(graphics/controlbar-black-border.gif); 502 | } 503 | 504 | /* hs.wrapperClassName = 'floating-caption' */ 505 | .floating-caption .highslide-caption { 506 | position: absolute; 507 | padding: 1em 0 0 0; 508 | background: none; 509 | color: white; 510 | border: none; 511 | font-weight: bold; 512 | } 513 | 514 | /* hs.wrapperClassName = 'controls-in-heading' */ 515 | .controls-in-heading .highslide-heading { 516 | color: gray; 517 | font-weight: bold; 518 | height: 20px; 519 | overflow: hidden; 520 | cursor: default; 521 | padding: 0 0 0 22px; 522 | margin: 0; 523 | background: url(graphics/icon.gif) no-repeat 0 1px; 524 | } 525 | .controls-in-heading .highslide-controls { 526 | width: 105px; 527 | height: 20px; 528 | position: relative; 529 | margin: 0; 530 | top: -23px; 531 | left: 7px; 532 | background: none; 533 | } 534 | .controls-in-heading .highslide-controls ul { 535 | position: static; 536 | height: 20px; 537 | background: none; 538 | } 539 | .controls-in-heading .highslide-controls li { 540 | padding: 0; 541 | } 542 | .controls-in-heading .highslide-controls a { 543 | background-image: url(graphics/controlbar-white-small.gif); 544 | height: 20px; 545 | width: 20px; 546 | } 547 | 548 | .controls-in-heading .highslide-controls .highslide-move { 549 | display: none; 550 | } 551 | 552 | .controls-in-heading .highslide-controls .highslide-previous a { 553 | background-position: 0 0; 554 | } 555 | .controls-in-heading .highslide-controls .highslide-previous a:hover { 556 | background-position: 0 -20px; 557 | } 558 | .controls-in-heading .highslide-controls .highslide-previous a.disabled { 559 | background-position: 0 -40px !important; 560 | } 561 | .controls-in-heading .highslide-controls .highslide-play a { 562 | background-position: -20px 0; 563 | } 564 | .controls-in-heading .highslide-controls .highslide-play a:hover { 565 | background-position: -20px -20px; 566 | } 567 | .controls-in-heading .highslide-controls .highslide-play a.disabled { 568 | background-position: -20px -40px !important; 569 | } 570 | .controls-in-heading .highslide-controls .highslide-pause a { 571 | background-position: -40px 0; 572 | } 573 | .controls-in-heading .highslide-controls .highslide-pause a:hover { 574 | background-position: -40px -20px; 575 | } 576 | .controls-in-heading .highslide-controls .highslide-next a { 577 | background-position: -60px 0; 578 | } 579 | .controls-in-heading .highslide-controls .highslide-next a:hover { 580 | background-position: -60px -20px; 581 | } 582 | .controls-in-heading .highslide-controls .highslide-next a.disabled { 583 | background-position: -60px -40px !important; 584 | } 585 | .controls-in-heading .highslide-controls .highslide-full-expand a { 586 | background-position: -100px 0; 587 | } 588 | .controls-in-heading .highslide-controls .highslide-full-expand a:hover { 589 | background-position: -100px -20px; 590 | } 591 | .controls-in-heading .highslide-controls .highslide-full-expand a.disabled { 592 | background-position: -100px -40px !important; 593 | } 594 | .controls-in-heading .highslide-controls .highslide-close a { 595 | background-position: -120px 0; 596 | } 597 | .controls-in-heading .highslide-controls .highslide-close a:hover { 598 | background-position: -120px -20px; 599 | } 600 | 601 | /*****************************************************************************/ 602 | /* Styles for text based controls. */ 603 | /* You can safely remove this if you don't use text based controls */ 604 | /*****************************************************************************/ 605 | 606 | .text-controls .highslide-controls { 607 | width: auto; 608 | height: auto; 609 | margin: 0; 610 | text-align: center; 611 | background: none; 612 | } 613 | .text-controls ul { 614 | position: static; 615 | background: none; 616 | height: auto; 617 | left: 0; 618 | } 619 | .text-controls .highslide-move { 620 | display: none; 621 | } 622 | .text-controls li { 623 | background-image: url(graphics/controlbar-text-buttons.png); 624 | background-position: right top !important; 625 | padding: 0; 626 | margin-left: 15px; 627 | display: block; 628 | width: auto; 629 | } 630 | .text-controls a { 631 | background: url(graphics/controlbar-text-buttons.png) no-repeat; 632 | background-position: left top !important; 633 | position: relative; 634 | left: -10px; 635 | display: block; 636 | width: auto; 637 | height: auto; 638 | text-decoration: none !important; 639 | } 640 | .text-controls a span { 641 | background: url(graphics/controlbar-text-buttons.png) no-repeat; 642 | margin: 1px 2px 1px 10px; 643 | display: block; 644 | min-width: 4em; 645 | height: 18px; 646 | line-height: 18px; 647 | padding: 1px 0 1px 18px; 648 | color: #333; 649 | font-family: "Trebuchet MS", Arial, sans-serif; 650 | font-size: 12px; 651 | font-weight: bold; 652 | white-space: nowrap; 653 | } 654 | .text-controls .highslide-next { 655 | margin-right: 1em; 656 | } 657 | .text-controls .highslide-full-expand a span { 658 | min-width: 0; 659 | margin: 1px 0; 660 | padding: 1px 0 1px 10px; 661 | } 662 | .text-controls .highslide-close a span { 663 | min-width: 0; 664 | } 665 | .text-controls a:hover span { 666 | color: black; 667 | } 668 | .text-controls a.disabled span { 669 | color: #999; 670 | } 671 | 672 | .text-controls .highslide-previous span { 673 | background-position: 0 -40px; 674 | } 675 | .text-controls .highslide-previous a.disabled { 676 | background-position: left top !important; 677 | } 678 | .text-controls .highslide-previous a.disabled span { 679 | background-position: 0 -140px; 680 | } 681 | .text-controls .highslide-play span { 682 | background-position: 0 -60px; 683 | } 684 | .text-controls .highslide-play a.disabled { 685 | background-position: left top !important; 686 | } 687 | .text-controls .highslide-play a.disabled span { 688 | background-position: 0 -160px; 689 | } 690 | .text-controls .highslide-pause span { 691 | background-position: 0 -80px; 692 | } 693 | .text-controls .highslide-next span { 694 | background-position: 0 -100px; 695 | } 696 | .text-controls .highslide-next a.disabled { 697 | background-position: left top !important; 698 | } 699 | .text-controls .highslide-next a.disabled span { 700 | background-position: 0 -200px; 701 | } 702 | .text-controls .highslide-full-expand span { 703 | background: none; 704 | } 705 | .text-controls .highslide-full-expand a.disabled { 706 | background-position: left top !important; 707 | } 708 | .text-controls .highslide-close span { 709 | background-position: 0 -120px; 710 | } 711 | 712 | 713 | /*****************************************************************************/ 714 | /* Styles for the thumbstrip. */ 715 | /* See www.highslide.com/ref/hs.addSlideshow */ 716 | /* You can safely remove this if you don't use a thumbstrip */ 717 | /*****************************************************************************/ 718 | 719 | .highslide-thumbstrip { 720 | height: 100%; 721 | direction: ltr; 722 | } 723 | .highslide-thumbstrip div { 724 | overflow: hidden; 725 | } 726 | .highslide-thumbstrip table { 727 | position: relative; 728 | padding: 0; 729 | border-collapse: collapse; 730 | } 731 | .highslide-thumbstrip td { 732 | padding: 1px; 733 | /*text-align: center;*/ 734 | } 735 | .highslide-thumbstrip a { 736 | outline: none; 737 | } 738 | .highslide-thumbstrip img { 739 | display: block; 740 | border: 1px solid gray; 741 | margin: 0 auto; 742 | } 743 | .highslide-thumbstrip .highslide-active-anchor img { 744 | visibility: visible; 745 | } 746 | .highslide-thumbstrip .highslide-marker { 747 | position: absolute; 748 | width: 0; 749 | height: 0; 750 | border-width: 0; 751 | border-style: solid; 752 | border-color: transparent; /* change this to actual background color in highslide-ie6.css */ 753 | } 754 | .highslide-thumbstrip-horizontal div { 755 | width: auto; 756 | /* width: 100% breaks in small strips in IE */ 757 | } 758 | .highslide-thumbstrip-horizontal .highslide-scroll-up { 759 | display: none; 760 | position: absolute; 761 | top: 3px; 762 | left: 3px; 763 | width: 25px; 764 | height: 42px; 765 | } 766 | .highslide-thumbstrip-horizontal .highslide-scroll-up div { 767 | margin-bottom: 10px; 768 | cursor: pointer; 769 | background: url(graphics/scrollarrows.png) left center no-repeat; 770 | height: 42px; 771 | } 772 | .highslide-thumbstrip-horizontal .highslide-scroll-down { 773 | display: none; 774 | position: absolute; 775 | top: 3px; 776 | right: 3px; 777 | width: 25px; 778 | height: 42px; 779 | } 780 | .highslide-thumbstrip-horizontal .highslide-scroll-down div { 781 | margin-bottom: 10px; 782 | cursor: pointer; 783 | background: url(graphics/scrollarrows.png) center right no-repeat; 784 | height: 42px; 785 | } 786 | .highslide-thumbstrip-horizontal table { 787 | margin: 2px 0 10px 0; 788 | } 789 | .highslide-viewport .highslide-thumbstrip-horizontal table { 790 | margin-left: 10px; 791 | } 792 | .highslide-thumbstrip-horizontal img { 793 | width: auto; 794 | height: 40px; 795 | } 796 | .highslide-thumbstrip-horizontal .highslide-marker { 797 | top: 47px; 798 | border-left-width: 6px; 799 | border-right-width: 6px; 800 | border-bottom: 6px solid gray; 801 | } 802 | .highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker { 803 | margin-left: 10px; 804 | } 805 | .dark .highslide-thumbstrip-horizontal .highslide-marker, .highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker { 806 | border-bottom-color: white !important; 807 | } 808 | 809 | .highslide-thumbstrip-vertical-overlay { 810 | overflow: hidden !important; 811 | } 812 | .highslide-thumbstrip-vertical div { 813 | height: 100%; 814 | } 815 | .highslide-thumbstrip-vertical a { 816 | display: block; 817 | } 818 | .highslide-thumbstrip-vertical .highslide-scroll-up { 819 | display: none; 820 | position: absolute; 821 | top: 0; 822 | left: 0; 823 | width: 100%; 824 | height: 25px; 825 | } 826 | .highslide-thumbstrip-vertical .highslide-scroll-up div { 827 | margin-left: 10px; 828 | cursor: pointer; 829 | background: url(graphics/scrollarrows.png) top center no-repeat; 830 | height: 25px; 831 | } 832 | .highslide-thumbstrip-vertical .highslide-scroll-down { 833 | display: none; 834 | position: absolute; 835 | bottom: 0; 836 | left: 0; 837 | width: 100%; 838 | height: 25px; 839 | } 840 | .highslide-thumbstrip-vertical .highslide-scroll-down div { 841 | margin-left: 10px; 842 | cursor: pointer; 843 | background: url(graphics/scrollarrows.png) bottom center no-repeat; 844 | height: 25px; 845 | } 846 | .highslide-thumbstrip-vertical table { 847 | margin: 10px 0 0 10px; 848 | } 849 | .highslide-thumbstrip-vertical img { 850 | width: 60px; /* t=5481 */ 851 | } 852 | .highslide-thumbstrip-vertical .highslide-marker { 853 | left: 0; 854 | margin-top: 8px; 855 | border-top-width: 6px; 856 | border-bottom-width: 6px; 857 | border-left: 6px solid gray; 858 | } 859 | .dark .highslide-thumbstrip-vertical .highslide-marker, .highslide-viewport .highslide-thumbstrip-vertical .highslide-marker { 860 | border-left-color: white; 861 | } 862 | 863 | .highslide-viewport .highslide-thumbstrip-float { 864 | overflow: auto; 865 | } 866 | .highslide-thumbstrip-float ul { 867 | margin: 2px 0; 868 | padding: 0; 869 | } 870 | .highslide-thumbstrip-float li { 871 | display: block; 872 | height: 60px; 873 | margin: 0 2px; 874 | list-style: none; 875 | float: left; 876 | } 877 | .highslide-thumbstrip-float img { 878 | display: inline; 879 | border-color: silver; 880 | max-height: 56px; 881 | } 882 | .highslide-thumbstrip-float .highslide-active-anchor img { 883 | border-color: black; 884 | } 885 | .highslide-thumbstrip-float .highslide-scroll-up div, .highslide-thumbstrip-float .highslide-scroll-down div { 886 | display: none; 887 | } 888 | .highslide-thumbstrip-float .highslide-marker { 889 | display: none; 890 | } -------------------------------------------------------------------------------- /static/highslide/highslide.packed.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Name: Highslide JS 3 | * Version: 5.0.0 (2016-05-24) 4 | * Config: default +packed 5 | * Author: Torstein Hønsi 6 | * Support: www.highslide.com/support 7 | * License: MIT 8 | */ 9 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1E:{8k:\'6Y\',6T:\'93...\',6S:\'6b 1K 92\',7S:\'6b 1K 91 1K 8Z\',7H:\'90 1K 94 I (f)\',8z:\'95 2u 6U 6Q\',8x:\'9a 1K 98 6U 6Q 97\',5U:\'6b 1K 2g 1W, 96 6V 8Y 1K 3c. 8X 8Q 8P Q 1z 6V 6I.\'},43:\'1d/8O/\',4B:\'8M.6v\',3R:\'8N.6v\',7T:59,7L:59,42:15,8s:15,47:15,81:15,3L:8R,7f:0.75,8j:G,5T:5,30:2,8S:3,3W:19,7M:\'2S 2o\',7Y:1,85:G,8o:\'8W://1d.8V/\',8u:\'8U\',6H:G,5h:[\'a\'],68:G,3X:6W,3V:6W,3N:G,1g:\'8T-9b\',3U:[],5i:G,N:[],5m:[\'3N\',\'2e\',\'1g\',\'30\',\'9c\',\'9u\',\'9t\',\'6Z\',\'9s\',\'9q\',\'9r\',\'71\',\'8w\',\'68\',\'M\',\'14\',\'60\',\'3X\',\'3V\',\'57\',\'5r\',\'86\',\'3a\',\'1J\',\'7R\',\'7Q\',\'1k\'],1x:[],3B:0,9v:{x:[\'8a\',\'18\',\'6d\',\'2o\',\'7z\'],y:[\'46\',\'Y\',\'6a\',\'2S\',\'4l\']},4v:{},71:{},6Z:{},2z:[],2M:{},6m:{},4w:[],1R:K.9A||6h((4x.6e.5a().2X(/.+(?:6P|9z|9y|1Q)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1Q:(K.3S&&!1m.2q),4D:/9x/.17(4x.6e),8t:/9p.+6P:1\\.[0-8].+9o/.17(4x.6e),$:A(1t){q(1t)C K.9h(1t)},2c:A(24,2x){24[24.W]=2x},11:A(6G,35,2E,6k,6E){u B=K.11(6G);q(35)m.2p(B,35);q(6E)m.U(B,{9f:0,9d:\'3q\',5s:0});q(2E)m.U(B,2E);q(6k)6k.2k(B);C B},2p:A(B,35){Q(u x 3v 35)B[x]=35[x];C B},U:A(B,2E){Q(u x 3v 2E){q(m.31&&x==\'1p\'){q(2E[x]>0.99)B.F.9e(\'3P\');L B.F.3P=\'7o(1p=\'+(2E[x]*1X)+\')\'}L B.F[x]=2E[x]}},3p:A(B,R,26){u 2P,3h,2O;q(1o 26!=\'5R\'||26===H){u 2v=7A;26={2T:2v[2],1J:2v[3],5w:2v[4]}}q(1o 26.2T!=\'3g\')26.2T=59;26.1J=1b[26.1J]||1b.6R;26.4g=m.2p({},R);Q(u 2d 3v R){u e=1Z m.1j(B,26,2d);2P=6h(m.5j(B,2d))||0;3h=6h(R[2d]);2O=2d!=\'1p\'?\'D\':\'\';e.2y(2P,3h,2O)}},5j:A(B,R){q(B.F[R]){C B.F[R]}L q(K.6l){C K.6l.8m(B,H).7F(R)}L{q(R==\'1p\')R=\'3P\';u 2x=B.8L[R.2Y(/\\-(\\w)/g,A(a,b){C b.9j()})];q(R==\'3P\')2x=2x.2Y(/7o\\(1p=([0-9]+)\\)/,A(a,b){C b/1X});C 2x===\'\'?1:2x}},4u:A(){u d=K,w=1m,3E=d.5c&&d.5c!=\'5d\'?d.3e:d.4q,31=m.1Q&&(m.1R<9||1o 7q==\'1V\');u M=31?3E.7r:(d.3e.7r||4a.9n),14=31?3E.9m:4a.9l;m.2I={M:M,14:14,4I:31?3E.4I:7q,4L:31?3E.4L:9k};C m.2I},63:A(B){u p={x:B.7g,y:B.78};3t(B.7h){B=B.7h;p.x+=B.7g;p.y+=B.78;q(B!=K.4q&&B!=K.3e){p.x-=B.4I;p.y-=B.4L}}C p},4z:A(a,21,2y,J){q(!a)a=m.11(\'a\',H,{3r:\'3q\'},m.1S);q(1o a.3G==\'A\')C 21;1A{1Z m.45(a,21,2y);C 19}1B(e){C G}},6K:A(){u 5W=0,4X=-1,N=m.N,z,1n;Q(u i=0;i5W){5W=1n;4X=i}}}q(4X==-1)m.2r=-1;L N[4X].3x()},5e:A(a,3I){a.3G=a.3y;u p=a.3G?a.3G():H;a.3G=H;C(p&&1o p[3I]!=\'1V\')?p[3I]:(1o m[3I]!=\'1V\'?m[3I]:H)},5k:A(a){u 1k=m.5e(a,\'1k\');q(1k)C 1k;C a.3u},3F:A(1t){u 4h=m.$(1t),2U=m.6m[1t],a={};q(!4h&&!2U)C H;q(!2U){2U=4h.7c(G);2U.1t=\'\';m.6m[1t]=2U;C 4h}L{C 2U.7c(G)}},3k:A(d){q(d)m.5F.2k(d);m.5F.3H=\'\'},7b:A(66,z){u 2F=z||m.2A();z=2F;q(m.2V)C 19;L m.2F=2F;m.3i(K,1m.2q?\'4O\':\'4R\',m.3A);1A{m.2V=66;66.3y()}1B(e){m.2F=m.2V=H}1A{z.2g()}1B(e){}C 19},49:A(B,20){u z=m.2A(B);q(z)C m.7b(z.5l(20),z);L C 19},6I:A(B){C m.49(B,-1)},1z:A(B){C m.49(B,1)},3A:A(e){q(!e)e=1m.1F;q(!e.1P)e.1P=e.6A;q(1o e.1P.7i!=\'1V\')C G;u z=m.2A();u 20=H;7u(e.8C){1q 70:q(z)z.5L();C G;1q 32:1q 34:1q 39:1q 40:20=1;6q;1q 8:1q 33:1q 37:1q 38:20=-1;6q;1q 27:1q 13:20=0}q(20!==H){m.3i(K,1m.2q?\'4O\':\'4R\',m.3A);q(!m.6H)C G;q(e.4M)e.4M();L e.8K=19;q(z){q(20==0){z.2g()}L{m.49(z.S,20)}C 19}}C G},8I:A(O){m.2c(m.1x,m.2p(O,{22:\'22\'+m.3B++}))},65:A(6C,4c){u B,2R=/^1d-V-([0-9]+)$/;B=6C;3t(B.2W){q(B.1t&&2R.17(B.1t))C B.1t.2Y(2R,"$1");B=B.2W}q(!4c){B=6C;3t(B.2W){q(B.4f&&m.4H(B)){Q(u S=0;S1)C G;q(!e.1P)e.1P=e.6A;u B=e.1P;3t(B.2W&&!(/1d-(1W|3c|51|2Z)/.17(B.1h))){B=B.2W}u z=m.2A(B);q(z&&(z.6i||!z.3Y))C G;q(z&&e.J==\'7a\'){q(e.1P.7i)C G;u 2X=B.1h.2X(/1d-(1W|3c|2Z)/);q(2X){m.1U={z:z,J:2X[1],18:z.x.E,M:z.x.I,Y:z.y.E,14:z.y.I,7m:e.4J,7e:e.4i};m.1D(K,\'6y\',m.6z);q(e.4M)e.4M();q(/1d-(1W|51)-5V/.17(z.Z.1h)){z.3x();m.6D=G}C 19}}L q(e.J==\'7p\'){m.3i(K,\'6y\',m.6z);q(m.1U){q(m.3f&&m.1U.J==\'1W\')m.1U.z.Z.F.2K=m.3f;u 2C=m.1U.2C;q(!2C&&!m.6D&&!/(3c|2Z)/.17(m.1U.J)){z.2g()}L q(2C||(!2C&&m.8F)){m.1U.z.44(\'1i\')}m.6D=19;m.1U=H}L q(/1d-1W-5V/.17(B.1h)){B.F.2K=m.3f}}C 19},6z:A(e){q(!m.1U)C G;q(!e)e=1m.1F;u a=m.1U,z=a.z;a.58=e.4J-a.7m;a.6n=e.4i-a.7e;u 6p=1b.a7(1b.74(a.58,2)+1b.74(a.6n,2));q(!a.2C)a.2C=(a.J!=\'1W\'&&6p>0)||(6p>(m.aj||5));q(a.2C&&e.4J>5&&e.4i>5){q(a.J==\'2Z\')z.2Z(a);L{z.5I(a.18+a.58,a.Y+a.6n);q(a.J==\'1W\')z.Z.F.2K=\'3c\'}}C 19},88:A(e){1A{q(!e)e=1m.1F;u 4C=/ao/i.17(e.J);q(!e.1P)e.1P=e.6A;q(!e.4K)e.4K=4C?e.ai:e.9C;u z=m.2A(e.1P);q(!z.3Y)C;q(!z||!e.4K||m.2A(e.4K,G)==z||m.1U)C;Q(u i=0;i=k.1w.2T+k.5E){k.2N=k.3h;k.E=k.5C=1;k.5x();k.1w.4g[k.R]=G;u 5v=G;Q(u i 3v k.1w.4g)q(k.1w.4g[i]!==G)5v=19;q(5v){q(k.1w.5w)k.1w.5w.7d(k.1M)}C 19}L{u n=t-k.5E;k.5C=n/k.1w.2T;k.E=k.1w.1J(n,0,1,k.1w.2T);k.2N=k.2P+((k.3h-k.2P)*k.E);k.5x()}C G}};m.2p(m.1j,{2w:{1p:A(1j){m.U(1j.1M,{1p:1j.2N})},79:A(1j){1A{q(1j.1M.F&&1j.1M.F[1j.R]!=H)1j.1M.F[1j.R]=1j.2N+1j.2O;L 1j.1M[1j.R]=1j.2N}1B(e){}}}});m.3Z=A(1g,2Q){k.2Q=2Q;k.1g=1g;u v=m.1R,4V;k.5J=m.1Q&&m.1R<7;q(!1g){q(2Q)2Q();C}m.6x();k.2a=m.11(\'2a\',{9W:0},{1c:\'1i\',1e:\'23\',9V:\'9X\',M:0},m.1S,G);u 5N=m.11(\'5N\',H,H,k.2a,1);k.1I=[];Q(u i=0;i<=8;i++){q(i%3==0)4V=m.11(\'4V\',H,{14:\'2j\'},5N,G);k.1I[i]=m.11(\'1I\',H,H,4V,G);u F=i!=4?{a0:0,9Z:0}:{1e:\'6j\'};m.U(k.1I[i],F)}k.1I[4].1h=1g+\' 1d-1a\';k.7l()};m.3Z.55={7l:A(){u 1k=m.43+(m.9L||"9O/")+k.1g+".9N";u 73=m.4D&&m.1R<7Z?m.1S:H;k.2m=m.11(\'1f\',H,{1e:\'23\',Y:\'-3K\'},73,G);u 7t=k;k.2m.4U=A(){7t.6X()};k.2m.1k=1k},6X:A(){u o=k.1l=k.2m.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1v={14:(2*o)+\'D\',M:(2*o)+\'D\'};Q(u i=0;i<=8;i++){q(E[i]){q(k.5J){u w=(i==1||i==7)?\'1X%\':k.2m.M+\'D\';u 1N=m.11(\'1N\',H,{M:\'1X%\',14:\'1X%\',1e:\'6j\',2L:\'1i\'},k.1I[i],G);m.11(\'1N\',H,{3P:"af:9Y.9U.a1(a8=9I, 1k=\'"+k.2m.1k+"\')",1e:\'23\',M:w,14:k.2m.14+\'D\',18:(E[i][0]*o)+\'D\',Y:(E[i][1]*o)+\'D\'},1N,G)}L{m.U(k.1I[i],{9J:\'5S(\'+k.2m.1k+\') \'+(E[i][0]*o)+\'D \'+(E[i][1]*o)+\'D\'})}q(1m.2q&&(i==3||i==5))m.11(\'1N\',H,1v,k.1I[i],G);m.U(k.1I[i],1v)}}k.2m=H;q(m.2M[k.1g])m.2M[k.1g].4p();m.2M[k.1g]=k;q(k.2Q)k.2Q()},3C:A(E,1l,6N,2t,1J){u z=k.z,9F=z.V.F,1l=1l||0,E=E||{x:z.x.E+1l,y:z.y.E+1l,w:z.x.P(\'1u\')-2*1l,h:z.y.P(\'1u\')-2*1l};q(6N)k.2a.F.1c=(E.h>=4*k.1l)?\'1T\':\'1i\';m.U(k.2a,{18:(E.x-k.1l)+\'D\',Y:(E.y-k.1l)+\'D\',M:(E.w+2*k.1l)+\'D\'});E.w-=2*k.1l;E.h-=2*k.1l;m.U(k.1I[4],{M:E.w>=0?E.w+\'D\':0,14:E.h>=0?E.h+\'D\':0});q(k.5J)k.1I[3].F.14=k.1I[5].F.14=k.1I[4].F.14},4p:A(6O){q(6O)k.2a.F.1c=\'1i\';L m.3k(k.2a)}};m.4W=A(z,1v){k.z=z;k.1v=1v;k.2H=1v==\'x\'?\'ax\':\'av\';k.2D=k.2H.5a();k.3O=1v==\'x\'?\'ar\':\'au\';k.5o=k.3O.5a();k.5g=1v==\'x\'?\'az\':\'aA\';k.aG=k.5g.5a();k.1C=k.2l=0};m.4W.55={P:A(S){7u(S){1q\'5M\':C k.1r+k.2i+(k.t-m.1G[\'1l\'+k.2H])/2;1q\'1u\':C k.I+2*k.X+k.1C+k.2l;1q\'3o\':C k.56-k.2J-k.54;1q\'5D\':C k.P(\'3o\')-2*k.X-k.1C-k.2l;1q\'3Q\':C k.E-(k.z.1a?k.z.1a.1l:0);1q\'64\':C k.P(\'1u\')+(k.z.1a?2*k.z.1a.1l:0);1q\'4e\':C k.1y?1b.5b((k.I-k.1y)/2):0}},5z:A(){k.X=(k.z.Z[\'1l\'+k.2H]-k.t)/2;k.54=m[\'5s\'+k.5g]},5p:A(){k.t=k.z.B[k.2D]?aC(k.z.B[k.2D]):k.z.B[\'1l\'+k.2H];k.1r=k.z.1r[k.1v];k.2i=(k.z.B[\'1l\'+k.2H]-k.t)/2;q(k.1r==0||k.1r==-1){k.1r=(m.2I[k.2D]/2)+m.2I[\'2B\'+k.3O]}},5y:A(){u z=k.z;k.3n=\'2j\';k.E=k.1r-k.X+k.2i;q(k.5r&&k.1v==\'x\')z.57=1b.29(z.57||k.T,z.5r*k.T/z.y.T);k.I=1b.29(k.T,z[\'5Z\'+k.2H]||k.T);k.1Y=z.3N?1b.29(z[\'29\'+k.2H],k.T):k.T;q(z.3d&&z.2e){k.I=z[k.2D];k.1y=k.T}q(k.1v==\'x\'&&m.3W)k.1Y=z.3X;k.2J=m[\'5s\'+k.3O];k.2B=m.2I[\'2B\'+k.3O];k.56=m.2I[k.2D]},67:A(i){u z=k.z;q(z.3d&&(z.2e||m.3W)){k.1y=i;k.I=1b.5Z(k.I,k.1y);z.Z.F[k.5o]=k.P(\'4e\')+\'D\'}L k.I=i;z.Z.F[k.2D]=i+\'D\';z.V.F[k.2D]=k.P(\'1u\')+\'D\';q(z.1a)z.1a.3C();q(k.1v==\'x\'&&z.1s)z.3b(G)},5X:A(i){k.E=i;k.z.V.F[k.5o]=i+\'D\';q(k.z.1a)k.z.1a.3C()}};m.45=A(a,21,2y,2b){q(K.ad&&m.1Q&&!m.5n){m.1D(K,\'2G\',A(){1Z m.45(a,21,2y,2b)});C}k.a=a;k.2y=2y;k.2b=2b||\'1W\';k.3d=!k.ak;m.5i=19;k.1x=[];m.6x();u S=k.S=m.N.W;Q(u i=0;i(k.x.1y||k.x.I)){k.8r();q(k.1x.W==1)k.3b()}}k.7E()}1B(e){k.5P(e)}},3n:A(p,3l){u a5,a3=p.1P,1v=p==k.x?\'x\':\'y\';u 5B=19;u 3m=p.z.3N;p.E=1b.5b(p.E-((p.P(\'1u\')-p.t)/2));q(p.Ep.2B+p.56-p.54){q(!3l&&5B&&3m){p.I=1b.29(p.I,p.P(1v==\'y\'?\'3o\':\'5D\'))}L q(p.P(\'1u\')1H){ 1O=25*1H;q(1Ok.3V&&x.I>k.3X&&y.P(\'1u\')>y.P(\'3o\')){y.I-=10;q(1H)x.I=y.I*1H;k.3b(0,1);2n=G}}C 2n},7E:A(){u x=k.x,y=k.y;k.44(\'1i\');k.6f(1,{V:{M:x.P(\'1u\'),14:y.P(\'1u\'),18:x.E,Y:y.E},Z:{18:x.1C+x.P(\'4e\'),Y:y.1C+y.P(\'4e\'),M:x.1y||x.I,14:y.1y||y.I}},m.7T)},6f:A(28,1K,2t){q(k.1a&&!k.30){q(28)k.1a.3C();L k.1a.4p()}q(!28)k.8q();u z=k,x=z.x,y=z.y,1J=k.1J;q(!28)1J=k.7R||1J;u 80=28?A(){q(z.1a)z.1a.2a.F.1c="1T";5A(A(){z.7W()},50)}:A(){z.5G()};q(28)m.U(k.V,{M:x.t+\'D\',14:y.t+\'D\'});q(k.7Q){m.U(k.V,{1p:28?0:1});m.2p(1K.V,{1p:28})}m.3p(k.V,1K.V,{2T:2t,1J:1J,2w:A(2x,2v){q(z.1a&&z.30&&2v.R==\'Y\'){u 3J=28?2v.E:1-2v.E;u E={w:x.t+(x.P(\'1u\')-x.t)*3J,h:y.t+(y.P(\'1u\')-y.t)*3J,x:x.1r+(x.E-x.1r)*3J,y:y.1r+(y.E-y.1r)*3J};z.1a.3C(E,0,1)}}});m.3p(k.Z,1K.Z,2t,1J,80);q(28){k.V.F.1c=\'1T\';k.Z.F.1c=\'1T\';k.a.1h+=\' 1d-8l-8y\'}},7W:A(){k.3Y=G;k.3x();q(m.2V&&m.2V==k.a)m.2V=H;k.7B();u p=m.2I,5t=m.4v.x+p.4I,5q=m.4v.y+p.4L;k.6w=k.x.E<5t&&5tk.x.P(\'3Q\')+k.x.P(\'64\'));u 7C=(2f.y+2f.hk.y.P(\'3Q\')+k.y.P(\'64\'));u 4m=m.65(16[i]);q(!7K&&!7C&&4m!=k.S){q(!1L){16[i].3T(\'1i-2u\',\'[\'+k.S+\']\');16[i].61=16[i].F[R];16[i].F[R]=\'1i\'}L q(1L.7x(\'[\'+k.S+\']\')==-1){16[i].3T(\'1i-2u\',1L+\'[\'+k.S+\']\')}}L q((1L==\'[\'+k.S+\']\'||m.2r==4m)&&4m!=k.S){16[i].3T(\'1i-2u\',\'\');16[i].F[R]=16[i].61||\'\'}L q(1L&&1L.7x(\'[\'+k.S+\']\')>-1){16[i].3T(\'1i-2u\',1L.2Y(\'[\'+k.S+\']\',\'\'))}}}}},3x:A(){k.V.F.1n=m.3L+=2;Q(u i=0;i.*?$/,"").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1="rgb($2)" $1-opacity="$3"').replace(/ /g,"\u00a0").replace(/­/g,"\u00ad").replace(//g,"<$1title>").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/ id=([^" >]+)/g, 14 | ' id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(a){var b=this,e,c,g,j,h,d=l(b.options,a),m=d.exporting.allowHTML;if(!k.createElementNS)k.createElementNS=function(a,b){return k.createElement(b)};c=s("div",null,{position:"absolute",top:"-9999em",width:b.chartWidth+"px",height:b.chartHeight+"px"},k.body); 15 | g=b.renderTo.style.width;h=b.renderTo.style.height;g=d.exporting.sourceWidth||d.chart.width||/px$/.test(g)&&parseInt(g,10)||600;h=d.exporting.sourceHeight||d.chart.height||/px$/.test(h)&&parseInt(h,10)||400;r(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:g,height:h});d.exporting.enabled=!1;delete d.data;d.series=[];q(b.series,function(a){j=l(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});j.isInternal||d.series.push(j)});a&&q(["xAxis", 16 | "yAxis"],function(b){q(F(a[b]),function(a,c){d[b][c]=l(d[b][c],a)})});e=new f.Chart(d,b.callback);q(["xAxis","yAxis"],function(a){q(b[a],function(b,c){var d=e[a][c],f=b.getExtremes(),g=f.userMin,f=f.userMax;d&&(g!==void 0||f!==void 0)&&d.setExtremes(g,f,!0,!1)})});g=e.getChartHTML();d=null;e.destroy();u(c);if(m&&(c=g.match(/<\/svg>(.*?$)/)))c=''+c[1]+"",g=g.replace("",c+""); 17 | g=this.sanitizeSVG(g);return g=g.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'")},getSVGForExport:function(a,b){var e=this.options.exporting;return this.getSVG(l({chart:{borderRadius:0}},e.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||e.sourceWidth,sourceHeight:a&&a.sourceHeight||e.sourceHeight}}))},exportChart:function(a,b){var e=this.getSVGForExport(a,b),a=l(this.options.exporting,a);f.post(a.url,{filename:a.filename||"chart",type:a.type,width:a.width||0,scale:a.scale|| 18 | 2,svg:e},a.formAttributes)},print:function(){var a=this,b=a.container,e=[],c=b.parentNode,f=k.body,j=f.childNodes,h=a.options.exporting.printMaxWidth,d,m,n;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);E(a,"beforePrint");if(n=h&&a.chartWidth>h)d=a.hasUserSize,m=[a.chartWidth,a.chartHeight,!1],a.setSize(h,a.chartHeight,!1);q(j,function(a,b){if(a.nodeType===1)e[b]=a.style.display,a.style.display="none"});f.appendChild(b);t.focus();t.print();setTimeout(function(){c.appendChild(b);q(j,function(a, 19 | b){if(a.nodeType===1)a.style.display=e[b]});a.isPrinting=!1;if(n)a.setSize.apply(a,m),a.hasUserSize=d;E(a,"afterPrint")},1E3)}},contextMenu:function(a,b,e,c,f,j,h){var d=this,m=d.options.navigation,n=m.menuItemStyle,o=d.chartWidth,p=d.chartHeight,l="cache-"+a,i=d[l],w=G(f,j),y,z,t,u=function(b){d.pointer.inClass(b.target,a)||z()};if(!i)d[l]=i=s("div",{className:a},{position:"absolute",zIndex:1E3,padding:w+"px"},d.container),y=s("div",null,r({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888", 20 | boxShadow:"3px 3px 10px #888"},m.menuStyle),i),z=function(){x(i,{display:"none"});h&&h.setState(0);d.openMenu=!1},v(i,"mouseleave",function(){t=setTimeout(z,500)}),v(i,"mouseenter",function(){clearTimeout(t)}),v(k,"mouseup",u),v(d,"destroy",function(){D(k,"mouseup",u)}),q(b,function(a){if(a){var b=a.separator?s("hr",null,null,y):s("div",{onmouseover:function(){x(this,m.menuItemHoverStyle)},onmouseout:function(){x(this,n)},onclick:function(b){b&&b.stopPropagation();z();a.onclick&&a.onclick.apply(d, 21 | arguments)},innerHTML:a.text||d.options.lang[a.textKey]},r({cursor:"pointer"},n),y);d.exportDivElements.push(b)}}),d.exportDivElements.push(y,i),d.exportMenuWidth=i.offsetWidth,d.exportMenuHeight=i.offsetHeight;b={display:"block"};e+d.exportMenuWidth>o?b.right=o-e-f-w+"px":b.left=e-w+"px";c+j+d.exportMenuHeight>p&&h.alignOptions.verticalAlign!=="top"?b.bottom=p-c-w+"px":b.top=c+j-w+"px";x(i,b);d.openMenu=!0},addButton:function(a){var b=this,e=b.renderer,c=l(b.options.navigation.buttonOptions,a),g= 22 | c.onclick,j=c.menuItems,h,d,m={stroke:c.symbolStroke,fill:c.symbolFill},n=c.symbolSize||12;if(!b.btnCount)b.btnCount=0;if(!b.exportDivElements)b.exportDivElements=[],b.exportSVGElements=[];if(c.enabled!==!1){var o=c.theme,p=o.states,k=p&&p.hover,p=p&&p.select,i;delete o.states;g?i=function(a){a.stopPropagation();g.call(b,a)}:j&&(i=function(){b.contextMenu(d.menuClassName,j,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?o.paddingLeft=f.pick(o.paddingLeft,25):c.text|| 23 | r(o,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,i,o,k,p).attr({title:b.options.lang[c._titleKey],"stroke-linecap":"round",zIndex:3});d.menuClassName=a.menuClassName||"highcharts-menu-"+b.btnCount++;c.symbol&&(h=e.symbol(c.symbol,c.symbolX-n/2,c.symbolY-n/2,n,n).attr(r(m,{"stroke-width":c.symbolStrokeWidth||1,zIndex:1})).add(d));d.add().align(r(c,{width:d.width,x:f.pick(c.x,B)}),!0,"spacingBox");B+=(d.width+c.buttonSpacing)*(c.align==="right"?-1:1);b.exportSVGElements.push(d,h)}}, 24 | destroyExport:function(a){var a=a.target,b,e;for(b=0;b= len(model.layers): 76 | # we don't look at the last (fully-connected) layers in the savefile 77 | break 78 | g = f['layer_{}'.format(k)] 79 | weights = [g['param_{}'.format(p)] for p in range(g.attrs['nb_params'])] 80 | model.layers[k].set_weights(weights) 81 | f.close() 82 | model.save_weights('vgg16_cnn_only_weights.h5') 83 | 84 | 85 | def load_vgg16_cnn_model(input_layer, weights_path='vgg16_cnn_only_weights.h5'): 86 | model = vgg16_cnn_model(input_layer) 87 | model.load_weights(weights_path) 88 | print('Model loaded.') 89 | return model 90 | --------------------------------------------------------------------------------