diff --git a/examples/hawaii_pizza/test_lammps.py b/examples/hawaii_pizza/test_lammps.py index b164a85..4b28e5a 100644 --- a/examples/hawaii_pizza/test_lammps.py +++ b/examples/hawaii_pizza/test_lammps.py @@ -1,148 +1,148 @@ #!/usr/bin/python3 import pylibmultiscale as lm import numpy as np import cv2 lm.loadModules() Dim = 3 comm = lm.Communicator.getCommunicator() nb_proc = comm.getNumberFreeProcs() comm.addGroup('md', nb_proc) md_group = lm.Communicator.getGroup('md') A = 4.047971240341177 L = 200 class ImageGeom(lm.Geometry): def __init__(self, center, name, filename): super().__init__(3, name) self.center = np.array(center) self.img = np.array(cv2.imread(filename)) # import matplotlib.pyplot as plt # print(self.img.shape) # print(self.img) # plt.imshow(np.linalg.norm(self.img, axis=2)) # plt.show() def init(self): pass def contains(self, x, y, z): _x = int((x - self.center[0])) _y = int((y - self.center[1])) _x += int(self.img.shape[0]/2) _y += int(self.img.shape[1]/2) if _x > self.img.shape[0]-1 or _x < 0: return False if _y > self.img.shape[1]-1 or _y < 0: return False if (self.img[_x, _y, :] == [255, 255, 255]).all(): return False return True gManager = lm.GeometryManager.getManager() gManager.reset() -pineapple = ImageGeom((0, -100*A, 0), 'pineapple', 'pineapple.png') -pizza = ImageGeom((0, 100*A, 0), 'pizza', 'pizza.png') +pineapple = ImageGeom((0, -55*A, 0), 'pineapple', 'pineapple.png') +pizza = ImageGeom((0, 55*A, 0), 'pizza', 'pizza.png') gManager.addGeometry(pineapple) gManager.addGeometry(pizza) cube = lm.GeomUnion(3, 'md_geom') cube.params.ids = ['pineapple', 'pizza'] cube.init() gManager.addGeometry(cube) lm.FilterManager.destroy() lm.ActionManager.destroy() lm.DomainMultiScale.destroy() dom = lm.DomainLammps3('md', md_group) open("lammps.in", 'w').write(""" mass * 26.98153860 pair_style lj/cut 6.03863042319 pair_coeff * * 2.4621 2.596037 -fix 2 all nve """) dom.params.lammps_file = "lammps.in" dom.params.create_header = True -dom.params.boundary = ['s', 's', 'p'] +dom.params.boundary = ['s', 's', 's'] dom.params.lattice = 'fcc' dom.params.lattice_size = A dom.params.domain_geometry = "md_geom" dom.params.replica = [-3*L, 3*L, -L, L, 0, 1] dom.params.lattice_origin = [.1, .1, .1] dom.params.timestep = 1. dom.init() lm.DomainMultiScale.getManager().addObject(dom) atoms_pineapple = lm.FilterGeometry('atoms_pineapple') atoms_pineapple.params.geometry = 'pineapple' atoms_pineapple.init() atoms_pineapple.compute(dom.getContainer()) atoms_pizza = lm.FilterGeometry('atoms_pizza') atoms_pizza.params.geometry = 'pizza' atoms_pizza.init() atoms_pizza.compute(dom.getContainer()) vel = lm.ComputeExtract('vel_pineapple') vel.params.field = lm.velocity vel.init() vel.compute(atoms_pineapple.evalOutput()) imposed_vel = vel.evalOutput().array().copy() imposed_vel[:] = [0., 10., 0.] impose = lm.StimulationField('stim_vel') impose.params.field = lm.velocity impose.init() impose.compute(dofs=atoms_pineapple.evalOutput(), field=imposed_vel) dumper = lm.DumperParaview('dumper') dumper.params.input = 'md' dumper.params.force = True dumper.params.disp = True dumper.params.vel = True +dumper.params.epot = True dumper.init() dumper.dump() nb_step = 10000 -time_step = 1e-1 +time_step = 1e-2 for current_step in range(nb_step): lm.current_step.fset(current_step) v = dom.primalTimeDerivative() p = dom.primal() acc = dom.acceleration() v += 0.5 * time_step * acc p += time_step * v dom.changeRelease() dom.enforceCompatibility() lm.current_stage.fset(lm.PRE_STEP2) dom.updateGradient() if (current_step % 10 == 0): print(current_step) dumper.dump() dom.updateAcceleration() v = dom.primalTimeDerivative() acc = dom.acceleration() v += 0.5 * time_step * acc dom.changeRelease() diff --git a/examples/hawaii_pizza/video.pvsm b/examples/hawaii_pizza/video.pvsm index 4afa85b..71b71cd 100644 --- a/examples/hawaii_pizza/video.pvsm +++ b/examples/hawaii_pizza/video.pvsm @@ -1,6471 +1,19670 @@ - + - + + + + + - + - + - + - + - - - - - + + - - - - - - + + - + + - + - + - - + + + + + + + - - + + + + + + + - + - + + + + - - - - - - - - + + + - - - + + - - - + + - + - + - - - + + - + - - - + + - + - - + + + + + + + + + + + + + + + - - - + + - + + + + + + + + - - - - + - - - - - - + + - - - + + + + + + + + - - - - - - - - + + + - - + - - - - - + + - + - - - - - - - + - + - - - - - - - - - - - - - + + - - - + + - + - - + + + + + + + + + + + + - + - - + - + - - - - + + + + + + - - - - - - - + + + + - + - - - - - - - - - - - + + + + + + - + + + + + - - - + + - - - + + + + - + - + + + + + + - + - + + + + + - + + + + + + + + + + + - + - + - + - + - + + + + + - + + + + + + - - - + + + + + - - - - - - - - - + - + - - + - - + + + + + + + + + - - - - - - + + + + + - + + + + - - - - - - - - - - - + + - - - + + + + - + + + - + - + - + - - + - - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - - - - - - + + + - + + + + - - - + + - + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + - - + - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - - - + + + + + + + + + + + - - - - - + + + - - + - - - + + + + + + + + - - + - - - - - - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + - + + + + + + - - + + + + + + + + + + + - - + - - - + - - - + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + - - - - + + - + - - - - - - - - - - - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + - + - + + + - + - + - + - + - - - + + + - - - + + + + + + + + - - - - - + + + + + + + + + + + + - - - + - + - - - - - - - - - + + + + + + - + + + + - + - + + + + - + - - - + - + - - - - - - - - - + + + - - - + + + - + - + - - - + - + - + + + + + + + + + + + + + + + + + + + + - - - - - - - + - + - + - + + + + + + + + + + + + + - + + + + + + - - - - + + + - - - + + + + + + + + + + + - + + + - - + + + + + + + - + - + - + - - - + - - - + + + - + - + + + - - - + + + - + - - - - - - + - - - + + + + + - - - - - + + - - - + + + - + - + + + - + - - - - - + + + + + + - + - + - - + + + + + - + - - - - + + + + - - - + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - - - + + + - - - + + - - - + + + - + - + + + + + - - + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - - - - - - - + + + - - - + + - + - + - - - - + - - - - + + + + - - - + + + - + - + - + - + - - - - - + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + - + - + - - - - - + + + - - + + + - + - + - + - - - + - - - - - - - - + + - - + + + - - - + + + - + - + - + - + - + - + - - - - + - - - - - + - - - + + + - + - + - + - + - - + + - + + + + + + + + + + + + + - - - - - - - + + + + + + - - + + + + + - - - + + + + + - - - + + + + + + + + + + + + + - - - + + + + + + + + + + - - - + + + - - + + + + + + + - - - + + + - + - - - + - + - - - - - - + - - + + + + + - - - + + + + + - - - + + + + + - + - + - - - + + + + + + + + + + + - - - - - + + + + - - - + + + + + + + + + + + + + - - - + + + - - - + + - - - + + - - - + + + - - - + - + + + - + - - + + - - - - - + + + - - - + + + - - - + + + - - - + + + + + + + + - - - - - - - + + + + + + + + + + + + + - + - + - + - + + + + - - - + + - - - + - + - + + + + - - - + - + - + - - - + + + - - - + + + - - - - - - - + + + - - - - - + + + - - - + + + - - - - - - - + + + + + + + - - - + + + + + + - - - + + + - - - + + + - - - + + + + + + + + + + + - + - + + + + + + - + - + - - - + + + + + - - - + + + + + - + - + - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - + + + + + - - - + - + + + + + - + - - - - - - + + - + - + - + - + + + + + + + - - - - - + + - - - - - - - - - + + + - + - + + + - + - + + + + + + - - - + - + - - - + + + + + - + - + + + + + - - - + + + + + - - - + + + - - - + + + + + + + + - - - + + - - - + + + + + + + + - - - + + + + + + + + - - - + + + - + - - - + - + - - - - - - - - - - - - - + + + + + + - - - + + - - + + + - - + + - - - + + + - - - + + + + + + + - + - + - + - - + - + - + - + - + + + - - - + + + - - - + + + - + - - - + - + - + - + - + + + - - - + + + + + + + + - - - + + - - - + + + - - - + + - + - + - + - + + + + + - - - + + + - + - - - + - - - - - + + + - - - + + + - + - - - + + + + + - + - - - - - + - - - + + + + + + + + + + + - - - + + + + + + + + + + + - - + + - + - - - - + - + - + + + - - - + + + - - - - - - - + + + - - + + + - - - + + - - - + + + - + - - - + - - - + + + - + - - - - + - + - - - - - - - - + - - - + + + - + - + - - - - - + + + - - - + + + - + - - - + + + + + + + + + + + + + + + - - - - - + + + + + + + - - - + + + + + - - - - - - + + + + - - - + + + + + + + + + + + + + - - - + + + + + + + + + + - - - + + + - - - + + + + + + + - - - + + + - + - - - + - + - - - - - - + - - + + + + + - - - + + + + + - - - + + + + + - + - + - - - + + + + + + + + + + + - - - + + + + - - - - - + + + + + + + + + + + + + - + - - - - - - + - - + + - - - + + - - - + + + - + - + + + - + - + + + - + - + - + - - - + - - - - - - - + + + + + + + + + + + - - + + + + + + + + + + + + + - - - + + + - - - + + + + + + + + + - + - + - + + + + - + + + + + - + - + - + - - - + - + - - - - - - + - - + + + - - - + + + - - - + + + + + + + - - - + + + + + + - + - + - - - + - + - - - - + + + + - - - - + + + + + + - - - + + + + + + + + - + - + - - - - - + + + + + - + - - - - - - + - - - - - + - - - - - - - - - - - + - - - - - + - - - - - + + + + + - - + + - - - - - - - - - - - - - - - - - + - - - - - + - + - - - + + + - + - + + + - + - + - - - - + - - - - - + - - - + + + + + - - - + + - - + + + - - + + + + + - + - - - - + + + + + - - - - - + - - - - + - - + + + + + - + - - - - + + + + - - - + + + + + - + - + - - + + + + + + + + - - - + + - - - + + + + + + + + - - - - - + + + + + + + + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - + + + - - - + + - + - - - + - + - - - - - + + + + - - + + + - - - + + + - + - + - + - + + + - - - + + + + + + + + + + + - + - + - - - + + + - + - + - + - + - - - + + + + + + + + + + - + - + + + + + - + - + - + - + - + - + - - - - - + + + - - - - - - - + + + + + + - + + + + + + + + + + + + + + - - - + + + + + + + + + + + - + + + + - + - + - + + + - + + + + + - + - + - + - + + + + - - - + - + - - - - - - + - - + + + - - - + + + + + + + - + - + - + - + - + - + - + - + - - + + - + + + + + + + + + + + + + - - - - - - - + + + + + + - - + + + + + - - - + + + + + - - - + + + + + + + + + + + + + - - - + + + + + + + + + + - - - + + + - - - - + + + + + + + - - - + + + + + - + - - + + + - + - + - + - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + + + + - + - + - + - - - - + - - - + + + + + - - - - - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + - - - + + - + - - - - - + - - + + - + - - - - - + - - - + + + - + - + - + - + - + - - - + - - - - - - - - + + + - - + + + - - - + + + + + + + - + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + + + + - + - + - + - + - + - - - - - + + + + - - + + + + + - - - + + + + + + + + + + + + + - + - + - - - - - + - + - - + + + + + - - - - - - - + + - - - + + + - - - + + + + + - + - + + + + + + - + - - - + - + + + + + + + - - - - - + + + + - - - - - - + + + + + - + - + - - - + + + + + + + + - - - + + - - + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - - - - - - - + + + - - - + + - + - - - - + - + - - - - + + + + - - - + + + - + - + - + - + - - + + - - - - - - - - - - - - - - + + - - - + + + - - - + + + - + - - - - - - - - + - + - + - - - + + + - + - + - + - + - - - - - - - + + + - - - + + - + - + - - - + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + - + + + + + - + - - - + - - - - - + + + + + + + + + + + - + - - - - - + + + + + + + + + - - - + + - - - + - - - - - - - + - + - - - - - + + + - - - - - + + + - + - - - - - - - - - - - + - - - + + + - - - - - - - + + - - - - - + + + - - - + + + - - - + - - - + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + - - - - - - - - + + - + + + + + + + + + + + + + - - - + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + - - - + - + - + - - - - - - - + - + - + - - - + + + + + - - - + - + + + - - - - - - - - - + + + + + - + - + - - - + + + + + + + + + + + - - - - - + + + + - - - + + + + + + + + + + + + + - + - - - - - + - - - + + - - - + + - + - + - + - + + + - + - - - - - + + + - + - - - - - + - + - + - - - - - - - + + + - - - + + + + + + + + - - - + + + + + + + + + + + + + - + + - + + + + + - - - + + - + - + + + + - + + + + + - + - + - - + - + - + - - - + + + - + - + - - - + + + - - - - - + + + + + + + - + + + + + + + + - + - + - - - - - + - - - - - - - + + + + + + + + + + + - + - + + + + + + - + - + - - - + + + + + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + + + + - - - + + + + + - + - + - + - - - - - + - - - - - - - - - - - - + - - - - - + - - - - - - + + + - + - - - - + - - - + + + + + - - - + + - - - + + + - + - + - - - + + + + + + + + - - - - - + + + - - - - - + + + + + - - - + + + + + + + - - - - - - + + + + - + - + - - - + + + + + + + + - - - + + - - - + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - - - + + + - + + + + + + + + - + + + + + - + - + - + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + + + + + + + + - - - + + + - + - + + + + + - + - + - + - + - + - + - - - - - + + + - - - - - - - + + + + + + - + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + - + - + - + - + + + - - - + + + - + - + - + - - - + - - - - - - - - + + - - + + + - - - + + + - + - + - + - + - + - + - - - + + + + + - + + + + + - + + + + + - + - + - + - - - - - - - - + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - + - + - - + + - + - + - - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - - - + + + - + - + - + - + - + - + - - - - - + + + + + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - + + + - + - + - + - - - + + + - + - + - - - + + + - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - + - + - - - + + + - + - + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - - - - - + + + + + - + - + - + - + - + - - - + + + - + - - - - - - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - + + + - + - + - + - - - - - - + - + - + - - - - - + + + + + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - - + + + - + - + - + - - - - - - + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - - - - + + - - - + + + - + - + - + - + - - - - + + + + - - - - + + + + - - + + - - + + - - - - + + + + - - - - + + + + - + - - - - + + + + - - - - + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + + + + + + - - - + + + - + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +