1 | """Graphical user interface system. |
---|
2 | |
---|
3 | Widgets properties are classified as mutable or static. |
---|
4 | Mutable properties have a clear separation between model and view. |
---|
5 | |
---|
6 | @author Michael Reimpell |
---|
7 | """ |
---|
8 | # Copyright (C) 2005 Michael Reimpell |
---|
9 | # |
---|
10 | # This library is free software; you can redistribute it and/or |
---|
11 | # modify it under the terms of the GNU Lesser General Public |
---|
12 | # License as published by the Free Software Foundation; either |
---|
13 | # version 2.1 of the License, or (at your option) any later version. |
---|
14 | # |
---|
15 | # This library is distributed in the hope that it will be useful, |
---|
16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
18 | # Lesser General Public License for more details. |
---|
19 | # |
---|
20 | # You should have received a copy of the GNU Lesser General Public |
---|
21 | # License along with this library; if not, write to the Free Software |
---|
22 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
---|
23 | |
---|
24 | # epydoc doc format |
---|
25 | __docformat__ = "javadoc en" |
---|
26 | |
---|
27 | import os |
---|
28 | import Blender |
---|
29 | from Blender import Draw |
---|
30 | from Blender.BGL import * |
---|
31 | |
---|
32 | import base |
---|
33 | from base import * |
---|
34 | |
---|
35 | class Action: |
---|
36 | """Action interface. |
---|
37 | |
---|
38 | Actions encapsulate user requests. |
---|
39 | """ |
---|
40 | def __init__(self): |
---|
41 | """Constructor. |
---|
42 | """ |
---|
43 | return |
---|
44 | def execute(self): |
---|
45 | """Executes the action. |
---|
46 | """ |
---|
47 | return |
---|
48 | |
---|
49 | class QuitAction(Action): |
---|
50 | """Quits the windowing system. |
---|
51 | """ |
---|
52 | def execute(self): |
---|
53 | Blender.Draw.Exit() |
---|
54 | return |
---|
55 | |
---|
56 | class Size: |
---|
57 | """Size hints. |
---|
58 | |
---|
59 | @cvar INFINITY Infinity value for size hints. |
---|
60 | """ |
---|
61 | INFINITY = 2147483647 |
---|
62 | def __init__(self, preferredSize=None, minimumSize=None, maximumSize=None): |
---|
63 | """Constructor. |
---|
64 | |
---|
65 | A size hint is a list of integers <code>[width, height]</code>. |
---|
66 | |
---|
67 | @param preferredSize Default <code>[0,0]</code>. |
---|
68 | @param minimumSize Default <code>[0,0]</code>. |
---|
69 | @param maximumSize Default <code>[Size.INFINITY, Size.INFINITY]</code>. |
---|
70 | """ |
---|
71 | self.preferredSize = preferredSize or [0, 0] |
---|
72 | if minimumSize: |
---|
73 | self.minimumSize = minimumSize |
---|
74 | elif ((self.preferredSize[0] < Size.INFINITY) and (self.preferredSize[1] < Size.INFINITY)): |
---|
75 | self.minimumSize = self.preferredSize[:] |
---|
76 | else: |
---|
77 | self.minimumSize = [0, 0] |
---|
78 | if preferredSize: |
---|
79 | self.maximumSize = maximumSize or self.preferredSize[:] |
---|
80 | else: |
---|
81 | self.maximumSize = maximumSize or [Size.INFINITY, Size.INFINITY] |
---|
82 | return |
---|
83 | def getPreferredSize(self): |
---|
84 | return self.preferredSize |
---|
85 | def getMinimumSize(self): |
---|
86 | return self.minimumSize |
---|
87 | def getMaximumSize(self): |
---|
88 | return self.maximumSize |
---|
89 | |
---|
90 | class Widget: |
---|
91 | """Widget interface. |
---|
92 | """ |
---|
93 | def __init__(self, parent, size = Size()): |
---|
94 | """Constructor. |
---|
95 | |
---|
96 | Overwrite the constructor to get event numbers for all used |
---|
97 | actions via a call to <code>parent._addButtonAction()</code>. |
---|
98 | |
---|
99 | @param name The widget name must be unique. |
---|
100 | @param size Size hints. |
---|
101 | """ |
---|
102 | self.parent = parent |
---|
103 | self.size = size |
---|
104 | self.parent._addWidget(self) |
---|
105 | return |
---|
106 | def draw(self, screenRectangle): |
---|
107 | """Draws the widget into an area of the screen. |
---|
108 | |
---|
109 | @param screenRectangle Area of the screen to draw into. |
---|
110 | The screenRectangle is a list of the integers |
---|
111 | <code>[xl, yl, xu, yu]</code>, where (xl,yl) is |
---|
112 | the lower left corner of the area and (xu, yu) is |
---|
113 | the upper right corner of the area. |
---|
114 | """ |
---|
115 | return |
---|
116 | def eventFilter(self, event, value): |
---|
117 | """Called from event callback function. |
---|
118 | |
---|
119 | @see Blender.Draw.Register |
---|
120 | """ |
---|
121 | return |
---|
122 | def getSize(self): |
---|
123 | """Size hints of the widget. |
---|
124 | |
---|
125 | @return Size object. |
---|
126 | """ |
---|
127 | return self.size |
---|
128 | def resize(self, size=None): |
---|
129 | """Resizes the widget. |
---|
130 | |
---|
131 | @param size New widget size or <code>None</code> to |
---|
132 | inform about resize of child widgets. |
---|
133 | """ |
---|
134 | if size: |
---|
135 | self.size = size |
---|
136 | self.parent.resize() |
---|
137 | return |
---|
138 | def removeFromParent(self): |
---|
139 | """Remove this widget from parent widget. |
---|
140 | |
---|
141 | Remove a widget from its parent before deleting it. Overwrite |
---|
142 | this to also remove all button actions separately with a call |
---|
143 | to <code>self.parent._removeButtonAction()</code>. This is not |
---|
144 | done in the destructor as Python's garbage collector does not |
---|
145 | guarantee to delete objects. |
---|
146 | """ |
---|
147 | self.parent._removeWidget(self) |
---|
148 | return |
---|
149 | def _addWidget(self, widget): |
---|
150 | """Adds a child widget. |
---|
151 | |
---|
152 | @param widget Child widget to add. |
---|
153 | """ |
---|
154 | raise NotImplementedError |
---|
155 | return |
---|
156 | def _removeWidget(self, widget): |
---|
157 | """Removes a child widget. |
---|
158 | |
---|
159 | @param widget Child widget to remove. |
---|
160 | """ |
---|
161 | raise NotImplementedError |
---|
162 | return |
---|
163 | def _addButtonAction(self, action): |
---|
164 | """Registers an action for a button event. |
---|
165 | |
---|
166 | @param action Action to execute on receive of the returned button event number. |
---|
167 | @return eventNumber Event number to use for the button that corresponds to that action. |
---|
168 | """ |
---|
169 | return self.parent._addButtonAction(action) |
---|
170 | def _removeButtonAction(self, eventNumber): |
---|
171 | """Action for the given event number will no longer be called. |
---|
172 | |
---|
173 | @param eventNumber Event number for the action. |
---|
174 | """ |
---|
175 | self.parent._removeButtonAction(eventNumber) |
---|
176 | return |
---|
177 | |
---|
178 | class Spacer(Widget): |
---|
179 | """Occupies blank space on the screen. |
---|
180 | """ |
---|
181 | def __init__(self, parent, size): |
---|
182 | Widget.__init__(self, parent, size) |
---|
183 | return |
---|
184 | |
---|
185 | class Decorator(Widget): |
---|
186 | """Decorates a child widget. |
---|
187 | |
---|
188 | A decorator does not have a name on its own. It adopts the name |
---|
189 | of its child widget. |
---|
190 | """ |
---|
191 | def __init__(self, parent): |
---|
192 | self.childWidget = None |
---|
193 | Widget.__init__(self, parent) |
---|
194 | return |
---|
195 | def draw(self, screenRectangle): |
---|
196 | self.childWidget.draw(screenRectangle) |
---|
197 | return |
---|
198 | def eventFilter(self, event, value): |
---|
199 | self.childWidget.eventFilter(event, value) |
---|
200 | return |
---|
201 | def getSize(self): |
---|
202 | if self.childWidget: |
---|
203 | size = self.childWidget.getSize() |
---|
204 | else: |
---|
205 | # no child widget yet |
---|
206 | size = Size() |
---|
207 | return size |
---|
208 | def resize(self, size=None): |
---|
209 | if size: |
---|
210 | # pass resize request to the child |
---|
211 | self.childWidget.resize(size) |
---|
212 | else: |
---|
213 | # pass child resize notification to the parent |
---|
214 | self.parent.resize() |
---|
215 | return |
---|
216 | def _addWidget(self, widget): |
---|
217 | self.childWidget = widget |
---|
218 | self.parent.resize() |
---|
219 | return |
---|
220 | |
---|
221 | class Activator(Decorator): |
---|
222 | """Enables and disables child widget. |
---|
223 | """ |
---|
224 | def __init__(self, parent, enabled=1): |
---|
225 | Decorator.__init__(self, parent) |
---|
226 | self.enabled = enabled |
---|
227 | def eventFilter(self, event, value): |
---|
228 | if self.enabled: |
---|
229 | self.childWidget.eventFilter(event, value) |
---|
230 | return |
---|
231 | def draw(self, screenRectangle): |
---|
232 | if self.enabled: |
---|
233 | self.childWidget.draw(screenRectangle) |
---|
234 | return |
---|
235 | def setEnabled(self, enabled): |
---|
236 | self.enabled = enabled |
---|
237 | return |
---|
238 | def isEnabled(self): |
---|
239 | return self.enabled |
---|
240 | |
---|
241 | class ValueModel(Model): |
---|
242 | """Model with a value of arbitrary type. |
---|
243 | """ |
---|
244 | def __init__(self, value): |
---|
245 | Model.__init__(self) |
---|
246 | self.value = None |
---|
247 | self.setValue(value) |
---|
248 | return |
---|
249 | def setValue(self, value): |
---|
250 | self.value = value |
---|
251 | self._notify() |
---|
252 | return |
---|
253 | def getValue(self): |
---|
254 | return self.value |
---|
255 | |
---|
256 | class T(ValueModel): |
---|
257 | """Short name for ValueModel. |
---|
258 | |
---|
259 | @see ValueModel |
---|
260 | """ |
---|
261 | |
---|
262 | class BoundedValueModel(ValueModel): |
---|
263 | def __init__(self, minimum=0, maximum=0, initial=0): |
---|
264 | self.minimum = minimum |
---|
265 | self.maximum = maximum |
---|
266 | ValueModel.__init__(self, initial) |
---|
267 | return |
---|
268 | def getMinimum(self): |
---|
269 | return self.minimum |
---|
270 | def getMaximum(self): |
---|
271 | return self.maximum |
---|
272 | def setValue(self, value): |
---|
273 | if (value != self.value): |
---|
274 | if value < self.minimum: |
---|
275 | self.value = self.minimum |
---|
276 | elif value > self.maximum: |
---|
277 | self.value = self.maximum |
---|
278 | else: |
---|
279 | self.value = value |
---|
280 | self._notify() |
---|
281 | return |
---|
282 | |
---|
283 | class BoundedRangeModel(BoundedValueModel): |
---|
284 | """Model for a bounded range. |
---|
285 | |
---|
286 | minimum <= value <= value + extend <= maximum |
---|
287 | """ |
---|
288 | def __init__(self, minimum=0, initial=0, extend=0, maximum=0): |
---|
289 | self.extend = 0 |
---|
290 | BoundedValueModel.__init__(self, minimum, maximum, initial) |
---|
291 | self.setExtend(extend) |
---|
292 | return |
---|
293 | def setMaximum(self, maximum, silent=0): |
---|
294 | if (maximum != self.maximum): |
---|
295 | self.maximum = maximum |
---|
296 | if self.value > self.maximum: |
---|
297 | self.value = self.maximum |
---|
298 | if ((self.value + self.extend) > self.maximum): |
---|
299 | self.extend = self.maximum - self.value |
---|
300 | if not silent: |
---|
301 | self._notify() |
---|
302 | return |
---|
303 | def setValue(self, value, silent=0): |
---|
304 | if (value != self.value): |
---|
305 | if value < self.minimum: |
---|
306 | self.value = self.minimum |
---|
307 | elif value > self.maximum: |
---|
308 | self.value = self.maximum |
---|
309 | else: |
---|
310 | self.value = value |
---|
311 | if ((self.value + self.extend) > self.maximum): |
---|
312 | # minimum <= value <= maximum |
---|
313 | # ==> maximum - value >= 0 |
---|
314 | self.extend = self.maximum - self.value |
---|
315 | if not silent: |
---|
316 | self._notify() |
---|
317 | return |
---|
318 | def getExtend(self): |
---|
319 | return self.extend |
---|
320 | def setExtend(self, extend, silent=0): |
---|
321 | """ |
---|
322 | @param extend positive integer. |
---|
323 | """ |
---|
324 | if (extend != self.extend): |
---|
325 | if ((self.value + extend) > self.maximum): |
---|
326 | self.extend = self.maximum - self.value |
---|
327 | else: |
---|
328 | self.extend = extend |
---|
329 | if not silent: |
---|
330 | self._notify() |
---|
331 | return |
---|
332 | |
---|
333 | class BasenameModel(ValueModel): |
---|
334 | """Ensure string is a valid file name. |
---|
335 | """ |
---|
336 | def __init__(self, basename): |
---|
337 | ValueModel.__init__(self, self._ensureIsBasename(basename)) |
---|
338 | return |
---|
339 | def setValue(self, basename): |
---|
340 | ValueModel.setValue(self, self._ensureIsBasename(basename)) |
---|
341 | return |
---|
342 | def _ensureIsBasename(self, basename): |
---|
343 | return os.path.basename(basename) |
---|
344 | |
---|
345 | class DirnameModel(ValueModel): |
---|
346 | """Ensure string is a valid directory name. |
---|
347 | """ |
---|
348 | def __init__(self, dirname): |
---|
349 | ValueModel.__init__(self, self._ensureIsDirname(dirname)) |
---|
350 | return |
---|
351 | def setValue(self, dirname): |
---|
352 | ValueModel.setValue(self, self._ensureIsDirname(dirname)) |
---|
353 | return |
---|
354 | def _ensureIsDirname(self, dirname): |
---|
355 | if os.path.isdir(dirname) and os.path.exists(dirname): |
---|
356 | # remove possible trailing seperators |
---|
357 | name = os.path.dirname(dirname + os.sep) |
---|
358 | else: |
---|
359 | name = os.path.dirname(dirname) |
---|
360 | return name |
---|
361 | |
---|
362 | class RedrawView(View): |
---|
363 | def __init__(self, model): |
---|
364 | View.__init__(self, model) |
---|
365 | return |
---|
366 | def update(self): |
---|
367 | Blender.Draw.Redraw(1) |
---|
368 | return |
---|
369 | |
---|
370 | class ActionWidget(Widget): |
---|
371 | """Widget with single action and tooltip. |
---|
372 | """ |
---|
373 | def __init__(self, parent, size=Size(), action=Action(), tooltip=None): |
---|
374 | """Constructor. |
---|
375 | |
---|
376 | @param tooltip Optional widget tooltip string ValueModel. |
---|
377 | """ |
---|
378 | Widget.__init__(self, parent, size) |
---|
379 | self.event = self.parent._addButtonAction(action) |
---|
380 | self.tooltip = tooltip |
---|
381 | if tooltip: |
---|
382 | RedrawView(self.tooltip) |
---|
383 | return |
---|
384 | def removeFromParent(self): |
---|
385 | self.parent._removeButtonAction(self.event) |
---|
386 | Widget.removeFromParent(self) |
---|
387 | return |
---|
388 | |
---|
389 | class ActionTitleWidget(ActionWidget): |
---|
390 | """Widget with single action, title and tooltip. |
---|
391 | """ |
---|
392 | def __init__(self, parent, size=Size(), action=Action(), title=ValueModel(''), tooltip=None): |
---|
393 | """Constructor. |
---|
394 | |
---|
395 | @param title Widget title string ValueModel. |
---|
396 | @param tooltip Optional widget tooltip string ValueModel. |
---|
397 | """ |
---|
398 | ActionWidget.__init__(self, parent, size, action, tooltip) |
---|
399 | self.title = title |
---|
400 | RedrawView(self.title) |
---|
401 | return |
---|
402 | |
---|
403 | class Button(ActionTitleWidget): |
---|
404 | """Push button. |
---|
405 | """ |
---|
406 | def __init__(self, parent, size, action, title, tooltip=None): |
---|
407 | """Constructor. |
---|
408 | |
---|
409 | @param action Action to execute when the button is pushed. |
---|
410 | """ |
---|
411 | ActionTitleWidget.__init__(self, parent, size, action, title, tooltip) |
---|
412 | return |
---|
413 | def draw(self, rect): |
---|
414 | if self.tooltip: |
---|
415 | Blender.Draw.PushButton(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.tooltip.getValue()) |
---|
416 | else: |
---|
417 | Blender.Draw.PushButton(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1) |
---|
418 | return |
---|
419 | |
---|
420 | class ActionView(View): |
---|
421 | """View with single model and action. |
---|
422 | """ |
---|
423 | def __init__(self, model): |
---|
424 | View.__init__(self, model) |
---|
425 | self.valueButton = Blender.Draw.Create(self.model.getValue()) |
---|
426 | return |
---|
427 | def update(self): |
---|
428 | Blender.Draw.Redraw(1) |
---|
429 | return |
---|
430 | class ViewAction(Action): |
---|
431 | def __init__(self, view): |
---|
432 | self.view = view |
---|
433 | return |
---|
434 | def execute(self): |
---|
435 | self.view.model.setValue(self.view.valueButton.val) |
---|
436 | return |
---|
437 | |
---|
438 | class StringView(ActionTitleWidget, ActionView): |
---|
439 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
440 | """Constructor. |
---|
441 | |
---|
442 | @param model String ValueModel. |
---|
443 | """ |
---|
444 | ActionView.__init__(self, model) |
---|
445 | ActionTitleWidget.__init__(self, parent, size, StringView.ViewAction(self), title, tooltip) |
---|
446 | return |
---|
447 | def draw(self, rect): |
---|
448 | if self.tooltip: |
---|
449 | self.valueButton = Blender.Draw.String(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue(), 255, self.tooltip.getValue()) |
---|
450 | else: |
---|
451 | self.valueButton = Blender.Draw.String(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue(), 255) |
---|
452 | return |
---|
453 | |
---|
454 | class ToggleModel(ValueModel): |
---|
455 | """Interface and default implementation for a toggle model. |
---|
456 | |
---|
457 | The toggle value can be <code>True</code> or <code>False</code>. |
---|
458 | """ |
---|
459 | def toggle(self): |
---|
460 | if self.getValue(): |
---|
461 | self.setValue(False) |
---|
462 | else: |
---|
463 | self.setValue(True) |
---|
464 | return |
---|
465 | |
---|
466 | class ToggleGroup(ValueModel): |
---|
467 | """An exclusive toggle group. |
---|
468 | |
---|
469 | Only one toggle is selected at a time. Returns current active |
---|
470 | ToggleModel as value. |
---|
471 | """ |
---|
472 | def __init__(self): |
---|
473 | # key: ToggleModel, value: ToggleGroup.Toggle |
---|
474 | self.toggleDict = {} |
---|
475 | ValueModel.__init__(self, None) |
---|
476 | return |
---|
477 | def addToggle(self, model): |
---|
478 | """Adds a toggle to the toggle group. |
---|
479 | |
---|
480 | @param model ToggleModel. |
---|
481 | """ |
---|
482 | self.toggleDict[model] = ToggleGroup.Toggle(self, model) |
---|
483 | if (len(self.toggleDict) == 1): |
---|
484 | # always one toggle selected |
---|
485 | self.value = model |
---|
486 | model.setValue(True) |
---|
487 | self._notify() |
---|
488 | elif model.getValue(): |
---|
489 | # enable toggle |
---|
490 | self._toggle(model) |
---|
491 | return |
---|
492 | def removeToggle(self, model): |
---|
493 | """Removes a toggle from the toggle group. |
---|
494 | |
---|
495 | If the removed toggle was the current active, |
---|
496 | select the first toggle instead. |
---|
497 | |
---|
498 | @param model ToggleModel. |
---|
499 | """ |
---|
500 | if model in self.toggleDict.keys(): |
---|
501 | # remove toggle from group |
---|
502 | self.toggleDict[model].detachModel() |
---|
503 | del self.toggleDict[model] |
---|
504 | # update current selected |
---|
505 | if (model == self.getValue()): |
---|
506 | if (len(self.toggleDict) > 0): |
---|
507 | self.toggleDict.keys()[0].toggle() |
---|
508 | else: |
---|
509 | self.value = None |
---|
510 | self._notify() |
---|
511 | else: |
---|
512 | raise KeyError |
---|
513 | return |
---|
514 | def setValue(self, value): |
---|
515 | """Sets a toggle to <code>True</code>. |
---|
516 | |
---|
517 | @param value Key of ToggleModel. |
---|
518 | """ |
---|
519 | # set value as current active |
---|
520 | if (value in self.toggleDict.keys()): |
---|
521 | self.value = value |
---|
522 | self._notify() |
---|
523 | elif value is None: |
---|
524 | pass |
---|
525 | else: |
---|
526 | raise KeyError |
---|
527 | return |
---|
528 | def _toggle(self, model): |
---|
529 | # if self.toggleDict.has_key(model): |
---|
530 | if model.getValue(): |
---|
531 | ## selected |
---|
532 | if (self.value != model): |
---|
533 | # deselect old |
---|
534 | oldKey = self.value |
---|
535 | self.setValue(model) |
---|
536 | if self.toggleDict.has_key(oldKey): |
---|
537 | oldKey.setValue(False) |
---|
538 | elif (model == self.value): |
---|
539 | ## current selected deselected |
---|
540 | # select again, as always one toggle is selected |
---|
541 | model.setValue(True) |
---|
542 | return |
---|
543 | class Toggle(View): |
---|
544 | def __init__(self, group, model): |
---|
545 | View.__init__(self, model) |
---|
546 | self.group = group |
---|
547 | return |
---|
548 | def update(self): |
---|
549 | self.group._toggle(self.model) |
---|
550 | return |
---|
551 | |
---|
552 | class ToggleView(ActionTitleWidget, ActionView): |
---|
553 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
554 | """Constructor. |
---|
555 | @param model ToggleModel. |
---|
556 | """ |
---|
557 | View.__init__(self, model) |
---|
558 | ActionTitleWidget.__init__(self, parent, size, ToggleView.ViewAction(self), title, tooltip) |
---|
559 | def draw(self, rect): |
---|
560 | if self.tooltip: |
---|
561 | Blender.Draw.Toggle(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue(), self.tooltip.getValue()) |
---|
562 | else: |
---|
563 | Blender.Draw.Toggle(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue()) |
---|
564 | return |
---|
565 | class ViewAction(Action): |
---|
566 | def __init__(self, view): |
---|
567 | self.view = view |
---|
568 | return |
---|
569 | def execute(self): |
---|
570 | self.view.model.toggle() |
---|
571 | return |
---|
572 | |
---|
573 | class ScrollbarBase(Widget, RedrawView): |
---|
574 | """Scrollbar base class. |
---|
575 | |
---|
576 | This class contains code common to VerticalScrollbar and HorizontalScrollbar. |
---|
577 | Don't use this class directly, use VerticalScrollbar or HorizontalScrollbar instead. |
---|
578 | """ |
---|
579 | def __init__(self, parent, size, model): |
---|
580 | """Constructor. |
---|
581 | |
---|
582 | @param size If l is the desired length of the smaller side, set the larger side to at least 2*l+5. |
---|
583 | @param model BoundedRangeModel |
---|
584 | """ |
---|
585 | Widget.__init__(self, parent, size) |
---|
586 | RedrawView.__init__(self, model) |
---|
587 | # translate MOUSEX and MOUSEY coordinates into local ones |
---|
588 | self.barRect = [0,0,0,0] |
---|
589 | self.markerRect = [0,0,0,0] |
---|
590 | self.mousePressed = 0 |
---|
591 | self.mouseFocusX = 0 |
---|
592 | self.mouseFocusY = 0 |
---|
593 | self.markerFocus = 0 |
---|
594 | self.mousePosition = 0 |
---|
595 | return |
---|
596 | def _inc(self, amount=1): |
---|
597 | """limit maximum value to value + extend <= maximum |
---|
598 | """ |
---|
599 | value = self.model.getValue() |
---|
600 | value += amount |
---|
601 | if ((value + self.model.getExtend()) <= self.model.getMaximum()): |
---|
602 | self.model.setValue(value) |
---|
603 | else: |
---|
604 | # set to maximum value |
---|
605 | self.model.setValue(self.model.getMaximum() - self.model.getExtend()) |
---|
606 | return |
---|
607 | def _dec(self, amount=1): |
---|
608 | value = self.model.getValue() |
---|
609 | value -= amount |
---|
610 | if (self.model.getMinimum() <= value): |
---|
611 | self.model.setValue(value) |
---|
612 | else: |
---|
613 | # set to minimum value |
---|
614 | self.model.setValue(self.model.getMinimum()) |
---|
615 | return |
---|
616 | def _addWidget(self, widget): |
---|
617 | return |
---|
618 | class IncAction(Action): |
---|
619 | def __init__(self, scrollbar): |
---|
620 | self.scrollbar = scrollbar |
---|
621 | return |
---|
622 | def execute(self): |
---|
623 | self.scrollbar._inc() |
---|
624 | return |
---|
625 | class DecAction(Action): |
---|
626 | def __init__(self, scrollbar): |
---|
627 | self.scrollbar = scrollbar |
---|
628 | return |
---|
629 | def execute(self): |
---|
630 | self.scrollbar._dec() |
---|
631 | return |
---|
632 | |
---|
633 | class VerticalScrollbar(ScrollbarBase): |
---|
634 | """Vertical scrollbar. |
---|
635 | """ |
---|
636 | def __init__(self, parent, size, model): |
---|
637 | ScrollbarBase.__init__(self, parent, size, model) |
---|
638 | self.incButton = Button(self, Size(), ScrollbarBase.IncAction(self), ValueModel("\\/"), ValueModel("Scroll down")) |
---|
639 | self.decButton = Button(self, Size(), ScrollbarBase.DecAction(self), ValueModel("/\\"), ValueModel("Scroll up")) |
---|
640 | return |
---|
641 | def draw(self, rect): |
---|
642 | # buttons |
---|
643 | buttonSize = rect[2] - rect[0] |
---|
644 | # \/ |
---|
645 | self.incButton.draw([rect[0], rect[1], rect[2], rect[1] + buttonSize]) |
---|
646 | # /\ |
---|
647 | self.decButton.draw([rect[0], rect[3]-buttonSize, rect[2], rect[3]]) |
---|
648 | # bar |
---|
649 | # marker and bar are > 3x3 pix each as they have 1 pix border |
---|
650 | self.barRect = [rect[0], rect[1] + buttonSize, rect[2], rect[3] - buttonSize] |
---|
651 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
652 | Blender.BGL.glRectf(self.barRect[0], self.barRect[1], self.barRect[2], self.barRect[3]) |
---|
653 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
654 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1], self.barRect[2], self.barRect[3] - 1) |
---|
655 | Blender.BGL.glColor3f(0.48,0.48,0.48) # grey |
---|
656 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1] + 1, self.barRect[2] - 1, self.barRect[3] - 1) |
---|
657 | # marker |
---|
658 | # calculate marker size |
---|
659 | range = self.model.getMaximum() - self.model.getMinimum() |
---|
660 | if range: |
---|
661 | step = float(self.barRect[3] - self.barRect[1] - 2)/range |
---|
662 | # relative positions |
---|
663 | markerStart = step*(self.model.getValue() - self.model.getMinimum()) |
---|
664 | markerEnd = markerStart + step*self.model.getExtend() |
---|
665 | else: |
---|
666 | # relative positions |
---|
667 | markerStart = 0.0 |
---|
668 | markerEnd = self.barRect[3] - self.barRect[1] - 2 |
---|
669 | if ((markerEnd - markerStart) < 3): |
---|
670 | # minimal marker size |
---|
671 | markerEnd = markerStart + 3 |
---|
672 | self.markerRect = [self.barRect[0] + 1, \ |
---|
673 | self.barRect[3] - 1 - markerEnd, \ |
---|
674 | self.barRect[2] - 1, \ |
---|
675 | self.barRect[3] - 1 - markerStart] |
---|
676 | # draw maker |
---|
677 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
678 | Blender.BGL.glRectf(self.markerRect[0], self.markerRect[1], self.markerRect[2], self.markerRect[3]) |
---|
679 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
680 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1], self.markerRect[2], self.markerRect[3] - 1) |
---|
681 | # check if marker has foucs |
---|
682 | if (self.mouseFocusX and self.mouseFocusY and (self.mousePosition > self.markerRect[1]) and (self.mousePosition < self.markerRect[3])): |
---|
683 | Blender.BGL.glColor3f(0.64,0.64,0.64) # marker focus grey |
---|
684 | else: |
---|
685 | Blender.BGL.glColor3f(0.60,0.60,0.60) # marker grey |
---|
686 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1] + 1, self.markerRect[2] - 1, self.markerRect[3] - 1) |
---|
687 | return |
---|
688 | def eventFilter(self, event, value): |
---|
689 | if (value != 0): |
---|
690 | # Mouse |
---|
691 | if (event == Blender.Draw.MOUSEX): |
---|
692 | mousePositionX = value - ScreenManager.getSingleton().getScissorRectangle()[0] |
---|
693 | # check if mouse is inside bar |
---|
694 | if ((mousePositionX >= self.barRect[0]) and (mousePositionX <= self.barRect[2])): |
---|
695 | # redraw if marker got focus |
---|
696 | if (not self.mouseFocusX) and self.mouseFocusY: |
---|
697 | Blender.Draw.Redraw(1) |
---|
698 | self.mouseFocusX = 1 |
---|
699 | else: |
---|
700 | # redraw if marker lost focus |
---|
701 | if self.mouseFocusX and self.mouseFocusY: |
---|
702 | Blender.Draw.Redraw(1) |
---|
703 | self.mouseFocusX = 0 |
---|
704 | elif (event == Blender.Draw.MOUSEY): |
---|
705 | # relative mouse position |
---|
706 | self.mousePosition = value - ScreenManager.getSingleton().getScissorRectangle()[1] |
---|
707 | # check if mouse is inside bar |
---|
708 | if ((self.mousePosition >= self.barRect[1]) and (self.mousePosition <= self.barRect[3])): |
---|
709 | self.mouseFocusY = 1 |
---|
710 | if ((self.mousePosition > self.markerRect[1]) and (self.mousePosition < self.markerRect[3])): |
---|
711 | # redraw if marker got focus |
---|
712 | if self.mouseFocusX and (not self.markerFocus): |
---|
713 | Blender.Draw.Redraw(1) |
---|
714 | self.markerFocus = 1 |
---|
715 | else: |
---|
716 | # redraw if marker lost focus |
---|
717 | if self.mouseFocusX and self.markerFocus: |
---|
718 | Blender.Draw.Redraw(1) |
---|
719 | self.markerFocus = 0 |
---|
720 | # move marker |
---|
721 | if (self.mousePressed == 1): |
---|
722 | # calculate step from distance to marker |
---|
723 | if (self.mousePosition > self.markerRect[3]): |
---|
724 | self._dec(1) |
---|
725 | Blender.Draw.Draw() |
---|
726 | elif (self.mousePosition < self.markerRect[1]): |
---|
727 | self._inc(1) |
---|
728 | Blender.Draw.Draw() |
---|
729 | else: |
---|
730 | # redraw if marker lost focus |
---|
731 | if self.mouseFocusX and self.markerFocus: |
---|
732 | Blender.Draw.Redraw(1) |
---|
733 | self.markerFocus = 0 |
---|
734 | self.mouseFocusY = 0 |
---|
735 | self.mousePressed = 0 |
---|
736 | elif ((event == Blender.Draw.LEFTMOUSE) and (self.mouseFocusX == 1) and (self.mouseFocusY == 1)): |
---|
737 | self.mousePressed = 1 |
---|
738 | # move marker |
---|
739 | if (self.mousePosition > self.markerRect[3]): |
---|
740 | self._dec(1) |
---|
741 | elif (self.mousePosition < self.markerRect[1]): |
---|
742 | self._inc(1) |
---|
743 | elif (event == Blender.Draw.WHEELUPMOUSE): |
---|
744 | if self.mouseFocusX and self.mouseFocusY: |
---|
745 | self._dec(1) |
---|
746 | elif (event == Blender.Draw.WHEELDOWNMOUSE): |
---|
747 | if self.mouseFocusX and self.mouseFocusY: |
---|
748 | self._inc(1) |
---|
749 | else: # released keys and buttons |
---|
750 | if (event == Blender.Draw.LEFTMOUSE): |
---|
751 | self.mousePressed = 0 |
---|
752 | return |
---|
753 | |
---|
754 | class HorizontalScrollbar(ScrollbarBase): |
---|
755 | """Horizontal scrollbar. |
---|
756 | """ |
---|
757 | def __init__(self, parent, size, model): |
---|
758 | ScrollbarBase.__init__(self, parent, size, model) |
---|
759 | self.incButton = Button(self, Size(), ScrollbarBase.IncAction(self), ValueModel(">"), ValueModel("Scroll right")) |
---|
760 | self.decButton = Button(self, Size(), ScrollbarBase.DecAction(self), ValueModel("<"), ValueModel("Scroll left")) |
---|
761 | return |
---|
762 | def draw(self, rect): |
---|
763 | # buttons |
---|
764 | buttonSize = rect[3] - rect[1] |
---|
765 | # < |
---|
766 | self.decButton.draw([rect[0], rect[1], rect[0] + buttonSize, rect[3]]) |
---|
767 | # > |
---|
768 | self.incButton.draw([rect[2] - buttonSize, rect[1], rect[2], rect[3]]) |
---|
769 | # bar |
---|
770 | # marker and bar are > 3x3 pix each as they have 1 pix border |
---|
771 | #TODO: Missed by one |
---|
772 | self.barRect = [rect[0] + buttonSize, rect[1] - 1, rect[2] - buttonSize, rect[3] - 1] |
---|
773 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
774 | Blender.BGL.glRectf(self.barRect[0], self.barRect[1], self.barRect[2], self.barRect[3]) |
---|
775 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
776 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1], self.barRect[2], self.barRect[3] - 1) |
---|
777 | Blender.BGL.glColor3f(0.48,0.48,0.48) # grey |
---|
778 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1] + 1, self.barRect[2] - 1, self.barRect[3] - 1) |
---|
779 | # marker |
---|
780 | # calculate marker size |
---|
781 | range = self.model.getMaximum() - self.model.getMinimum() |
---|
782 | if range: |
---|
783 | step = float(self.barRect[2] - self.barRect[0] - 2)/range |
---|
784 | # relative positions |
---|
785 | markerStart = step*(self.model.getValue() - self.model.getMinimum()) |
---|
786 | markerEnd = markerStart + step*self.model.getExtend() |
---|
787 | else: |
---|
788 | # relative positions |
---|
789 | markerStart = 0.0 |
---|
790 | markerEnd = self.barRect[2] - self.barRect[0] - 2 |
---|
791 | if ((markerEnd - markerStart) < 3): |
---|
792 | # minimal marker size |
---|
793 | markerEnd = markerStart + 3 |
---|
794 | self.markerRect = [self.barRect[0] + 1 + markerStart, \ |
---|
795 | self.barRect[1] + 1, \ |
---|
796 | self.barRect[0] + markerEnd, \ |
---|
797 | self.barRect[3] - 1] |
---|
798 | # draw maker |
---|
799 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
800 | Blender.BGL.glRectf(self.markerRect[0], self.markerRect[1], self.markerRect[2], self.markerRect[3]) |
---|
801 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
802 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1], self.markerRect[2], self.markerRect[3] - 1) |
---|
803 | # check if marker has foucs |
---|
804 | if (self.mouseFocusX and self.mouseFocusY and (self.mousePosition > self.markerRect[0]) and (self.mousePosition < self.markerRect[2])): |
---|
805 | Blender.BGL.glColor3f(0.64,0.64,0.64) # marker focus grey |
---|
806 | else: |
---|
807 | Blender.BGL.glColor3f(0.60,0.60,0.60) # marker grey |
---|
808 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1] + 1, self.markerRect[2] - 1, self.markerRect[3] - 1) |
---|
809 | return |
---|
810 | def eventFilter(self, event, value): |
---|
811 | if (value != 0): |
---|
812 | # Mouse |
---|
813 | if (event == Blender.Draw.MOUSEY): |
---|
814 | mousePositionY = value - ScreenManager.getSingleton().getScissorRectangle()[1] |
---|
815 | # check if mouse is inside bar |
---|
816 | if ((mousePositionY >= self.barRect[1]) and (mousePositionY <= self.barRect[3])): |
---|
817 | # redraw if marker got focus |
---|
818 | if (not self.mouseFocusY) and self.mouseFocusX: |
---|
819 | Blender.Draw.Redraw(1) |
---|
820 | self.mouseFocusY = 1 |
---|
821 | else: |
---|
822 | # redraw if marker lost focus |
---|
823 | if self.mouseFocusX and self.mouseFocusY: |
---|
824 | Blender.Draw.Redraw(1) |
---|
825 | self.mouseFocusY = 0 |
---|
826 | elif (event == Blender.Draw.MOUSEX): |
---|
827 | # relative mouse position |
---|
828 | self.mousePosition = value - ScreenManager.getSingleton().getScissorRectangle()[0] |
---|
829 | # check if mouse is inside bar |
---|
830 | if ((self.mousePosition >= self.barRect[0]) and (self.mousePosition <= self.barRect[2])): |
---|
831 | self.mouseFocusX = 1 |
---|
832 | if ((self.mousePosition > self.markerRect[0]) and (self.mousePosition < self.markerRect[2])): |
---|
833 | # redraw if marker got focus |
---|
834 | if (not self.markerFocus) and self.mouseFocusY: |
---|
835 | Blender.Draw.Redraw(1) |
---|
836 | self.markerFocus = 1 |
---|
837 | else: |
---|
838 | # redraw if marker lost focus |
---|
839 | if self.mouseFocusX and self.markerFocus: |
---|
840 | Blender.Draw.Redraw(1) |
---|
841 | self.markerFocus = 0 |
---|
842 | # move marker |
---|
843 | if (self.mousePressed == 1): |
---|
844 | # calculate step from distance to marker |
---|
845 | if (self.mousePosition > self.markerRect[2]): |
---|
846 | self._inc(1) |
---|
847 | Blender.Draw.Draw() |
---|
848 | elif (self.mousePosition < self.markerRect[0]): |
---|
849 | self._dec(1) |
---|
850 | Blender.Draw.Draw() |
---|
851 | else: |
---|
852 | # redraw if marker lost focus |
---|
853 | if self.mouseFocusX and self.markerFocus: |
---|
854 | Blender.Draw.Redraw(1) |
---|
855 | self.markerFocus = 0 |
---|
856 | self.mouseFocusX = 0 |
---|
857 | self.mousePressed = 0 |
---|
858 | elif ((event == Blender.Draw.LEFTMOUSE) and (self.mouseFocusX == 1) and (self.mouseFocusY == 1)): |
---|
859 | self.mousePressed = 1 |
---|
860 | # move marker |
---|
861 | if (self.mousePosition > self.markerRect[2]): |
---|
862 | self._inc(1) |
---|
863 | elif (self.mousePosition < self.markerRect[0]): |
---|
864 | self._dec(1) |
---|
865 | elif (event == Blender.Draw.WHEELUPMOUSE): |
---|
866 | if self.mouseFocusX and self.mouseFocusY: |
---|
867 | self._dec(1) |
---|
868 | elif (event == Blender.Draw.WHEELDOWNMOUSE): |
---|
869 | if self.mouseFocusX and self.mouseFocusY: |
---|
870 | self._inc(1) |
---|
871 | else: # released keys and buttons |
---|
872 | if (event == Blender.Draw.LEFTMOUSE): |
---|
873 | self.mousePressed = 0 |
---|
874 | return |
---|
875 | |
---|
876 | class NumberView(ActionTitleWidget, ActionView): |
---|
877 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
878 | """Constructor. |
---|
879 | |
---|
880 | @param model BoundedValueModel. |
---|
881 | """ |
---|
882 | ActionView.__init__(self, model) |
---|
883 | ActionTitleWidget.__init__(self, parent, size, StringView.ViewAction(self), title, tooltip) |
---|
884 | return |
---|
885 | def draw(self, rect): |
---|
886 | if self.tooltip: |
---|
887 | self.valueButton = Blender.Draw.Number(self.title.getValue(), self.event, \ |
---|
888 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
889 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum(), self.tooltip.getValue()) |
---|
890 | else: |
---|
891 | self.valueButton = Blender.Draw.Number(self.title.getValue(), self.event, \ |
---|
892 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
893 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum()) |
---|
894 | return |
---|
895 | |
---|
896 | class SliderView(ActionTitleWidget, ActionView): |
---|
897 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
898 | """Constructor. |
---|
899 | |
---|
900 | @param model BoundedValueModel. |
---|
901 | """ |
---|
902 | ActionView.__init__(self, model) |
---|
903 | ActionTitleWidget.__init__(self, parent, size, StringView.ViewAction(self), title, tooltip) |
---|
904 | return |
---|
905 | def draw(self, rect): |
---|
906 | if self.tooltip: |
---|
907 | self.valueButton = Blender.Draw.Slider(self.title.getValue(), self.event, \ |
---|
908 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
909 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum(), 1, self.tooltip.getValue()) |
---|
910 | else: |
---|
911 | self.valueButton = Blender.Draw.Slider(self.title.getValue(), self.event, \ |
---|
912 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
913 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum(), 1) |
---|
914 | return |
---|
915 | |
---|
916 | class MenuItem(ValueModel): |
---|
917 | def __init__(self, text, action=Action()): |
---|
918 | """Constructor. |
---|
919 | |
---|
920 | @param text Item string. |
---|
921 | @param action Action to execute on selection. |
---|
922 | """ |
---|
923 | ValueModel.__init__(self, text) |
---|
924 | self.action = action |
---|
925 | return |
---|
926 | def select(self): |
---|
927 | self.action.execute() |
---|
928 | return |
---|
929 | |
---|
930 | class MenuTitle(MenuItem): |
---|
931 | def __init__(self, text): |
---|
932 | MenuItem.__init__(self, text + " %t") |
---|
933 | return |
---|
934 | def setValue(self, value): |
---|
935 | MenuItem.setValue(self, value + " %t") |
---|
936 | return |
---|
937 | |
---|
938 | class MenuSeparator(MenuItem): |
---|
939 | def __init__(self): |
---|
940 | MenuItem.__init__(self, " %l") |
---|
941 | return |
---|
942 | def setValue(self, value): |
---|
943 | raise NotImplementedError |
---|
944 | return |
---|
945 | |
---|
946 | class Menu(ActionWidget): |
---|
947 | """Blender menu button. |
---|
948 | """ |
---|
949 | def __init__(self, parent, size, tooltip=None): |
---|
950 | """Constructor. |
---|
951 | |
---|
952 | @param title Optional title ValueModel. |
---|
953 | """ |
---|
954 | ActionWidget.__init__(self, parent, size, Menu.SelectAction(self), tooltip) |
---|
955 | # cached menu string |
---|
956 | self.menuString = '' |
---|
957 | # current selected item id |
---|
958 | self.current = 0 |
---|
959 | # id management |
---|
960 | # display order of ids in menu |
---|
961 | # value: id |
---|
962 | self.displayList = [] |
---|
963 | # key: id, value: MenuItem |
---|
964 | self.itemDict = {} |
---|
965 | self.valueButton = Blender.Draw.Create(0) |
---|
966 | return |
---|
967 | def update(self): |
---|
968 | """Update cached menu string. |
---|
969 | """ |
---|
970 | self.menuString = '' |
---|
971 | for itemId in self.displayList: |
---|
972 | self.menuString = self.menuString + self.itemDict[itemId].getValue() + " %x" + str(itemId) + "|" |
---|
973 | return |
---|
974 | def insertItem(self, menuItem, position, setCurrent=False): |
---|
975 | """Inserts a menu item into a specific position of the display list. |
---|
976 | """ |
---|
977 | id = self._getId(menuItem, setCurrent) |
---|
978 | self.displayList.insert(position, id) |
---|
979 | # recreate menu string |
---|
980 | self.update() |
---|
981 | return id |
---|
982 | def appendItem(self, menuItem, setCurrent=False): |
---|
983 | """Appends an item to the menu. |
---|
984 | |
---|
985 | @param menuItem The MenuItem to add. |
---|
986 | @param setCurrent Sets the item to be the current selected. |
---|
987 | @return Item identifier. |
---|
988 | """ |
---|
989 | # get free id |
---|
990 | id = self._getId(menuItem, setCurrent) |
---|
991 | # append id |
---|
992 | self.displayList.append(id) |
---|
993 | # create menu string |
---|
994 | self.menuString = self.menuString + menuItem.getValue() + " %x" + str(id) + "|" |
---|
995 | return id |
---|
996 | def removeItem(self, id): |
---|
997 | if id in self.displayList: |
---|
998 | # remove id |
---|
999 | if self.current == id: |
---|
1000 | self.current = 0 |
---|
1001 | del self.itemDict[id] |
---|
1002 | self.displayList.remove(id) |
---|
1003 | # recreate menu string |
---|
1004 | self.update() |
---|
1005 | return |
---|
1006 | def removeAll(self): |
---|
1007 | """Removes all menu items. |
---|
1008 | """ |
---|
1009 | self.itemDict = {} |
---|
1010 | self.displayList = [] |
---|
1011 | self.current = 0 |
---|
1012 | self.menuString = '' |
---|
1013 | return |
---|
1014 | def draw(self, rect): |
---|
1015 | if self.tooltip: |
---|
1016 | self.valueButton = Blender.Draw.Menu(self.menuString, self.event, \ |
---|
1017 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.current, self.tooltip.getValue()) |
---|
1018 | else: |
---|
1019 | self.valueButton = Blender.Draw.Menu(self.menuString, self.event, \ |
---|
1020 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.current.getValue()) |
---|
1021 | return |
---|
1022 | def _getId(self, menuItem, setCurrent): |
---|
1023 | """Creates an id for the menuItem and optinally set it to current menu string. |
---|
1024 | """ |
---|
1025 | # get a free id (button value) |
---|
1026 | if (len(self.itemDict) == len(self.displayList)): |
---|
1027 | # Blender's button values start with 1 |
---|
1028 | id = len(self.displayList) + 1 |
---|
1029 | else: |
---|
1030 | # first unused |
---|
1031 | id = [(x+1) for x in range(len(self.displayList)) if (x+1) not in self.itemDict.keys()][0] |
---|
1032 | # assign menu item to that id |
---|
1033 | self.itemDict[id] = menuItem |
---|
1034 | # manage current state |
---|
1035 | if setCurrent: |
---|
1036 | self.current = id |
---|
1037 | return id |
---|
1038 | class SelectAction(Action): |
---|
1039 | def __init__(self, menu): |
---|
1040 | self.menu = menu |
---|
1041 | return |
---|
1042 | def execute(self): |
---|
1043 | if self.menu.valueButton.val in self.menu.displayList: |
---|
1044 | self.menu.itemDict[self.menu.valueButton.val].select() |
---|
1045 | self.menu.current = self.menu.valueButton.val |
---|
1046 | return |
---|
1047 | |
---|
1048 | class Border(Decorator): |
---|
1049 | """Fixed border around widgets. |
---|
1050 | """ |
---|
1051 | def __init__(self, parent, borderSize=10): |
---|
1052 | """Constructor. |
---|
1053 | |
---|
1054 | @param borderSize Size of the border. |
---|
1055 | """ |
---|
1056 | Decorator.__init__(self, parent) |
---|
1057 | self.borderSize = borderSize |
---|
1058 | return |
---|
1059 | def draw(self, screenRectangle): |
---|
1060 | rect = screenRectangle[:] |
---|
1061 | rect[0] += self.borderSize |
---|
1062 | rect[1] += self.borderSize |
---|
1063 | rect[2] -= self.borderSize |
---|
1064 | rect[3] -= self.borderSize |
---|
1065 | self.childWidget.draw(rect) |
---|
1066 | return |
---|
1067 | def getSize(self): |
---|
1068 | prefSize = self.childWidget.getSize().getPreferredSize()[:] |
---|
1069 | prefSize[0] += 2*self.borderSize |
---|
1070 | prefSize[1] += 2*self.borderSize |
---|
1071 | minSize = self.childWidget.getSize().getMinimumSize()[:] |
---|
1072 | minSize[0] += 2*self.borderSize |
---|
1073 | minSize[1] += 2*self.borderSize |
---|
1074 | maxSize = self.childWidget.getSize().getMaximumSize()[:] |
---|
1075 | maxSize[0] += 2*self.borderSize |
---|
1076 | maxSize[1] += 2*self.borderSize |
---|
1077 | return Size(prefSize, minSize, maxSize) |
---|
1078 | |
---|
1079 | class LabelModel(Model): |
---|
1080 | def __init__(self, text, fontsize='normal', color=None): |
---|
1081 | """Constructor. |
---|
1082 | |
---|
1083 | @param text Text to display. |
---|
1084 | @param fontsize 'large', 'normal', 'small' or 'tiny' |
---|
1085 | @param color List of font color values. |
---|
1086 | """ |
---|
1087 | Model.__init__(self) |
---|
1088 | self.text = text |
---|
1089 | if fontsize in ['large', 'normal', 'small', 'tiny']: |
---|
1090 | self.fontsize = fontsize |
---|
1091 | else: |
---|
1092 | raise ValueError |
---|
1093 | self.color = color |
---|
1094 | return |
---|
1095 | def setText(self, text): |
---|
1096 | self.text = text |
---|
1097 | self._notify() |
---|
1098 | return |
---|
1099 | def getText(self): |
---|
1100 | return self.text |
---|
1101 | def setFontsize(self, fontsize): |
---|
1102 | if fontsize in ['large', 'normal', 'small', 'tiny']: |
---|
1103 | self.fontsize = fontsize |
---|
1104 | self._notify() |
---|
1105 | else: |
---|
1106 | raise ValueError |
---|
1107 | return |
---|
1108 | def getFontsize(self): |
---|
1109 | return self.fontsize |
---|
1110 | def setColor(self, color): |
---|
1111 | self.color = color |
---|
1112 | self._notify() |
---|
1113 | def getColor(self): |
---|
1114 | return self.color |
---|
1115 | |
---|
1116 | class L(LabelModel): |
---|
1117 | """Short name for LabelModel. |
---|
1118 | |
---|
1119 | @see LabelModel |
---|
1120 | """ |
---|
1121 | |
---|
1122 | class LabelView(Widget, View): |
---|
1123 | """Displays a text string. |
---|
1124 | """ |
---|
1125 | _HEIGHTDICT = {'large':14, 'normal':12, 'small':10, 'tiny':8} |
---|
1126 | _YSHIFT = {'large':5, 'normal':4, 'small':3, 'tiny':2} |
---|
1127 | def __init__(self, parent, model, size=None): |
---|
1128 | View.__init__(self, model) |
---|
1129 | if not size: |
---|
1130 | self.calculateSize = True |
---|
1131 | size = self._calculateSize() |
---|
1132 | else: |
---|
1133 | self.calculateSize = False |
---|
1134 | Widget.__init__(self, parent, size) |
---|
1135 | return |
---|
1136 | def draw(self, screenRectangle): |
---|
1137 | range = len(self.model.getText()) |
---|
1138 | while ((range > 0) and (Blender.Draw.GetStringWidth(self.model.getText()[:range], self.model.getFontsize()) > (screenRectangle[2] - screenRectangle[0]))): |
---|
1139 | range -= 1 |
---|
1140 | if self.model.getColor(): |
---|
1141 | if (len(self.model.getColor()) == 3): |
---|
1142 | glColor3f(*self.model.getColor()) |
---|
1143 | else: |
---|
1144 | glColor4f(*self.model.getColor()) |
---|
1145 | else: |
---|
1146 | # theme font color |
---|
1147 | theme = Blender.Window.Theme.Get()[0] |
---|
1148 | glColor4ub(*theme.get('text').text) |
---|
1149 | glRasterPos2i(screenRectangle[0], screenRectangle[1] + LabelView._YSHIFT[self.model.getFontsize()]) |
---|
1150 | Blender.Draw.Text(self.model.getText()[:range], self.model.getFontsize()) |
---|
1151 | return |
---|
1152 | def update(self): |
---|
1153 | if self.calculateSize: |
---|
1154 | self.size = self._calculateSize() |
---|
1155 | Blender.Draw.Redraw(1) |
---|
1156 | return |
---|
1157 | def _calculateSize(self): |
---|
1158 | size = [0, 0] |
---|
1159 | size[0] = Blender.Draw.GetStringWidth(self.model.getText(), self.model.getFontsize()) |
---|
1160 | size[1] = LabelView._HEIGHTDICT[self.model.getFontsize()] |
---|
1161 | return Size(size, size, size) |
---|
1162 | |
---|
1163 | class Box(Decorator): |
---|
1164 | """Provides a border with an optional title for a child widget. |
---|
1165 | """ |
---|
1166 | def __init__(self, parent, label=None, outerBorder=0, innerBorder=0): |
---|
1167 | """Constructor. |
---|
1168 | |
---|
1169 | @param childWidget Widget to decorate. |
---|
1170 | @param label Optional LabelModel as title. |
---|
1171 | """ |
---|
1172 | # borders |
---|
1173 | self.outerBorder = outerBorder |
---|
1174 | self.innerBorder = innerBorder |
---|
1175 | self.model = label |
---|
1176 | self.view = None |
---|
1177 | if self.model: |
---|
1178 | self.model.addView(self) |
---|
1179 | # use view to caculate size only |
---|
1180 | self.view = LabelView(Box.NoParent(), self.model) |
---|
1181 | Decorator.__init__(self, parent) |
---|
1182 | return |
---|
1183 | def draw(self, screenRectangle): |
---|
1184 | rect = screenRectangle[:] |
---|
1185 | rect[0] += self.outerBorder |
---|
1186 | rect[1] += self.outerBorder |
---|
1187 | rect[2] -= self.outerBorder |
---|
1188 | rect[3] -= self.outerBorder |
---|
1189 | if self.model: |
---|
1190 | # title |
---|
1191 | [labelWidth, labelHeight] = self.view.getSize().getMinimumSize() |
---|
1192 | self.view.draw([rect[0] + 7, rect[3] - labelHeight, rect[0] + 7 + labelWidth, rect[3]]) |
---|
1193 | # border |
---|
1194 | glColor3f(0.0, 0.0, 0.0) |
---|
1195 | glBegin(GL_LINE_STRIP) |
---|
1196 | # 5--6 TITLE 1--2 |
---|
1197 | # | | |
---|
1198 | # 4----------------3 |
---|
1199 | glVertex2i(rect[0] + 9 + labelWidth, rect[3] - int(labelHeight/2.0)) |
---|
1200 | glVertex2i(rect[2], rect[3] - int(labelHeight/2.0)) |
---|
1201 | glVertex2i(rect[2], rect[1]) |
---|
1202 | glVertex2i(rect[0], rect[1]) |
---|
1203 | glVertex2i(rect[0], rect[3] - int(labelHeight/2.0)) |
---|
1204 | glVertex2i(rect[0] + 3, rect[3] - int(labelHeight/2.0)) |
---|
1205 | glEnd() |
---|
1206 | rect[0] += 1 |
---|
1207 | rect[1] += 1 |
---|
1208 | rect[2] -= 1 |
---|
1209 | rect[3] -= labelHeight |
---|
1210 | else: |
---|
1211 | # border only |
---|
1212 | glColor3f(0.0, 0.0, 0.0) |
---|
1213 | glBegin(GL_LINE_STRIP) |
---|
1214 | glVertex2i(rect[0], rect[1]) |
---|
1215 | glVertex2i(rect[0], rect[3]) |
---|
1216 | glVertex2i(rect[2], rect[3]) |
---|
1217 | glVertex2i(rect[2], rect[1]) |
---|
1218 | glVertex2i(rect[0], rect[1]) |
---|
1219 | glEnd() |
---|
1220 | rect[0] += 1 |
---|
1221 | rect[1] += 1 |
---|
1222 | rect[2] -= 1 |
---|
1223 | rect[3] -= 1 |
---|
1224 | rect[0] += self.innerBorder |
---|
1225 | rect[1] += self.innerBorder |
---|
1226 | rect[2] -= self.innerBorder |
---|
1227 | rect[3] -= self.innerBorder |
---|
1228 | self.childWidget.draw(rect) |
---|
1229 | return |
---|
1230 | def getSize(self): |
---|
1231 | if self.childWidget: |
---|
1232 | minSize = self.childWidget.getSize().getMinimumSize()[:] |
---|
1233 | prefSize = self.childWidget.getSize().getPreferredSize()[:] |
---|
1234 | maxSize = self.childWidget.getSize().getMaximumSize()[:] |
---|
1235 | else: |
---|
1236 | minSize = [0, 0] |
---|
1237 | prefSize = [0, 0] |
---|
1238 | maxSize = [0, 0] |
---|
1239 | # border |
---|
1240 | minSize[0] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
1241 | minSize[1] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
1242 | prefSize[0] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
1243 | prefSize[1] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
1244 | maxSize[0] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
1245 | maxSize[1] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
1246 | if self.model: |
---|
1247 | titleSize = self.view.getSize() |
---|
1248 | # 1+3 +3 +x +3+1 = 11+x |
---|
1249 | # +---___TITLE___+ y |
---|
1250 | # | | + |
---|
1251 | # +--------------+ 1 |
---|
1252 | if (minSize[0] < (titleSize.getMinimumSize()[0] + 9)): |
---|
1253 | minSize[0] += 9 + titleSize.getMinimumSize()[0] |
---|
1254 | prefSize[0] += 9 + titleSize.getPreferredSize()[0] |
---|
1255 | maxSize[0] += 9 + titleSize.getMaximumSize()[0] |
---|
1256 | minSize[1] += titleSize.getMinimumSize()[1] - 1 |
---|
1257 | prefSize[1] += titleSize.getPreferredSize()[1] - 1 |
---|
1258 | maxSize[1] += titleSize.getMaximumSize()[1] - 1 |
---|
1259 | return Size(prefSize, minSize, maxSize) |
---|
1260 | class NoParent(Widget): |
---|
1261 | """Widget acts as dummy parent. |
---|
1262 | """ |
---|
1263 | def __init__(self): |
---|
1264 | return |
---|
1265 | def resize(self, size=None): |
---|
1266 | return |
---|
1267 | def _addWidget(self, widget): |
---|
1268 | return |
---|
1269 | def _removeWidget(self, widget): |
---|
1270 | return |
---|
1271 | |
---|
1272 | class OgreFrame(Decorator): |
---|
1273 | """Ogre Logo, Title and border. |
---|
1274 | """ |
---|
1275 | OGRE_LOGO = Buffer(GL_BYTE, [48,122*4],[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1276 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,1,0,127,0,2,0,127,2,5,2,127,2,5,2,127,4,6,4,127,5,8,5,127,8,11,8,127,8,11,8,127,3,5,3,127,2,3,2,127,0,1,0,127,0,1,0,127,0,1,0,127,0,1,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1277 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,1,2,1,127,4,6,4,127,10,13,10,127,18,22,18,127,23,28,23,127,24,30,24,127,25,31,25,127,25,31,25,127,26,32,26,127,26,32,26,127,26,32,26,127,25,31,25,127,24,30,24,127,18,23,18,127,3,5,3,127,4,6,4,127,8,11,8,127,9,12,9,127,13,17,13,127,17,22,17,127,15,19,15,127,7,9,7,127,1,2,1,127,0,0,0,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1278 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,2,4,2,127,4,6,4,127,18,22,18,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,18,22,18,127,15,19,15,127,20,26,20,127,25,31,25,127,26,32,26,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,26,32,26,127,24,30,24,127,16,20,16,127,4,5,4,127,0,0,0,95,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1279 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,1,1,1,127,13,15,13,127,12,15,12,127,24,29,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,5,3,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1280 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,1,1,1,127,19,24,19,127,11,15,11,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,17,21,17,127,22,28,22,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,5,3,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1281 | [0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,20,24,20,127,16,20,16,127,20,25,20,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,5,3,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1282 | [0,0,0,0,0,0,0,0,0,0,0,64,5,7,5,127,26,32,26,127,15,19,15,127,41,48,41,127,38,45,38,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,4,3,127,0,0,0,127,58,66,58,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1283 | [0,0,0,0,0,0,0,0,0,0,0,127,20,24,20,127,27,34,27,127,26,32,26,127,47,55,47,127,47,55,47,127,39,46,39,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,11,16,11,127,0,1,0,127,3,3,3,127,94,106,94,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1284 | [0,0,0,0,0,0,0,0,0,0,0,127,33,39,33,127,45,52,45,127,28,32,28,127,47,55,47,127,44,51,44,127,39,46,39,127,27,33,27,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,21,26,21,127,0,2,0,127,0,0,0,127,23,26,23,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1285 | [0,0,0,0,0,0,0,0,0,0,0,127,24,28,24,127,33,40,33,127,18,22,18,127,29,35,29,127,25,31,25,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,5,8,5,127,1,2,1,127,0,0,0,127,70,79,70,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,94,105,94,127,70,79,70,127,76,86,76,127,90,101,90,127,103,116,103,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1286 | [0,0,0,0,0,0,0,64,0,0,0,127,4,6,4,127,12,16,12,127,22,27,22,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,28,34,28,127,35,42,35,127,28,35,28,127,25,31,25,127,23,29,23,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,17,21,17,127,0,2,0,127,0,0,0,127,31,36,31,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,100,112,100,127,92,103,92,127,103,116,103,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,100,112,100,127,81,92,81,127,68,77,68,127,65,73,65,127,65,73,65,127,76,86,76,127,78,88,78,127,83,94,83,127,92,103,92,127,85,95,85,127,31,35,31,127,6,7,6,127,6,7,6,127,13,14,13,127,13,14,13,127,19,21,19,127,26,29,26,127,26,29,26,127,48,54,48,127,96,108,96,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,70,78,70,127,3,3,3,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,12,13,11,127,23,26,23,127,36,40,36,127,49,55,49,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1287 | [0,0,0,64,0,0,0,127,2,4,2,127,16,20,16,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,26,33,26,127,59,68,59,127,81,91,81,127,87,98,87,127,86,96,86,127,80,90,80,127,71,79,71,127,59,66,59,127,36,41,35,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,31,24,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,5,8,5,127,0,1,0,127,18,20,18,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,91,103,91,127,58,65,58,127,29,33,29,127,6,7,6,127,0,0,0,127,0,0,0,127,1,2,1,127,22,24,22,127,54,61,54,127,94,106,94,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,88,99,88,127,51,58,51,127,18,21,18,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,17,19,17,127,48,54,48,127,80,91,80,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,29,33,29,127,0,0,0,127,41,31,14,127,33,25,11,127,18,14,6,127,2,2,1,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1288 | [0,0,0,127,2,3,2,127,24,29,24,127,26,32,26,127,24,30,24,127,25,31,25,127,24,30,24,127,24,30,24,127,24,30,24,127,23,29,23,127,34,41,34,127,78,88,78,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,87,97,87,127,84,93,84,127,62,69,62,127,34,40,34,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,26,30,26,127,36,38,36,127,47,50,46,127,39,42,37,127,34,40,34,127,30,37,30,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,15,19,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,94,106,94,127,43,48,43,127,4,5,4,127,0,0,0,127,0,0,0,127,0,0,0,127,6,5,2,127,16,12,5,127,2,2,1,127,0,0,0,127,0,0,0,127,7,8,7,127,58,65,58,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,96,108,96,127,41,47,41,127,1,1,1,127,0,0,0,127,0,0,0,127,6,5,2,127,27,21,9,127,42,33,14,127,46,36,16,127,46,36,16,127,33,25,11,127,31,24,11,127,25,19,9,127,16,12,5,127,12,9,4,127,0,0,0,127,107,82,36,127,115,88,38,127,107,82,36,127,107,82,36,127,100,76,33,127,92,71,31,127,88,68,30,127,0,0,0,127,4,3,2,127,0,0,0,127,0,0,0,127,0,0,0,127,13,15,13,127,65,73,65,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,13,14,13,127,0,0,0,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,109,84,36,127,96,73,32,127,80,62,27,127,65,50,22,127,52,40,17,127,37,28,12,127,21,16,7,127,2,2,1,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1289 | [0,0,0,127,9,11,9,127,48,56,48,127,45,53,45,127,41,48,41,127,33,40,33,127,34,41,34,127,37,44,37,127,54,62,54,127,77,87,77,127,87,97,87,127,87,97,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,79,88,79,127,61,69,61,127,25,31,25,127,25,31,25,127,23,28,23,127,19,23,19,127,42,43,41,127,60,60,59,127,61,61,59,127,61,61,59,127,63,63,61,127,35,37,34,127,38,45,38,127,33,39,33,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,15,19,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,81,91,81,127,9,11,9,127,0,0,0,127,2,2,1,127,44,34,15,127,86,66,29,127,115,88,38,127,122,94,41,127,122,94,41,127,121,92,40,127,94,72,31,127,39,30,13,127,0,0,0,127,0,0,0,127,40,45,40,127,101,114,101,127,105,118,105,127,105,118,105,127,105,118,105,127,85,95,85,127,11,13,11,127,0,0,0,127,4,3,2,127,50,38,17,127,94,72,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,92,71,31,127,0,0,0,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,2,2,1,127,105,81,35,127,98,75,33,127,60,46,20,127,23,18,8,127,0,0,0,127,1,1,1,127,90,102,90,127,105,118,105,127,105,118,105,127,105,118,105,127,6,7,6,127,0,0,0,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,8,6,3,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1290 | [0,0,0,127,3,5,3,127,45,53,45,127,46,54,46,127,46,54,46,127,47,55,47,127,46,54,46,127,68,78,68,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,98,87,127,67,76,67,127,38,46,38,127,21,26,21,127,50,52,50,127,60,60,59,127,61,61,59,127,60,60,58,127,60,60,58,127,60,60,58,127,61,61,59,127,39,41,38,127,52,59,52,127,67,76,67,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,15,19,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,59,67,59,127,1,1,1,127,0,0,0,127,35,27,12,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,86,66,29,127,8,6,3,127,0,0,0,127,36,40,36,127,105,118,105,127,105,118,105,127,82,92,82,127,7,7,7,127,0,0,0,127,31,24,10,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,80,62,27,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,82,63,28,127,46,36,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,27,21,9,127,0,0,0,127,78,88,78,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1291 | [0,0,0,127,0,2,0,127,41,49,41,127,46,54,46,127,46,54,46,127,49,56,49,127,77,87,77,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,85,96,85,127,55,64,55,127,44,52,44,127,23,28,23,127,17,22,17,127,90,92,90,127,84,84,82,127,60,60,58,127,60,60,58,127,60,60,58,127,60,60,58,127,61,61,59,127,39,41,38,127,54,62,54,127,62,71,62,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,15,20,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,81,90,81,127,1,1,1,127,0,0,0,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,103,79,34,127,12,9,4,127,0,0,0,127,47,52,47,127,93,104,93,127,8,9,8,127,0,0,0,127,52,40,17,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,63,49,21,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,0,0,0,127,9,11,9,127,101,113,101,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,69,53,23,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1292 | [0,0,0,127,0,1,0,127,37,44,37,127,46,54,46,127,49,57,49,127,79,89,79,127,87,97,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,56,64,56,127,46,53,46,127,25,31,25,127,22,27,22,127,25,31,25,127,44,47,44,127,116,116,115,127,59,59,57,127,60,60,58,127,60,60,58,127,60,60,58,127,61,61,59,127,38,41,37,127,69,78,69,127,45,53,45,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,15,20,15,127,0,0,0,127,5,6,5,127,104,117,104,127,105,118,105,127,105,118,105,127,105,118,105,127,93,104,93,127,8,9,8,127,0,0,0,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,96,73,32,127,2,2,1,127,0,0,0,127,24,28,24,127,0,0,0,127,37,28,12,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,10,8,3,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,88,68,30,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,39,30,13,127,0,0,0,127,43,49,43,127,105,118,105,127,105,118,105,127,105,118,105,127,93,105,93,127,0,0,0,127,14,11,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,39,30,13,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1293 | [0,0,0,64,0,1,0,127,21,25,21,127,48,57,49,127,82,92,82,127,87,97,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,87,98,87,127,60,69,60,127,43,50,43,127,29,36,29,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,116,116,116,127,71,71,70,127,60,60,58,127,60,60,58,127,60,60,58,127,62,62,60,127,30,32,29,127,75,85,75,127,29,36,29,127,25,31,25,127,24,30,24,127,24,30,24,127,23,28,23,127,10,14,10,127,0,0,0,127,40,45,40,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,33,38,33,127,0,0,0,127,39,30,13,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,67,52,23,127,0,0,0,127,0,0,0,127,10,8,3,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,107,82,36,127,84,65,28,127,71,54,24,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,67,51,22,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,105,81,35,127,2,2,1,127,0,0,0,127,0,0,0,127,18,21,18,127,61,69,61,127,102,115,102,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,60,46,20,127,52,40,17,127,69,53,23,127,86,66,29,127,10,8,3,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1294 | [0,0,0,0,0,0,0,127,2,5,2,127,49,57,49,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,98,87,127,86,97,86,127,75,84,75,127,53,61,53,127,34,41,34,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,96,97,96,127,93,93,92,127,59,59,58,127,60,60,58,127,60,60,58,127,61,61,59,127,34,39,34,127,74,84,74,127,23,29,23,127,25,31,25,127,37,39,34,127,47,47,41,127,44,45,39,127,17,18,16,127,0,0,0,127,52,59,52,127,105,118,105,127,105,118,105,127,105,118,105,127,81,92,81,127,0,0,0,127,8,6,3,127,111,85,37,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,50,38,17,127,16,12,5,127,33,25,11,127,103,79,34,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,23,18,8,127,0,0,0,127,69,53,23,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,27,21,9,127,0,0,0,127,0,0,0,127,0,0,0,127,92,71,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,61,47,21,127,18,14,6,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,117,90,39,127,88,68,29,127,54,41,18,127,14,11,5,127,0,0,0,127,0,0,0,127,17,18,17,127,68,76,68,127,0,0,0,127,21,16,7,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,31,24,11,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1295 | [0,0,0,0,0,0,0,95,0,0,0,127,37,43,37,127,89,100,89,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,88,99,88,127,82,92,82,127,61,69,61,127,36,42,36,127,27,32,27,127,23,29,23,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,78,80,76,127,102,102,102,127,58,58,57,127,60,60,58,127,60,60,58,127,58,58,56,127,40,47,40,127,56,64,56,127,24,29,23,127,44,45,40,127,49,49,43,127,49,49,43,127,46,46,41,127,41,42,37,127,0,0,0,127,38,43,38,127,105,118,105,127,105,118,105,127,105,118,105,127,33,37,33,127,0,0,0,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,0,0,0,127,0,0,0,127,0,0,0,127,12,9,4,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,84,65,28,127,4,3,2,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,42,33,14,127,0,0,0,127,119,91,40,127,102,78,34,127,75,57,25,127,52,40,17,127,88,68,29,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,61,47,21,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,84,65,28,127,19,15,7,127,0,0,0,127,4,5,4,127,0,0,0,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,111,85,37,127,115,88,38,127,122,94,41,127,122,94,41,127,48,37,16,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1296 | [0,0,0,0,0,0,0,32,0,0,0,127,6,7,5,127,67,75,67,127,89,100,89,127,87,97,87,127,87,97,87,127,87,98,87,127,88,99,88,127,88,98,88,127,80,90,80,127,62,71,62,127,45,52,45,127,39,46,39,127,57,65,57,127,65,74,65,127,59,67,59,127,54,61,54,127,55,61,55,127,28,34,28,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,64,67,64,127,109,109,108,127,58,58,57,127,60,60,58,127,61,60,59,127,50,50,47,127,47,55,47,127,33,39,33,127,44,44,39,127,48,48,42,127,48,48,42,127,28,30,25,127,36,37,31,127,48,48,42,127,1,2,1,127,36,41,36,127,105,118,105,127,105,118,105,127,99,111,99,127,4,5,4,127,2,2,1,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,65,50,22,127,0,0,0,127,30,34,30,127,27,30,27,127,0,0,0,127,67,51,22,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,58,44,19,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,71,54,24,127,0,0,0,127,18,14,6,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,54,41,18,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,56,43,19,127,0,0,0,127,0,0,0,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,37,28,12,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1297 | [0,0,0,0,0,0,0,0,0,0,0,95,0,0,0,127,2,3,2,127,28,32,28,127,58,65,58,127,56,64,56,127,50,57,50,127,46,54,46,127,42,49,42,127,43,50,43,127,62,71,62,127,80,90,80,127,87,98,87,127,87,98,87,127,87,97,87,127,87,98,87,127,86,97,87,127,78,85,78,127,46,52,46,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,64,67,64,127,104,104,104,127,58,58,57,127,60,60,58,127,62,61,60,127,34,38,33,127,37,43,37,127,50,51,44,127,48,48,42,127,48,48,42,127,23,27,22,127,32,36,30,127,95,95,82,127,43,45,39,127,0,0,0,127,45,51,45,127,105,118,105,127,105,118,105,127,71,80,71,127,0,0,0,127,35,27,12,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,103,79,35,127,2,2,1,127,0,0,0,127,11,13,11,127,0,0,0,127,65,50,22,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,23,18,8,127,0,0,0,127,35,27,12,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,46,36,16,127,41,31,14,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,37,28,12,127,50,38,17,127,73,56,24,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,69,53,23,127,0,0,0,127,44,34,15,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,27,21,9,127,0,0,0,127,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,0,0,0,0,0], |
---|
1298 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,8,10,8,127,51,59,51,127,84,95,84,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,87,127,63,71,63,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,76,78,75,127,100,100,99,127,58,58,57,127,61,60,59,127,53,54,51,127,24,30,24,127,29,33,28,127,77,76,63,127,47,48,42,127,29,32,27,127,24,30,24,127,30,35,29,127,90,91,84,127,28,29,25,127,0,0,0,127,77,86,76,127,105,118,105,127,105,118,105,127,44,50,44,127,0,0,0,127,69,53,23,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,81,62,27,127,4,3,2,127,0,0,0,127,12,9,4,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,4,3,2,127,0,0,0,127,54,41,18,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,46,36,16,127,46,36,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,48,37,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,42,33,14,127,46,36,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,16,12,5,127,0,0,0,127,0,0,0,127,4,3,2,127,6,5,2,127,0,0,0,95,0,0,0,0], |
---|
1299 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,95,1,1,1,127,60,68,60,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,73,82,73,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,89,92,89,127,87,87,86,127,59,59,58,127,60,59,58,127,31,35,31,127,25,31,25,127,43,45,38,127,74,74,62,127,43,43,38,127,22,28,22,127,25,31,25,127,24,30,24,127,26,32,26,127,13,14,12,127,0,0,0,127,100,113,100,127,105,118,105,127,105,118,105,127,21,24,21,127,0,0,0,127,98,75,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,113,87,38,127,92,71,31,127,117,90,39,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,19,15,7,127,0,0,0,127,71,54,24,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,39,30,13,127,50,38,17,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,82,63,28,127,0,0,0,127,23,26,23,127,38,42,38,127,5,7,5,127,0,0,0,127,96,73,32,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,111,85,37,127,54,41,18,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,82,63,28,127,16,12,5,127,16,12,5,127,16,12,5,127,12,9,4,127,46,35,16,127,82,63,28,127,117,90,39,127,46,36,16,127,0,0,0,127,0,0,0,0], |
---|
1300 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,33,38,33,127,89,99,89,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,84,94,84,127,28,35,28,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,100,101,100,127,73,73,71,127,61,60,59,127,35,38,35,127,24,30,24,127,24,30,24,127,48,51,41,127,69,69,57,127,36,37,32,127,24,30,24,127,28,34,28,127,25,31,25,127,25,31,25,127,17,21,17,127,0,0,0,127,80,90,80,127,105,118,105,127,105,118,105,127,6,7,6,127,0,0,0,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,56,43,19,127,0,0,0,127,88,68,29,127,117,90,39,127,107,82,36,127,92,71,31,127,80,62,27,127,69,53,23,127,60,46,20,127,46,36,16,127,33,25,11,127,23,18,8,127,4,3,2,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,65,50,22,127,0,0,0,127,20,22,20,127,26,30,26,127,0,0,0,127,2,2,1,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,21,16,7,127,60,46,20,127,94,72,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,54,41,18,127,0,0,0,127,0,0,0,0], |
---|
1301 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,6,7,6,127,81,91,81,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,88,98,88,127,60,68,60,127,27,33,27,127,24,30,24,127,25,31,25,127,22,28,22,127,91,91,91,127,57,58,56,127,31,36,31,127,24,30,24,127,25,31,25,127,25,31,25,127,27,31,26,127,70,71,58,127,41,42,36,127,37,43,37,127,66,74,66,127,23,29,23,127,25,31,25,127,19,22,19,127,0,0,0,127,75,84,75,127,105,118,105,127,102,114,102,127,0,0,0,127,4,3,2,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,117,90,39,127,31,24,10,127,2,2,1,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,4,3,2,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,46,36,16,127,0,0,0,127,0,0,0,127,0,0,0,127,8,6,3,127,73,56,24,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,61,47,21,127,0,0,0,127,0,0,0,0], |
---|
1302 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,45,52,45,127,87,98,88,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,82,92,82,127,46,54,46,127,34,41,34,127,25,31,25,127,25,31,25,127,26,30,26,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,33,37,31,127,48,48,42,127,43,43,38,127,66,74,65,127,23,29,23,127,25,31,25,127,20,25,20,127,0,0,0,127,70,78,70,127,105,118,105,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,86,66,29,127,48,37,16,127,31,24,11,127,16,12,5,127,23,18,8,127,33,25,11,127,52,40,17,127,71,54,24,127,96,73,32,127,117,90,39,127,63,49,21,127,73,56,24,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,88,68,29,127,77,59,26,127,77,59,26,127,90,69,30,127,117,90,39,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,73,56,24,127,0,0,0,127,0,0,0,32], |
---|
1303 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,25,28,25,127,88,99,88,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,98,87,127,70,79,70,127,46,54,46,127,47,55,47,127,45,52,45,127,30,37,30,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,44,52,44,127,72,81,72,127,70,79,70,127,23,29,23,127,25,31,25,127,21,25,21,127,0,0,0,127,66,73,65,127,105,118,105,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,80,62,27,127,77,59,26,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,0,0,0,127,0,0,0,64], |
---|
1304 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,1,0,127,64,72,64,127,87,97,87,127,86,97,86,127,86,97,86,127,87,97,87,127,86,97,86,127,86,96,86,127,85,95,85,127,71,80,71,127,47,55,47,127,46,54,46,127,46,54,46,127,46,54,46,127,47,55,47,127,31,38,31,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,59,67,59,127,77,87,77,127,58,66,58,127,25,31,25,127,25,31,25,127,22,27,22,127,0,0,0,127,48,54,48,127,105,118,105,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,80,62,27,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,92,71,31,127,0,0,0,127,0,0,0,64], |
---|
1305 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,127,14,16,14,127,88,99,88,127,88,98,88,127,88,98,88,127,72,82,72,127,51,59,51,127,52,61,52,127,55,63,55,127,47,55,47,127,45,53,45,127,45,53,45,127,46,54,46,127,46,54,46,127,46,54,46,127,45,53,45,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,37,44,37,127,76,86,76,127,73,82,73,127,32,39,32,127,23,29,23,127,2,2,2,127,30,34,30,95,105,118,105,64,98,111,98,64,0,0,0,95,4,3,2,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,115,88,38,127,92,71,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,0,0,0,127,0,0,0,64], |
---|
1306 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,21,24,21,127,55,62,55,127,51,57,50,127,64,72,64,127,86,96,86,127,85,95,85,127,84,94,84,127,86,96,86,127,84,95,84,127,82,92,82,127,75,85,75,127,52,60,52,127,46,54,46,127,46,54,46,127,45,53,45,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,29,36,29,127,28,34,28,127,24,30,24,127,62,71,62,127,88,99,88,127,66,75,66,127,24,30,24,127,8,11,8,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,100,76,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,107,82,36,127,0,0,0,127,0,0,0,64], |
---|
1307 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,31,36,31,127,35,40,35,127,33,36,32,127,31,34,31,127,47,55,47,127,51,59,51,127,47,55,47,127,39,46,39,127,29,36,29,127,37,43,37,127,52,60,52,127,77,87,77,127,49,58,49,127,46,54,46,127,40,48,40,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,29,35,29,127,80,90,80,127,59,67,59,127,24,30,24,127,24,30,24,127,76,86,76,127,87,98,87,127,39,46,39,127,17,22,17,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,75,57,25,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,79,60,26,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,71,55,24,127,103,79,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,117,90,39,127,0,0,0,127,0,0,0,64], |
---|
1308 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,41,48,41,127,69,79,69,127,39,45,39,127,47,54,47,127,77,87,77,127,86,97,86,127,88,97,87,127,87,97,86,127,82,93,83,127,57,65,57,127,25,31,25,127,24,30,24,127,26,32,26,127,26,32,26,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,75,85,75,127,87,98,87,127,67,75,67,127,23,29,23,127,23,29,23,127,56,64,56,127,85,95,85,127,75,84,75,127,24,30,24,127,3,3,3,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,127,29,22,10,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,8,6,3,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,6,5,2,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,0,0,0,127,0,0,0,64], |
---|
1309 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,12,15,12,127,45,53,46,127,48,56,48,127,65,72,63,127,98,81,79,127,123,119,119,127,117,108,108,127,94,79,76,127,88,88,80,127,64,73,64,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,35,41,35,127,86,96,86,127,87,98,87,127,61,69,61,127,23,29,23,127,24,30,24,127,46,53,46,127,84,94,84,127,87,98,87,127,55,63,55,127,10,12,10,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,92,71,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,75,57,25,127,0,0,0,127,52,40,17,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,12,9,4,127,0,0,0,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,14,11,5,127,0,0,0,95], |
---|
1310 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,22,26,22,127,30,37,30,127,23,29,23,127,41,40,35,127,91,73,72,127,113,103,103,127,100,75,75,127,87,58,58,127,83,72,66,127,54,63,55,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,30,25,127,34,41,34,127,69,78,69,127,81,91,81,127,34,41,34,127,25,31,25,127,23,29,23,127,61,69,61,127,82,92,82,127,75,85,75,127,82,92,82,127,24,29,24,127,1,1,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,127,23,18,8,127,119,91,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,17,14,6,127,0,0,0,127,2,2,1,127,96,73,32,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,75,58,25,127,6,5,2,127,0,0,0,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,18,14,6,127,0,0,0,127], |
---|
1311 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,24,29,24,127,48,56,48,127,28,34,28,127,24,30,24,127,25,31,25,127,36,37,32,127,68,55,52,127,82,63,62,127,80,52,52,127,81,82,74,127,28,34,28,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,23,29,23,127,25,31,25,127,24,30,24,127,25,31,25,127,24,29,24,127,56,64,56,127,87,97,87,127,70,79,70,127,88,99,88,127,49,57,49,127,10,12,10,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,44,34,15,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,67,52,23,127,0,0,0,127,0,0,0,95,0,0,0,127,12,9,4,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,33,25,11,127,0,0,0,127,0,0,0,127,0,0,0,95,0,0,0,127,107,82,36,127,117,90,39,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,31,24,11,127,0,0,0,127], |
---|
1312 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,14,16,14,127,81,91,81,127,72,81,72,127,43,51,43,127,23,29,23,127,24,30,24,127,23,30,24,127,23,30,23,127,25,31,25,127,26,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,26,32,26,127,32,39,32,127,30,37,30,127,24,30,24,127,25,31,25,127,25,31,25,127,25,32,25,127,83,93,83,127,77,86,77,127,87,97,87,127,80,90,80,127,22,27,22,127,1,1,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,46,35,15,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,96,73,32,127,4,3,2,127,0,0,0,95,0,0,0,0,0,0,0,32,0,0,0,127,12,9,4,127,98,75,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,96,73,32,127,40,31,14,127,2,2,1,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,32,0,0,0,127,0,0,0,127,0,0,0,127,2,2,1,127,16,12,5,127,25,19,9,127,33,25,11,127,46,36,16,127,56,43,19,127,61,47,21,127,77,59,26,127,84,65,28,127,92,71,31,127,107,82,36,127,115,88,38,127,122,94,41,127,122,94,41,127,39,30,13,127,0,0,0,127], |
---|
1313 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,18,21,18,127,83,93,83,127,89,100,89,127,71,81,71,127,54,61,54,127,37,44,37,127,24,30,24,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,42,50,42,127,70,79,70,127,87,98,87,127,74,83,74,127,28,35,28,127,25,31,25,127,24,30,24,127,42,49,42,127,76,86,76,127,86,97,86,127,88,99,88,127,41,49,41,127,11,14,11,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,27,21,9,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,12,9,4,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,2,2,1,127,58,44,19,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,105,81,35,127,63,49,21,127,21,16,7,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,16,12,5,127,6,5,2,127,0,0,0,95], |
---|
1314 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,13,17,13,127,61,70,61,127,85,96,85,127,89,100,89,127,88,98,88,127,77,87,77,127,60,67,60,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,12,16,12,127,12,15,12,127,40,46,40,127,80,90,80,127,80,89,80,127,34,40,34,127,24,30,24,127,23,29,23,127,51,59,51,127,88,99,88,127,86,97,86,127,76,85,76,127,22,27,22,127,1,2,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,4,3,2,127,59,46,20,127,111,85,37,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,65,50,22,127,4,3,2,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,0,0,0,127,4,3,2,127,44,34,15,127,80,62,27,127,111,85,37,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,100,76,33,127,75,57,25,127,48,37,16,127,18,13,6,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,127,0,0,0,64,0,0,0,0], |
---|
1315 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,19,23,19,127,46,53,46,127,64,72,64,127,80,90,80,127,85,96,85,127,74,84,74,127,28,34,28,127,25,31,25,127,25,31,25,127,25,30,25,127,25,31,25,127,25,31,25,127,25,31,25,127,17,21,17,127,1,3,1,127,0,1,0,127,0,0,0,127,9,11,9,127,51,59,52,127,82,93,83,127,45,52,45,127,23,29,23,127,24,30,24,127,59,67,59,127,88,99,88,127,85,96,85,127,30,37,30,127,12,15,12,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,4,3,2,127,42,33,14,127,82,63,28,127,107,82,36,127,103,79,35,127,84,65,28,127,54,41,18,127,12,9,4,127,0,0,0,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,10,8,3,127,25,19,9,127,31,24,11,127,31,24,11,127,31,24,11,127,31,24,11,127,18,14,6,127,35,27,12,127,105,81,35,127,80,62,27,127,54,41,18,127,29,22,10,127,6,5,2,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,95,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1316 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,8,10,8,127,33,39,33,127,44,51,44,127,46,53,46,127,44,52,44,127,39,46,39,127,25,30,25,127,25,31,25,127,25,31,25,127,24,30,24,127,15,19,15,127,5,7,5,127,0,1,0,127,0,0,0,127,0,0,0,95,0,0,0,64,0,0,0,64,0,1,0,127,21,24,21,127,66,74,66,127,57,66,57,127,24,30,24,127,23,29,23,127,52,60,52,127,40,47,40,127,24,30,24,127,23,28,23,127,1,2,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,95,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1317 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,11,13,11,127,23,28,23,127,33,39,33,127,36,43,36,127,23,29,23,127,20,26,20,127,11,15,11,127,3,4,3,127,0,1,0,127,0,0,0,127,0,0,0,95,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,3,5,3,127,37,41,37,127,58,66,58,127,27,33,27,127,24,30,24,127,26,32,26,127,25,31,25,127,25,31,25,127,8,9,8,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1318 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,1,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,12,15,12,127,42,49,42,127,32,39,32,127,24,30,24,127,25,31,25,127,25,31,25,127,18,22,18,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1319 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,2,2,2,127,23,27,23,127,37,43,37,127,26,33,26,127,25,31,25,127,24,30,24,127,4,4,4,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1320 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,4,5,4,127,24,28,23,127,29,35,29,127,25,31,25,127,12,16,12,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1321 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,4,4,4,127,11,14,11,127,16,20,16,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
1322 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]) |
---|
1323 | def __init__(self, parent, title): |
---|
1324 | """Constructor. |
---|
1325 | |
---|
1326 | @param title Header title. |
---|
1327 | """ |
---|
1328 | Decorator.__init__(self, parent) |
---|
1329 | self.title = title |
---|
1330 | self.border = 10 |
---|
1331 | return |
---|
1332 | def draw(self, screenRectangle): |
---|
1333 | rect = screenRectangle[:] |
---|
1334 | rect[0] += self.border |
---|
1335 | rect[1] += self.border |
---|
1336 | rect[2] -= self.border |
---|
1337 | rect[3] -= self.border |
---|
1338 | # title |
---|
1339 | glColor3ub(210, 236, 210) |
---|
1340 | glRecti(rect[0],rect[3]-41,rect[2],rect[3]-17) |
---|
1341 | glColor3ub(50, 62, 50) |
---|
1342 | glRasterPos2i(rect[0]+126, rect[3]-34) |
---|
1343 | Blender.Draw.Text(self.title) |
---|
1344 | glRasterPos2i(rect[0]+127, rect[3]-34) |
---|
1345 | Blender.Draw.Text(self.title) |
---|
1346 | # logo |
---|
1347 | glRasterPos2i(rect[0]+1, rect[3]-48) |
---|
1348 | glEnable(GL_BLEND) |
---|
1349 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) |
---|
1350 | glDrawPixels(122, 48, GL_RGBA, GL_BYTE, OgreFrame.OGRE_LOGO) |
---|
1351 | rect[3] -= 48 + self.border |
---|
1352 | glDisable(GL_BLEND) |
---|
1353 | # child |
---|
1354 | self.childWidget.draw(rect) |
---|
1355 | return |
---|
1356 | def getSize(self): |
---|
1357 | width = 2*self.border + Blender.Draw.GetStringWidth(self.title) + 85 |
---|
1358 | height = 48 + 3*self.border |
---|
1359 | minSize = self.childWidget.getSize().getMinimumSize()[:] |
---|
1360 | minSize[0] += 2*self.border |
---|
1361 | minSize[1] += 3*self.border + 48 |
---|
1362 | if minSize[0] < width: |
---|
1363 | minSize[0] = width |
---|
1364 | if minSize[1] < height: |
---|
1365 | minSize[1] = height |
---|
1366 | prefSize = self.childWidget.getSize().getPreferredSize()[:] |
---|
1367 | prefSize[0] += 2*self.border |
---|
1368 | prefSize[1] += 3*self.border + 48 |
---|
1369 | if prefSize[0] < width: |
---|
1370 | prefSize[0] = width |
---|
1371 | if prefSize[1] < height: |
---|
1372 | prefSize[1] = height |
---|
1373 | maxSize = self.childWidget.getSize().getMaximumSize()[:] |
---|
1374 | return Size(prefSize, minSize, maxSize) |
---|
1375 | |
---|
1376 | class DirectionalLayout(Widget): |
---|
1377 | """Common layout functionality for horizontal and vertical layout. |
---|
1378 | """ |
---|
1379 | def __init__(self, parent): |
---|
1380 | """Constructor. |
---|
1381 | """ |
---|
1382 | Widget.__init__(self, parent, Size([0, 0])) |
---|
1383 | self.widgetList = [] |
---|
1384 | return |
---|
1385 | def resize(self, size=None): |
---|
1386 | self.size = Size([0, 0]) |
---|
1387 | for widget in self.widgetList: |
---|
1388 | self._addWidgetSize(widget) |
---|
1389 | self.parent.resize() |
---|
1390 | return |
---|
1391 | def eventFilter(self, event, value): |
---|
1392 | for widget in self.widgetList: |
---|
1393 | widget.eventFilter(event, value) |
---|
1394 | return |
---|
1395 | def _addWidget(self, widget): |
---|
1396 | """Adds a child widget to this layout. |
---|
1397 | |
---|
1398 | The child widget is appended below all other widgets. This |
---|
1399 | method gets called by the constructor of the child widget. |
---|
1400 | """ |
---|
1401 | self.widgetList.append(widget) |
---|
1402 | self._addWidgetSize(widget) |
---|
1403 | self.parent.resize() |
---|
1404 | return |
---|
1405 | def _removeWidget(self, widget): |
---|
1406 | """Removes a child widget from this layout. |
---|
1407 | |
---|
1408 | This method gets called by the <code>removeFromParent()</code> |
---|
1409 | method of the corresponding child widget. |
---|
1410 | """ |
---|
1411 | if widget in self.widgetList: |
---|
1412 | self.widgetList.remove(widget) |
---|
1413 | self.resize() |
---|
1414 | return |
---|
1415 | def _addWidgetSize(self, widget): |
---|
1416 | raise NotImplementedError |
---|
1417 | return |
---|
1418 | |
---|
1419 | class HorizontalLayout(DirectionalLayout): |
---|
1420 | """Widget that manages horizontally stacked child widgets. |
---|
1421 | """ |
---|
1422 | def draw(self, screenRectangle): |
---|
1423 | # split height for the child widgets |
---|
1424 | minimumSize = self.size.getMinimumSize() |
---|
1425 | width = screenRectangle[2]- screenRectangle[0] |
---|
1426 | additionalWidth = width - minimumSize[0] |
---|
1427 | stretchWidgetList = [] |
---|
1428 | extraWidth = 0 |
---|
1429 | # get widgets with unlimited preferred height |
---|
1430 | if (additionalWidth > 0): |
---|
1431 | stretchWidgetList = [w for w in self.widgetList if w.getSize().getPreferredSize()[0] >= Size.INFINITY] |
---|
1432 | if (len(stretchWidgetList) > 0): |
---|
1433 | # give equal extra height to widgets with unlimited preferred height |
---|
1434 | extraWidth = additionalWidth / len(stretchWidgetList) |
---|
1435 | # draw widgets with minimum or minimum plus extra size |
---|
1436 | x = screenRectangle[0] |
---|
1437 | dx = 0 |
---|
1438 | for widget in self.widgetList: |
---|
1439 | dx = widget.getSize().getMinimumSize()[0] |
---|
1440 | if (widget in stretchWidgetList): |
---|
1441 | dx += extraWidth |
---|
1442 | widget.draw([x, screenRectangle[1], x+dx, screenRectangle[3]]) |
---|
1443 | x += dx |
---|
1444 | return |
---|
1445 | def _addWidgetSize(self, widget): |
---|
1446 | """Adds size of a widget but does not notify parent. |
---|
1447 | """ |
---|
1448 | wMinSize = widget.getSize().getMinimumSize() |
---|
1449 | wMaxSize = widget.getSize().getMaximumSize() |
---|
1450 | wPrefSize = widget.getSize().getPreferredSize() |
---|
1451 | minSize = self.getSize().getMinimumSize() |
---|
1452 | maxSize = self.getSize().getMaximumSize() |
---|
1453 | prefSize = self.getSize().getPreferredSize() |
---|
1454 | # add in x direction |
---|
1455 | minSize[0] += wMinSize[0] |
---|
1456 | maxSize[0] += wMaxSize[0] |
---|
1457 | if (prefSize[0] < Size.INFINITY): |
---|
1458 | if (wPrefSize[0] < Size.INFINITY): |
---|
1459 | prefSize[0] += wPrefSize[0] |
---|
1460 | else: |
---|
1461 | prefSize[0] = Size.INFINITY |
---|
1462 | # maximum in y direction |
---|
1463 | if (wMinSize[1] > minSize[1]): |
---|
1464 | minSize[1] = wMinSize[1] |
---|
1465 | if (wPrefSize[1] > prefSize[1]): |
---|
1466 | prefSize[1] = wPrefSize[1] |
---|
1467 | if (wMaxSize[1] > maxSize[1]): |
---|
1468 | maxSize[1] = wMaxSize[1] |
---|
1469 | self.size = Size(prefSize, minSize, maxSize) |
---|
1470 | return |
---|
1471 | |
---|
1472 | |
---|
1473 | class VerticalLayout(DirectionalLayout): |
---|
1474 | """Widget that manages vertically stacked child widgets. |
---|
1475 | """ |
---|
1476 | def draw(self, screenRectangle): |
---|
1477 | # split height for the child widgets |
---|
1478 | minimumSize = self.getSize().getMinimumSize() |
---|
1479 | height = screenRectangle[3]- screenRectangle[1] |
---|
1480 | additionalHeight = height - minimumSize[1] |
---|
1481 | stretchWidgetList = [] |
---|
1482 | extraHeight = 0 |
---|
1483 | # get widgets with unlimited preferred height |
---|
1484 | if (additionalHeight > 0): |
---|
1485 | stretchWidgetList = [w for w in self.widgetList if w.getSize().getPreferredSize()[1] >= Size.INFINITY] |
---|
1486 | if (len(stretchWidgetList) > 0): |
---|
1487 | # give equal extra height to widgets with unlimited preferred height |
---|
1488 | extraHeight = additionalHeight / len(stretchWidgetList) |
---|
1489 | # draw widgets with minimum or minimum plus extra size |
---|
1490 | y = screenRectangle[3] |
---|
1491 | dy = 0 |
---|
1492 | for widget in self.widgetList: |
---|
1493 | dy = widget.getSize().getMinimumSize()[1] |
---|
1494 | if (widget in stretchWidgetList): |
---|
1495 | dy += extraHeight |
---|
1496 | widget.draw([screenRectangle[0], y-dy, screenRectangle[2], y]) |
---|
1497 | y -= dy |
---|
1498 | return |
---|
1499 | def _addWidgetSize(self, widget): |
---|
1500 | """Adds size of a widget but does not notify parent. |
---|
1501 | """ |
---|
1502 | wMinSize = widget.getSize().getMinimumSize() |
---|
1503 | wMaxSize = widget.getSize().getMaximumSize() |
---|
1504 | wPrefSize = widget.getSize().getPreferredSize() |
---|
1505 | minSize = self.getSize().getMinimumSize() |
---|
1506 | maxSize = self.getSize().getMaximumSize() |
---|
1507 | prefSize = self.getSize().getPreferredSize() |
---|
1508 | # add in y direction |
---|
1509 | minSize[1] += wMinSize[1] |
---|
1510 | maxSize[1] += wMaxSize[1] |
---|
1511 | if (prefSize[1] < Size.INFINITY): |
---|
1512 | if (wPrefSize[1] < Size.INFINITY): |
---|
1513 | prefSize[1] += wPrefSize[1] |
---|
1514 | else: |
---|
1515 | prefSize[1] = Size.INFINITY |
---|
1516 | # maximum in x direction |
---|
1517 | if (wMinSize[0] > minSize[0]): |
---|
1518 | minSize[0] = wMinSize[0] |
---|
1519 | if (wPrefSize[0] > prefSize[0]): |
---|
1520 | prefSize[0] = wPrefSize[0] |
---|
1521 | if (wMaxSize[0] > maxSize[0]): |
---|
1522 | maxSize[0] = wMaxSize[0] |
---|
1523 | self.size = Size(prefSize, minSize, maxSize) |
---|
1524 | return |
---|
1525 | |
---|
1526 | class AlternativesLayout(Widget): |
---|
1527 | """Displays one widget out of a given set of alternatives. |
---|
1528 | """ |
---|
1529 | def __init__(self, parent): |
---|
1530 | """Constructor. |
---|
1531 | """ |
---|
1532 | Widget.__init__(self, parent, Size()) |
---|
1533 | self.widgetList = [] |
---|
1534 | self.current = None |
---|
1535 | return |
---|
1536 | def getCurrent(self): |
---|
1537 | """Returns name of current choosen widget. |
---|
1538 | """ |
---|
1539 | return self.current |
---|
1540 | def setCurrent(self, widget): |
---|
1541 | """Sets current active widget to alternative called name. |
---|
1542 | |
---|
1543 | @param widget A previously added widget or <code>None</code>. |
---|
1544 | """ |
---|
1545 | if widget is None: |
---|
1546 | self.current = None |
---|
1547 | self.size = Size() |
---|
1548 | self.parent.resize() |
---|
1549 | elif widget in self.widgetList: |
---|
1550 | self.current = widget |
---|
1551 | self.size = widget.getSize() |
---|
1552 | self.parent.resize() |
---|
1553 | return |
---|
1554 | def removeAll(self): |
---|
1555 | self.setCurrent(None) |
---|
1556 | self.widgetList = [] |
---|
1557 | return |
---|
1558 | def draw(self, screenRectangle): |
---|
1559 | if self.current: |
---|
1560 | self.current.draw(screenRectangle) |
---|
1561 | return |
---|
1562 | def eventFilter(self, event, value): |
---|
1563 | if self.current: |
---|
1564 | self.current.eventFilter(event, value) |
---|
1565 | return |
---|
1566 | def _addWidget(self, widget): |
---|
1567 | """Adds a child widget to this layout. |
---|
1568 | |
---|
1569 | The child widget is appended below all other widgets. This |
---|
1570 | method gets called by the constructor of the child widget. |
---|
1571 | """ |
---|
1572 | self.widgetList.append(widget) |
---|
1573 | return |
---|
1574 | def _removeWidget(self, widget): |
---|
1575 | """Removes a child widget from this layout. |
---|
1576 | |
---|
1577 | This method gets called by the <code>removeFromParent()</code> |
---|
1578 | method of the corresponding child widget. |
---|
1579 | """ |
---|
1580 | if widget in self.widgetList: |
---|
1581 | if (widget == self.current): |
---|
1582 | self.setCurrent(None) |
---|
1583 | self.widgetList.remove(widget) |
---|
1584 | return |
---|
1585 | |
---|
1586 | class WidgetListLayout(Widget): |
---|
1587 | """Displays a list of vertically stacked widgets using a scrollbar if necessary. |
---|
1588 | """ |
---|
1589 | def __init__(self, parent, size, scrollbarWidth=20): |
---|
1590 | """Constructor. |
---|
1591 | |
---|
1592 | @param size Minimum size should exceed 3*scrollbarWidth in both directions |
---|
1593 | """ |
---|
1594 | Widget.__init__(self, parent, size) |
---|
1595 | # mousewheel scrolling |
---|
1596 | self.listRect = [0, 0, 0, 0] |
---|
1597 | # list of child widgets |
---|
1598 | self.widgetList = [] |
---|
1599 | # list of current displayed widgets |
---|
1600 | self.visibleList = [] |
---|
1601 | # parent to register buttons to. |
---|
1602 | self.boundedRange = BoundedRangeModel() |
---|
1603 | self.scrollbarWidth = scrollbarWidth |
---|
1604 | self.scrollbar = VerticalScrollbar(WidgetListLayout.Mediator(self), Size([self.scrollbarWidth, self.scrollbarWidth]), self.boundedRange) |
---|
1605 | # mousewheel scrolling |
---|
1606 | self.mouseFocusX = 0 |
---|
1607 | self.mouseFocusY = 0 |
---|
1608 | # unused widget space |
---|
1609 | self.remainingHeight = 0 |
---|
1610 | self.autoScroll = False |
---|
1611 | return |
---|
1612 | def setAutoScroll(self, autoScroll=True): |
---|
1613 | """Scroll to newly added widgets. |
---|
1614 | """ |
---|
1615 | self.autoScroll = autoScroll |
---|
1616 | return |
---|
1617 | def _addWidget(self, widget): |
---|
1618 | self.widgetList.append(widget) |
---|
1619 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() + 1) |
---|
1620 | if self.autoScroll: |
---|
1621 | # scroll into visible area |
---|
1622 | # Avoid call to Blender.Draw.Draw() to get the current |
---|
1623 | # scrollbar extend, as widget may be disabled |
---|
1624 | if( widget.getSize().getMinimumSize()[1] > self.remainingHeight): |
---|
1625 | self.boundedRange.setValue(self.boundedRange.getMaximum() - self.boundedRange.getExtend()) |
---|
1626 | return |
---|
1627 | def _removeWidget(self, widget): |
---|
1628 | if widget in self.widgetList: |
---|
1629 | if widget in self.visibleList: |
---|
1630 | self.visibleList.remove(widget) |
---|
1631 | self.widgetList.remove(widget) |
---|
1632 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() - 1) |
---|
1633 | return |
---|
1634 | def removeAll(self): |
---|
1635 | self.widgetList = [] |
---|
1636 | self.boundedRangeModel = BoundedRangeModel() |
---|
1637 | return |
---|
1638 | def draw(self, rect): |
---|
1639 | self.listRect = [rect[0] + 2, rect[1] + 2, rect[2] - self.scrollbarWidth - 2, rect[3] - 2] |
---|
1640 | remainingHeight = self.listRect[3] - self.listRect[1] |
---|
1641 | # Box |
---|
1642 | glColor3f(0.0, 0.0, 0.0) |
---|
1643 | glBegin(GL_LINE_STRIP) |
---|
1644 | glVertex2i(rect[0], rect[3]) |
---|
1645 | glVertex2i(rect[2], rect[3]) |
---|
1646 | glVertex2i(rect[2], rect[1]) |
---|
1647 | glVertex2i(rect[0], rect[1]) |
---|
1648 | glVertex2i(rect[0], rect[3]) |
---|
1649 | glEnd() |
---|
1650 | # Widgets |
---|
1651 | self.visibleList = [] |
---|
1652 | if len(self.widgetList): |
---|
1653 | listIndex = self.boundedRange.getValue() |
---|
1654 | widgetRect = self.listRect[:] |
---|
1655 | while ((listIndex < len(self.widgetList)) \ |
---|
1656 | and (remainingHeight >= self.widgetList[listIndex].getSize().getMinimumSize()[1])): |
---|
1657 | widgetRect[3] = self.listRect[1] + remainingHeight |
---|
1658 | remainingHeight -= self.widgetList[listIndex].getSize().getMinimumSize()[1] |
---|
1659 | widgetRect[1] = self.listRect[1] + remainingHeight |
---|
1660 | self.widgetList[listIndex].draw(widgetRect) |
---|
1661 | self.visibleList.append(self.widgetList[listIndex]) |
---|
1662 | listIndex += 1 |
---|
1663 | self.boundedRange.setExtend(len(self.visibleList), 1) |
---|
1664 | # Scrollbar |
---|
1665 | self.scrollbar.draw([rect[2]-self.scrollbarWidth-1, rect[1]+1, rect[2]-1, rect[3]-1]) |
---|
1666 | self.remainingHeight = remainingHeight |
---|
1667 | return |
---|
1668 | def eventFilter(self, event, value): |
---|
1669 | for widget in self.visibleList: |
---|
1670 | widget.eventFilter(event, value) |
---|
1671 | # mousewheel scrolling |
---|
1672 | if (event == Blender.Draw.MOUSEX): |
---|
1673 | mousePositionX = value - ScreenManager.getSingleton().getScissorRectangle()[0] |
---|
1674 | if (mousePositionX >= self.listRect[0]) and (mousePositionX <= self.listRect[2]): |
---|
1675 | self.mouseFocusX = 1 |
---|
1676 | else: |
---|
1677 | self.mouseFocusX = 0 |
---|
1678 | elif (event == Blender.Draw.MOUSEY): |
---|
1679 | mousePositionY = value - ScreenManager.getSingleton().getScissorRectangle()[1] |
---|
1680 | if (mousePositionY >= self.listRect[1]) and (mousePositionY <= self.listRect[3]): |
---|
1681 | self.mouseFocusY = 1 |
---|
1682 | else: |
---|
1683 | self.mouseFocusY = 0 |
---|
1684 | elif (event == Blender.Draw.WHEELUPMOUSE) \ |
---|
1685 | and self.mouseFocusX and self.mouseFocusY: |
---|
1686 | self.scrollbar._dec(1) |
---|
1687 | elif (event == Blender.Draw.WHEELDOWNMOUSE) \ |
---|
1688 | and self.mouseFocusX and self.mouseFocusY: |
---|
1689 | self.scrollbar._inc(1) |
---|
1690 | # scrollbar |
---|
1691 | self.scrollbar.eventFilter(event, value) |
---|
1692 | return |
---|
1693 | class Mediator(Widget): |
---|
1694 | def __init__(self, parent): |
---|
1695 | self.parent = parent |
---|
1696 | return |
---|
1697 | def resize(self, size=None): |
---|
1698 | self.parent.resize() |
---|
1699 | return |
---|
1700 | def _addWidget(self, widget): |
---|
1701 | return |
---|
1702 | def _removeWidget(self, widget): |
---|
1703 | return |
---|
1704 | def _addButtonAction(self, action): |
---|
1705 | return self.parent._addButtonAction(action) |
---|
1706 | def _removeButtonAction(self, eventNumber): |
---|
1707 | self.parent._removeButtonAction(eventNumber) |
---|
1708 | return |
---|
1709 | |
---|
1710 | class AddWidgetListLayout(WidgetListLayout): |
---|
1711 | """WidgetList with an additional button in the last row. |
---|
1712 | |
---|
1713 | The first widget added to this layout is used as add-button. The |
---|
1714 | add-button is not specified in the constructor in order to not |
---|
1715 | complicate a reference from the button action to the parent layout. |
---|
1716 | """ |
---|
1717 | def __init__(self, parent, size, scrollbarWidth=20): |
---|
1718 | """Constructor. |
---|
1719 | """ |
---|
1720 | WidgetListLayout.__init__(self, parent, size, scrollbarWidth) |
---|
1721 | # additional button |
---|
1722 | self.addButton = None |
---|
1723 | return |
---|
1724 | def removeAll(self): |
---|
1725 | """Remove all widgets but the add-button. |
---|
1726 | """ |
---|
1727 | self.widgetList = [] |
---|
1728 | self.boundedRangeModel = BoundedRangeModel(0, 0, 0, 1) |
---|
1729 | return |
---|
1730 | def draw(self, rect): |
---|
1731 | self.listRect = [rect[0] + 2, rect[1] + 2, rect[2] - self.scrollbarWidth - 2, rect[3] - 2] |
---|
1732 | self.visibleList = [] |
---|
1733 | remainingHeight = self.listRect[3] - self.listRect[1] |
---|
1734 | widgetRect = self.listRect[:] |
---|
1735 | if len(self.widgetList): |
---|
1736 | listIndex = self.boundedRange.getValue() |
---|
1737 | while ((listIndex < len(self.widgetList)) \ |
---|
1738 | and (remainingHeight >= self.widgetList[listIndex].getSize().getMinimumSize()[1])): |
---|
1739 | widgetRect[3] = self.listRect[1] + remainingHeight |
---|
1740 | remainingHeight -= self.widgetList[listIndex].getSize().getMinimumSize()[1] |
---|
1741 | widgetRect[1] = self.listRect[1] + remainingHeight |
---|
1742 | self.widgetList[listIndex].draw(widgetRect) |
---|
1743 | self.visibleList.append(self.widgetList[listIndex]) |
---|
1744 | listIndex += 1 |
---|
1745 | self.boundedRange.setExtend(len(self.visibleList), 1) |
---|
1746 | # add button |
---|
1747 | if remainingHeight >= self.addButton.getSize().getMinimumSize()[1]: |
---|
1748 | # draw button |
---|
1749 | widgetRect[3] = self.listRect[1] + remainingHeight |
---|
1750 | remainingHeight -= self.addButton.getSize().getMinimumSize()[1] |
---|
1751 | widgetRect[1] = self.listRect[1] + remainingHeight |
---|
1752 | widgetRect[2] = widgetRect[0] + self.addButton.getSize().getMinimumSize()[0] |
---|
1753 | self.addButton.draw(widgetRect) |
---|
1754 | self.boundedRange.setExtend(self.boundedRange.getExtend() + 1, 1) |
---|
1755 | # Scrollbar |
---|
1756 | self.scrollbar.draw([rect[2]-self.scrollbarWidth-1, rect[1]+1, rect[2]-1, rect[3]-1]) |
---|
1757 | self.remainingHeight = remainingHeight |
---|
1758 | return |
---|
1759 | def _addWidget(self, widget): |
---|
1760 | if self.addButton: |
---|
1761 | self.widgetList.append(widget) |
---|
1762 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() + 1) |
---|
1763 | # scroll into visible area |
---|
1764 | # Avoid call to Blender.Draw.Draw() to get the current |
---|
1765 | # scrollbar extend, as widget may be disabled |
---|
1766 | if self.autoScroll: |
---|
1767 | if((widget.getSize().getMinimumSize()[1] + self.addButton.getSize().getMinimumSize()[1]) > self.remainingHeight): |
---|
1768 | self.boundedRange.setValue(self.boundedRange.getMaximum() - self.boundedRange.getExtend()) |
---|
1769 | else: |
---|
1770 | self.addButton = widget |
---|
1771 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() + 1) |
---|
1772 | return |
---|
1773 | |
---|
1774 | class LogView(Decorator, View): |
---|
1775 | """Shows the log messages. |
---|
1776 | """ |
---|
1777 | _COLOR = {Log.INFO:[0.0, 0.0, 0.0], Log.WARNING:[1.0, 1.0, 0.0], Log.ERROR:[1.0, 0.0, 0.0]} |
---|
1778 | def __init__(self, parent, size, scrollbarWidth=20, viewPrevious=True): |
---|
1779 | Decorator.__init__(self, parent) |
---|
1780 | WidgetListLayout(self, size, scrollbarWidth) |
---|
1781 | View.__init__(self, Log.getSingleton()) |
---|
1782 | self.labelSize = Size([self.getSize().getMinimumSize()[0], LabelView._HEIGHTDICT['normal'] + 2]) |
---|
1783 | # last considered log message |
---|
1784 | self.iMessages = 0 |
---|
1785 | for entry in Log.getSingleton().getMessageList(): |
---|
1786 | if viewPrevious: |
---|
1787 | self._addLogEntry(entry) |
---|
1788 | self.iMessages += 1 |
---|
1789 | # first line to display |
---|
1790 | if viewPrevious: |
---|
1791 | self.firstLine = 0 |
---|
1792 | else: |
---|
1793 | self.firstLine = self.iMessages |
---|
1794 | self.childWidget.setAutoScroll(True) |
---|
1795 | return |
---|
1796 | def update(self): |
---|
1797 | if (self.iMessages < len(Log.getSingleton().getMessageList())): |
---|
1798 | for entry in Log.getSingleton().getMessageList()[self.iMessages:]: |
---|
1799 | self._addLogEntry(entry) |
---|
1800 | self.iMessages += 1 |
---|
1801 | Blender.Draw.Draw() |
---|
1802 | return |
---|
1803 | def _addLogEntry(self, entry): |
---|
1804 | LabelView(self.childWidget, LabelModel(entry[1], color=LogView._COLOR[entry[0]]), size=self.labelSize) |
---|
1805 | return |
---|
1806 | |
---|
1807 | class Screen: |
---|
1808 | """Represents the complete script window. |
---|
1809 | |
---|
1810 | A screen represents the complete script window. It handles |
---|
1811 | drawing and events and can consist of several user interface |
---|
1812 | components. A screen has a single child widget. |
---|
1813 | """ |
---|
1814 | def __init__(self): |
---|
1815 | """Constructor. |
---|
1816 | """ |
---|
1817 | # buttonHandler event number management |
---|
1818 | self.nButtonEvent = 0 |
---|
1819 | # buttonEventDict key: iButtonEvent, value: Action |
---|
1820 | self.buttonEventDict = {} |
---|
1821 | # root widget of the screen |
---|
1822 | self.widget = None |
---|
1823 | Widget(self) |
---|
1824 | # scissor rectangle |
---|
1825 | self.scissorRectangle = [0, 0, 0, 0] |
---|
1826 | return |
---|
1827 | def activate(self): |
---|
1828 | """Makes this the current active screen. |
---|
1829 | |
---|
1830 | This method registers itself at the ScreenManager. |
---|
1831 | """ |
---|
1832 | ScreenManager.getSingleton().activate(self) |
---|
1833 | return |
---|
1834 | def deactivate(self): |
---|
1835 | """Deactivates this screen. |
---|
1836 | """ |
---|
1837 | ScreenManager.getSingleton().deactivate(self) |
---|
1838 | return |
---|
1839 | def resize(self): |
---|
1840 | """Resize notification from child widget. |
---|
1841 | """ |
---|
1842 | Blender.Draw.Redraw(1) |
---|
1843 | return |
---|
1844 | def getScissorRectangle(self): |
---|
1845 | return self.scissorRectangle |
---|
1846 | def _addWidget(self, widget): |
---|
1847 | """Adds a child widget. |
---|
1848 | |
---|
1849 | @param widget Child widget to add. |
---|
1850 | """ |
---|
1851 | if self.widget: |
---|
1852 | self.widget.removeFromParent() |
---|
1853 | self.widget = widget |
---|
1854 | return |
---|
1855 | def _removeWidget(self, widget): |
---|
1856 | """Removes a child widget. |
---|
1857 | |
---|
1858 | @param widget Child widget to remove. |
---|
1859 | """ |
---|
1860 | if (self.widget == widget): |
---|
1861 | self.widget = None |
---|
1862 | Widget(self) |
---|
1863 | return |
---|
1864 | def _addButtonAction(self, action): |
---|
1865 | """Registers an action for a button event. |
---|
1866 | |
---|
1867 | @param action Action to execute on receive of the returned button event number. |
---|
1868 | @return Event number to use for the button that corresponds to that action. |
---|
1869 | """ |
---|
1870 | # workaround for Blender 2.37 event 8 bug: |
---|
1871 | shiftEvents = 100 |
---|
1872 | # get a free event number |
---|
1873 | if (len(self.buttonEventDict) == self.nButtonEvent): |
---|
1874 | self.nButtonEvent += 1 |
---|
1875 | eventNumber = self.nButtonEvent + shiftEvents |
---|
1876 | else: |
---|
1877 | eventNumber = [(x+1+shiftEvents) for x in range(self.nButtonEvent) if (x+1+shiftEvents) not in self.buttonEventDict.keys()][0] |
---|
1878 | # assign action to that event |
---|
1879 | self.buttonEventDict[eventNumber] = action |
---|
1880 | return eventNumber |
---|
1881 | def _removeButtonAction(self, eventNumber): |
---|
1882 | """Action for the given event number will no longer be called. |
---|
1883 | |
---|
1884 | @param eventNumber Event number for the action. |
---|
1885 | """ |
---|
1886 | if self.buttonEventDict.has_key(eventNumber): |
---|
1887 | del self.buttonEventDict[eventNumber] |
---|
1888 | return |
---|
1889 | # callbacks for Blender.Draw.Register |
---|
1890 | def _draw(self): |
---|
1891 | """Draws the screen. |
---|
1892 | |
---|
1893 | Callback function for Blender.Draw.Register |
---|
1894 | """ |
---|
1895 | # clear background |
---|
1896 | theme = Blender.Window.Theme.Get()[0] |
---|
1897 | bgColor = [color/255.0 for color in theme.get('buts').back] |
---|
1898 | glClearColor(*bgColor) |
---|
1899 | glClear(GL_COLOR_BUFFER_BIT) |
---|
1900 | # scissor box: [lower-left-x, lower-left-y, width, height] |
---|
1901 | scissorBox = Blender.BGL.Buffer(GL_INT, 4) |
---|
1902 | Blender.BGL.glGetIntegerv(Blender.BGL.GL_SCISSOR_BOX, scissorBox) |
---|
1903 | self.scissorRectangle = [scissorBox[0], scissorBox[1], scissorBox[0] + scissorBox[2], scissorBox[1] + scissorBox[3]] |
---|
1904 | # size of the script window |
---|
1905 | size = list(Blender.Window.GetAreaSize()) |
---|
1906 | minimumSize = self.widget.getSize().getMinimumSize() |
---|
1907 | if size[0] < minimumSize[0]: |
---|
1908 | size[0] = minimumSize[0] |
---|
1909 | if size[1] < minimumSize[1]: |
---|
1910 | size[1] = minimumSize[1] |
---|
1911 | screenRect = [0, 0, size[0]-1, size[1]-1] |
---|
1912 | # draw widgets |
---|
1913 | self.widget.draw(screenRect) |
---|
1914 | return |
---|
1915 | def _eventHandler(self, event, value): |
---|
1916 | """Handles keyboard and mouse input events. |
---|
1917 | |
---|
1918 | Callback function for Blender.Draw.Register |
---|
1919 | """ |
---|
1920 | self.widget.eventFilter(event, value) |
---|
1921 | return |
---|
1922 | def _buttonHandler(self, event): |
---|
1923 | """Handles draw button events. |
---|
1924 | |
---|
1925 | Callback function for Blender.Draw.Register |
---|
1926 | """ |
---|
1927 | if self.buttonEventDict.has_key(event): |
---|
1928 | self.buttonEventDict[event].execute() |
---|
1929 | return |
---|
1930 | |
---|
1931 | class ScreenManager(Singleton): |
---|
1932 | """Manages screens. |
---|
1933 | """ |
---|
1934 | def __init__(self): |
---|
1935 | Singleton.__init__(self) |
---|
1936 | # current active screen is on top |
---|
1937 | self.screenStack = [] |
---|
1938 | return |
---|
1939 | def activate(self, screen): |
---|
1940 | """Activates a screen. |
---|
1941 | |
---|
1942 | This method calls Blender.Draw.Register to register a screen to |
---|
1943 | be responsible for windowing. |
---|
1944 | """ |
---|
1945 | self.screenStack.append(screen) |
---|
1946 | Blender.Draw.Register(screen._draw, screen._eventHandler, screen._buttonHandler) |
---|
1947 | Blender.Draw.Draw() |
---|
1948 | return |
---|
1949 | def deactivate(self, screen): |
---|
1950 | """Deactivates a screen. |
---|
1951 | |
---|
1952 | If the screen is the current displayed screen, the next screen on the stack |
---|
1953 | of activated screens will be reactivated. If there is no screen left, an empty |
---|
1954 | screen will be displayed. |
---|
1955 | """ |
---|
1956 | if screen in self.screenStack: |
---|
1957 | position = self.screenStack.index(screen) |
---|
1958 | self.screenStack.remove(screen) |
---|
1959 | if (position == len(self.screenStack)): |
---|
1960 | # screen was current active |
---|
1961 | if len(self.screenStack): |
---|
1962 | screen = self.screenStack.pop() |
---|
1963 | self.activate(screen) |
---|
1964 | else: |
---|
1965 | # empty screen |
---|
1966 | Blender.Draw.Register() |
---|
1967 | Blender.Draw.Draw() |
---|
1968 | return |
---|
1969 | def getScissorRectangle(self): |
---|
1970 | if len(self.screenStack): |
---|
1971 | scissorRectangle = self.screenStack[-1].getScissorRectangle() |
---|
1972 | else: |
---|
1973 | scissorRectangle = [0, 0, 0, 0] |
---|
1974 | return scissorRectangle |
---|