From 88b136f0a3ef2aef99f5e70373ced16257b845f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 22 Dec 2015 22:59:50 +0100 Subject: [PATCH 01/43] First version of migration script --- geocode.py | 39 +++++++++++++++++ graph.py | 107 ++++++++++++++++++++++++++++++++++++++++++++++ node.py | 104 ++++++++++++++++++++++++++++++++++++++++++++ node_hierarchy.py | 94 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 344 insertions(+) create mode 100644 geocode.py create mode 100644 graph.py create mode 100644 node.py create mode 100755 node_hierarchy.py diff --git a/geocode.py b/geocode.py new file mode 100644 index 0000000..908b9e6 --- /dev/null +++ b/geocode.py @@ -0,0 +1,39 @@ +#!/usr/bin/python +# -*- coding: utf-8 - +#import time +from geopy.geocoders import Nominatim +from blitzdb import Document, FileBackend +class GeoAssign(Document): + pass +class Geocode: + def __init__(self, geocoderCache = True, printStatus = False): + self.printStatus = printStatus + self.geocoderCache = geocoderCache + if self.geocoderCache: + self.db = FileBackend('./geo-cache') + def getGeo(self, lon, lat): + if self.geocoderCache: + try: + nodeObj = self.db.get(GeoAssign,{'lat' : lat, 'lon' : lon}) + nodeObj['cached'] = True + return nodeObj + except GeoAssign.DoesNotExist: + pass + if self.printStatus: + print('lon: '+str(lon)+', lat: '+str(lat)+' not in cache - start lookup at Nominatim-API') + geolocator = Nominatim() + location = geolocator.reverse([lat, lon], timeout=20) + if 'address' in location.raw: + location = location.raw['address'] + nodeObj = GeoAssign({ + 'lat' : lat, + 'lon' : lon, + 'payload' : location + }) + self.db.save(nodeObj) + self.db.commit() + nodeObj['cached'] = False + return nodeObj + else: + # got no results (i.e. coordinates are incorrect) + return None \ No newline at end of file diff --git a/graph.py b/graph.py new file mode 100644 index 0000000..00fcb56 --- /dev/null +++ b/graph.py @@ -0,0 +1,107 @@ +#!/usr/bin/python +# -*- coding: utf-8 - +#Imports: +import urllib +import json +from pprint import pprint +from node import Node +from geocode import Geocode + +class Graph: + def __init__(self, nodesData, graphData): + self.coder = Geocode(geocoderCache = True, printStatus = True) + self.data = graphData + self.nodes = nodesData + self.nodes_list = {} + self.parseNodes() + self.parseLinks() + self.calculateStepsToVpn() + self.findMissingGeo() + + def parseNodes(self): + for k,v in self.nodes['nodes'].iteritems(): + lat, lon = self.getGeo(k) + node = Node(k, ipv6 = self.getPublicAddress(k), hostname = self.getHostname(k), isOnline = self.getOnlineState(k), lat=lat, lon=lon, coder = self.coder) + self.nodes_list[k] = node + + def parseLinks(self): + link_nodes = self.data['batadv']['nodes'] + for link in self.data['batadv']['links']: + if 'node_id' in link_nodes[link['source']].keys() and 'node_id' in link_nodes[link['target']].keys():#else it is a vpn link + self.setLinkBetween(link_nodes[link['source']]['node_id'], link_nodes[link['target']]['node_id']) + else: + self.setVpnLink(link['source'], link['target']) + + def setLinkBetween(self, src, dst, stateOnline = True, lastSeen = None): + if src and dst: + self.nodes_list[src].links[dst] = { + 'node' : self.nodes_list[dst], + 'state_online' : stateOnline, + 'last_seen' : lastSeen + } + self.nodes_list[dst].links[src] = { + 'node' : self.nodes_list[src], + 'state_online' : stateOnline, + 'last_seen' : lastSeen + } + + def setVpnLink(self, src, dst): + if 'node_id' not in self.data['batadv']['nodes'][src].keys(): + if self.data['batadv']['nodes'][dst]['node_id']: + self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].stepsToVpn = 0 + elif 'node_id' not in self.data['batadv']['nodes'][dst].keys(): + if self.data['batadv']['nodes'][src]['node_id']: + self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].stepsToVpn = 0 + + def calculateStepsToVpn(self): + for node in self.nodes_list.itervalues(): + node.calculateStepsToVpn() + + def findMissingGeo(self): + for node in self.nodes_list.itervalues(): + node.findMissingGeo() + + def getAllLevelXNodes(self, level, online = True): + zmap = {} + for k,v in self.nodes_list.iteritems(): + if v.isOnline or online == False: + if v.stepsToVpn == level: + zmap[k] = v + return zmap + + + def getHostname(self,node_id): + return self.nodes['nodes'][node_id]['nodeinfo']['hostname'] + + def getGeo(self, node_id): + if 'location' in self.nodes['nodes'][node_id]['nodeinfo'] and 'latitude' in self.nodes['nodes'][node_id]['nodeinfo']['location'] and 'longitude' in self.nodes['nodes'][node_id]['nodeinfo']['location']: + return self.nodes['nodes'][node_id]['nodeinfo']['location']['latitude'], self.nodes['nodes'][node_id]['nodeinfo']['location']['longitude'] + return None, None + + def getPublicAddress(self,node_id): + if node_id in self.nodes['nodes']: + if 'addresses' in self.nodes['nodes'][node_id]['nodeinfo']['network']: + for address in self.nodes['nodes'][node_id]['nodeinfo']['network']['addresses']: + if address.startswith('2a03'): + return address + return None + + def getOnlineState(self,node_id): + return self.nodes['nodes'][node_id]['flags']['online'] + + + def getNodeCloudsIn(self, region): + results = {} + for k,v in self.getAllLevelXNodes(0).iteritems(): + if v.geodata != None and v.isOnline == True: + if v.isInRegion(region): + results.update(v.getNodeCloud({})) + print "Result:",len(results), region + return results + + def maxDepth(self): + maxDepth = 0 + for v in self.nodes_list.itervalues(): + if v.stepsToVpn > maxDepth: + maxDepth = v.stepsToVpn + return maxDepth+1 \ No newline at end of file diff --git a/node.py b/node.py new file mode 100644 index 0000000..2fec681 --- /dev/null +++ b/node.py @@ -0,0 +1,104 @@ +#!/usr/bin/python +# -*- coding: utf-8 - +from geocode import Geocode + +class Node(object): + def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None): + self.coder = coder + if self.coder == None: + self.coder = Geocode(geocoderCache = True, printStatus = True) + self.links = {} + self.nodeid = nodeid + self.ipv6 = ipv6 + self.hostname = hostname + self.stepsToVpn = -1 + self.isOnline = isOnline + self.lastSeen = lastSeen + self._geo = None + self.geodata = None + if lat != None and lon != None: + self.geo = { + 'lat' : lat, + 'lon' : lon + } + + + def addLink(self,nodeid, node): + if not nodeid in self.links: + self.links[nodeid] = node + else: + print "link still exists" + + def calculateStepsToVpn(self, trace = []): + if self.stepsToVpn != 0:#self.stepsToVpn == -1 doesn't work, cause the shortest path could be the path to a former trace member + own_trace = trace[:]#clone - trace for preventing loops in pathfinding in graph + own_trace.append(self.nodeid) + lowest = -1 + current = -1 + for k,v in self.links.iteritems(): + if k not in own_trace: + current = v['node'].calculateStepsToVpn(own_trace) + if lowest == -1 or current < lowest: + lowest = current + if lowest > -1: + self.stepsToVpn = lowest+1 + return self.stepsToVpn + + def findMissingGeo(self, trace = []): + if self.geo == None: + own_trace = trace[:] + own_trace.append(self.nodeid) + geo = None + for k,v in self.links.iteritems(): + if k not in own_trace: + geo = v['node'].findMissingGeo(own_trace) + if geo != None: + self.geo = geo.copy() + break + return geo + else: + return self.geo + + def getNodeCloud(self, nodes = {}): + nodes[self.nodeid] = self + for k,v in self.links.iteritems(): + if k not in nodes: + nodes = v['node'].getNodeCloud(nodes) + return nodes + + def isInRegion(self, regions): + #AND and OR Conditions are possible + val = False + if self.geodata == None: + return False + + for region in regions: + val = False + for k,v in region.iteritems(): + if k in self.geodata and self.geodata[k] == v: + val = True + else: + val = False + if val: + return True + return val + + + @property + def geo(self): + return self._geo + + @geo.setter + def geo(self, value): + self._geo = value + self.__get_geodata__() + + def __get_geodata__(self): + if self.geo != None: + result = self.coder.getGeo(self.geo['lon'], self.geo['lat']) + if result: + self.geodata = result['payload'] + if result['cached'] == False: + time.sleep(1) + else: + self['geodata'] = None \ No newline at end of file diff --git a/node_hierarchy.py b/node_hierarchy.py new file mode 100755 index 0000000..edf0751 --- /dev/null +++ b/node_hierarchy.py @@ -0,0 +1,94 @@ +#!/usr/bin/python +# -*- coding: utf-8 - +#Imports: +import json +from graph import Graph + +class NodeHierarchy: + def __init__(self, nodesFile, graphFile, dataPath = './', printStatus = False, targets = None): + self.printStatus = printStatus + self.targets = targets + self.nodesData = self.__getFile__(nodesFile) + self.graphData = self.__getFile__(graphFile) + self.dataPath = dataPath + + self.graph = Graph(self.nodesData, self.graphData) + if self.targets == None: + self.writeConfigFiles(self.graph.nodes_list,"all") + else: + nodes = {} + for k,v in self.targets.iteritems(): + nodes = self.graph.getNodeCloudsIn(v) + self.writeConfigFiles(nodes,k) + nodes = {} + + def __getFile__(self, nodesFile): + if nodesFile.startswith('https://') or nodesFile.startswith('http://'): + if self.printStatus: + print "Download node.json from URL: " + nodesFile + resource = urllib.urlopen(nodesFile) + else: + if self.printStatus: + print "Open node.json file: " + nodesFile + resource = open(nodesFile) + data = json.loads(resource.read()) + resource.close() + return data + + def writeConfigFiles(self,nodes_level, name): + maxDepth = self.maxDepth(nodes_level) + for i in range(0,maxDepth): + content = 'geo $switch {\n\tdefault\t0;' + f = open(self.dataPath+'/'+name+'_node_level'+str(i),'w') + for node in nodes_level.itervalues(): + if node.stepsToVpn == i: + if node.ipv6 and node.hostname: + content += '\n\t'+node.ipv6+'\t1;\t #'+node.hostname + #else: + # print node.nodeid + content += '\n}' + f.write(content.encode('utf8')) + f.close() + + def maxDepth(self, nodes): + maxDepth = 0 + for v in nodes.itervalues(): + if v.stepsToVpn > maxDepth: + maxDepth = v.stepsToVpn + return maxDepth+1 + + +targets = { + 'muenster' : [ + {'city' : u'Münster'}, + {'county' : u'Münster'} + ], + 'kreis_warendorf' : [ + {'county' : u'Kreis Warendorf'} + ], + 'kreis_coesfeld' : [ + {'county' : u'Kreis Coesfeld'} + ], + 'kreis_steinfurt_west' : [ + {'town' : u'48565'}, + {'village' : u'Wettringen'}, + {'town' : u'Ochtrup'}, + {'village' : u'Metelen'}, + {'town' : u'Horstmar'}, + {'village' : u'Laer'}, + {'village' : u'Nordwalde'}, + {'village' : u'Altenberge'} + ], + 'kreis_steinfurt_ost' : [ + {'town' : u'Emsdetten'}, + {'town' : u'Neuenkirchen'}, + {'town' : u'Rheine'}, + {'town' : u'Greven'}, + {'village' : u'Ladbergen'}, + {'town' : u'Lengerich'}, + {'town' : u'Tecklenburg'}, + {'village' : u'Lienen'}, + ] +} + +ds = NodeHierarchy(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = './results/', targets = targets) \ No newline at end of file From 52efe6a7f0e79f1c07cfb87c48beecca77f59ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Wed, 23 Dec 2015 14:16:18 +0100 Subject: [PATCH 02/43] Added targets to script --- domain_selector.py | 57 ++++++++++++++++++++++++ node.py | 1 + node_hierarchy.py | 107 +++++++++++++++++++-------------------------- 3 files changed, 102 insertions(+), 63 deletions(-) create mode 100644 domain_selector.py diff --git a/domain_selector.py b/domain_selector.py new file mode 100644 index 0000000..9f995da --- /dev/null +++ b/domain_selector.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +# -*- coding: utf-8 - +#Imports: +import json +from graph import Graph +class DomainSelector: + def __init__(self, nodesFile, graphFile, dataPath = './', printStatus = False, targets = None): + self.printStatus = printStatus + self.targets = targets + self.nodesData = self.__getFile__(nodesFile) + self.graphData = self.__getFile__(graphFile) + self.dataPath = dataPath + + self.graph = Graph(self.nodesData, self.graphData) + if self.targets == None: + self.writeConfigFiles(self.graph.nodes_list,"all") + else: + nodes = {} + for k,v in self.targets.iteritems(): + nodes = self.graph.getNodeCloudsIn(v) + self.writeConfigFiles(nodes,k) + nodes = {} + + def __getFile__(self, nodesFile): + if nodesFile.startswith('https://') or nodesFile.startswith('http://'): + if self.printStatus: + print "Download node.json from URL: " + nodesFile + resource = urllib.urlopen(nodesFile) + else: + if self.printStatus: + print "Open node.json file: " + nodesFile + resource = open(nodesFile) + data = json.loads(resource.read()) + resource.close() + return data + + def writeConfigFiles(self,nodes_level, name): + maxDepth = self.maxDepth(nodes_level) + for i in range(0,maxDepth): + content = 'geo $switch {\n\tdefault\t0;' + f = open(self.dataPath+'/'+name+'_node_level'+str(i),'w') + for node in nodes_level.itervalues(): + if node.stepsToVpn == i: + if node.ipv6 and node.hostname: + content += '\n\t'+node.ipv6+'\t1;\t #'+node.hostname + #else: + # print node.nodeid + content += '\n}' + f.write(content.encode('utf8')) + f.close() + + def maxDepth(self, nodes): + maxDepth = 0 + for v in nodes.itervalues(): + if v.stepsToVpn > maxDepth: + maxDepth = v.stepsToVpn + return maxDepth+1 \ No newline at end of file diff --git a/node.py b/node.py index 2fec681..486b937 100644 --- a/node.py +++ b/node.py @@ -1,6 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 - from geocode import Geocode +import time class Node(object): def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None): diff --git a/node_hierarchy.py b/node_hierarchy.py index edf0751..a4b9d27 100755 --- a/node_hierarchy.py +++ b/node_hierarchy.py @@ -2,72 +2,18 @@ # -*- coding: utf-8 - #Imports: import json -from graph import Graph - -class NodeHierarchy: - def __init__(self, nodesFile, graphFile, dataPath = './', printStatus = False, targets = None): - self.printStatus = printStatus - self.targets = targets - self.nodesData = self.__getFile__(nodesFile) - self.graphData = self.__getFile__(graphFile) - self.dataPath = dataPath - - self.graph = Graph(self.nodesData, self.graphData) - if self.targets == None: - self.writeConfigFiles(self.graph.nodes_list,"all") - else: - nodes = {} - for k,v in self.targets.iteritems(): - nodes = self.graph.getNodeCloudsIn(v) - self.writeConfigFiles(nodes,k) - nodes = {} - - def __getFile__(self, nodesFile): - if nodesFile.startswith('https://') or nodesFile.startswith('http://'): - if self.printStatus: - print "Download node.json from URL: " + nodesFile - resource = urllib.urlopen(nodesFile) - else: - if self.printStatus: - print "Open node.json file: " + nodesFile - resource = open(nodesFile) - data = json.loads(resource.read()) - resource.close() - return data - - def writeConfigFiles(self,nodes_level, name): - maxDepth = self.maxDepth(nodes_level) - for i in range(0,maxDepth): - content = 'geo $switch {\n\tdefault\t0;' - f = open(self.dataPath+'/'+name+'_node_level'+str(i),'w') - for node in nodes_level.itervalues(): - if node.stepsToVpn == i: - if node.ipv6 and node.hostname: - content += '\n\t'+node.ipv6+'\t1;\t #'+node.hostname - #else: - # print node.nodeid - content += '\n}' - f.write(content.encode('utf8')) - f.close() - - def maxDepth(self, nodes): - maxDepth = 0 - for v in nodes.itervalues(): - if v.stepsToVpn > maxDepth: - maxDepth = v.stepsToVpn - return maxDepth+1 - +from domain_selector import DomainSelector targets = { - 'muenster' : [ - {'city' : u'Münster'}, - {'county' : u'Münster'} - ], +# 'muenster' : [ +# {'city' : u'Münster'}, +# {'county' : u'Münster'}, +# ], 'kreis_warendorf' : [ - {'county' : u'Kreis Warendorf'} + {'county' : u'Kreis Warendorf'}, ], 'kreis_coesfeld' : [ - {'county' : u'Kreis Coesfeld'} + {'county' : u'Kreis Coesfeld'}, ], 'kreis_steinfurt_west' : [ {'town' : u'48565'}, @@ -77,7 +23,7 @@ targets = { {'town' : u'Horstmar'}, {'village' : u'Laer'}, {'village' : u'Nordwalde'}, - {'village' : u'Altenberge'} + {'village' : u'Altenberge'}, ], 'kreis_steinfurt_ost' : [ {'town' : u'Emsdetten'}, @@ -88,7 +34,42 @@ targets = { {'town' : u'Lengerich'}, {'town' : u'Tecklenburg'}, {'village' : u'Lienen'}, + ], + 'muenster_stadt' : [ + {'city_district' : u'Münster-Mitte'}, + {'city_district' : u'Münster-Nord'}, + {'city_district' : u'Münster-Ost'}, + {'suburb' : u'Berg Fidel'}, + {'suburb' : u'Gremmendorf'}, + {'suburb' : u'Mecklenbeck'}, + {'suburb' : u'Gievenbeck'}, + {'suburb' : u'Nienberge'}, + {'suburb' : u'Roxel'}, + {'suburb' : u'Sentruper Höhe'}, + ], + 'muenster_sued' : [ + {'suburb' : u'Amelsbüren'}, + {'suburb' : u'Hiltrup'}, + {'suburb' : u'Albachten'}, + ], + 'kreis_borken' : [ + {'town' : u'Ahaus'}, + {'town' : u'Bocholt'}, + {'town' : u'Borken'}, + {'town' : u'Gescher'}, + {'village' : u'Heek'}, + {'town' : u'Heiden'}, + {'town' : u'Isselburg'}, + {'village' : u'Legden'}, + {'town' : u'Raesfeld'}, + {'town' : u'Reken'}, + {'town' : u'Rhede'}, + {'village' : u'Schöppingen'}, + {'town' : u'Stadtlohn'}, + {'village' : u'Südlohn'}, + {'town' : u'Velen'}, + {'town' : u'Vreden'}, ] } -ds = NodeHierarchy(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = './results/', targets = targets) \ No newline at end of file +ds = DomainSelector(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) \ No newline at end of file From 48d4fca08ba87e49f4dd55052d827d581e339e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Wed, 23 Dec 2015 17:35:55 +0100 Subject: [PATCH 03/43] Implemented export of statistic files and first version of statistics file --- domain_selector.py | 21 +++++++++-- node_hierarchy.py | 1 - track_statistics.py | 90 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 4 deletions(-) create mode 100755 track_statistics.py diff --git a/domain_selector.py b/domain_selector.py index 9f995da..2925cad 100644 --- a/domain_selector.py +++ b/domain_selector.py @@ -14,11 +14,13 @@ class DomainSelector: self.graph = Graph(self.nodesData, self.graphData) if self.targets == None: self.writeConfigFiles(self.graph.nodes_list,"all") + self.writeDumpFile(self.graph.nodes_list,"all") else: nodes = {} for k,v in self.targets.iteritems(): nodes = self.graph.getNodeCloudsIn(v) self.writeConfigFiles(nodes,k) + self.writeDumpFile(nodes,k) nodes = {} def __getFile__(self, nodesFile): @@ -34,12 +36,12 @@ class DomainSelector: resource.close() return data - def writeConfigFiles(self,nodes_level, name): - maxDepth = self.maxDepth(nodes_level) + def writeConfigFiles(self, nodes, name): + maxDepth = self.maxDepth(nodes) for i in range(0,maxDepth): content = 'geo $switch {\n\tdefault\t0;' f = open(self.dataPath+'/'+name+'_node_level'+str(i),'w') - for node in nodes_level.itervalues(): + for node in nodes.itervalues(): if node.stepsToVpn == i: if node.ipv6 and node.hostname: content += '\n\t'+node.ipv6+'\t1;\t #'+node.hostname @@ -49,6 +51,19 @@ class DomainSelector: f.write(content.encode('utf8')) f.close() + def writeDumpFile(self, nodes, name): + content = {} + for node in nodes.itervalues(): + if node.ipv6 and node.hostname: + content[node.nodeid] = { + 'nodeid' : node.nodeid, + 'ipv6' : node.ipv6, + 'hostname' : node.hostname, + 'level' : node.stepsToVpn, + } + with open(self.dataPath+'/'+name+'_node_statistics.json', 'w') as outfile: + json.dump(content, outfile) + def maxDepth(self, nodes): maxDepth = 0 for v in nodes.itervalues(): diff --git a/node_hierarchy.py b/node_hierarchy.py index a4b9d27..7660ce4 100755 --- a/node_hierarchy.py +++ b/node_hierarchy.py @@ -1,7 +1,6 @@ #!/usr/bin/python # -*- coding: utf-8 - #Imports: -import json from domain_selector import DomainSelector targets = { diff --git a/track_statistics.py b/track_statistics.py new file mode 100755 index 0000000..33617c7 --- /dev/null +++ b/track_statistics.py @@ -0,0 +1,90 @@ +#!/usr/bin/python +# -*- coding: utf-8 - +#Imports: +import json +import operator + +class TrackStatistics: + def __init__(self,nodesFile,statisticsFiles, printStatus = False): + self.printStatus = printStatus + self.nodesData = self.__getFile__(nodesFile) + self.statisticsData = [] + for entry in statisticsFiles: + self.statisticsData.append({'data' : self.__getFile__(entry['data']), 'name' : entry['name']}) + #print self.statisticsData + for domain in self.statisticsData: + self.printDomainStatisticsPerLevel(domain['data'], domain['name']) + + def printDomainStatisticsPerLevel(self,data, name = "not set"): + #firmwareVersion = {} + print '-'*50 + print 'Printing statistics for domain:', name + for level in range(0,self.maxDepth(data)): + firmwareVersion = {} + for nodeid, node in data.iteritems(): + if level == node['level']: + fwver = self.nodesData['nodes'][nodeid]['nodeinfo']['software']['firmware']['release'] + if fwver in firmwareVersion: + firmwareVersion[fwver] += 1 + else: + firmwareVersion[fwver] = 1 + print '\tLevel:',level + for k,v in sorted(firmwareVersion.items(), key=operator.itemgetter(1), reverse = True): + print '\t\t '+k+':\t'+str(v) + print '-'*50 + + + + + def maxDepth(self, nodes): + maxDepth = 0 + for v in nodes.itervalues(): + if v['level'] > maxDepth: + maxDepth = v['level'] + return maxDepth+1 + + def __getFile__(self, nodesFile): + if nodesFile.startswith('https://') or nodesFile.startswith('http://'): + if self.printStatus: + print "Download node.json from URL: " + nodesFile + resource = urllib.urlopen(nodesFile) + else: + if self.printStatus: + print "Open node.json file: " + nodesFile + resource = open(nodesFile) + data = json.loads(resource.read()) + resource.close() + return data + +data = [ + { + 'data' : '../domaenensplit_webserver_config/muenster_sued_node_statistics.json', + 'name' : 'Münster Süd' + }, + { + 'data' : '../domaenensplit_webserver_config/muenster_stadt_node_statistics.json', + 'name' : 'Münster Stadt' + }, + { + 'data' : '../domaenensplit_webserver_config/kreis_coesfeld_node_statistics.json', + 'name' : 'Kreis Coesfeld' + }, + { + 'data' : '../domaenensplit_webserver_config/kreis_warendorf_node_statistics.json', + 'name' : 'Kreis Warendorf' + }, + { + 'data' : '../domaenensplit_webserver_config/kreis_steinfurt_ost_node_statistics.json', + 'name' : 'Kreis Steinfurt Ost' + }, + { + 'data' : '../domaenensplit_webserver_config/kreis_steinfurt_west_node_statistics.json', + 'name' : 'Kreis Steinfurt West' + }, + { + 'data' : '../domaenensplit_webserver_config/kreis_borken_node_statistics.json', + 'name' : 'Kreis Borken' + }, +] + +stat = TrackStatistics('nodes.json', data, printStatus = True) \ No newline at end of file From 1d66bb74181114de87d43a1c7567eab93e2eb8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Wed, 23 Dec 2015 22:51:35 +0100 Subject: [PATCH 04/43] Updated json file call from url --- domain_selector.py | 2 +- node_hierarchy.py | 3 ++- track_statistics.py | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/domain_selector.py b/domain_selector.py index 2925cad..c89fca3 100644 --- a/domain_selector.py +++ b/domain_selector.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 - #Imports: -import json +import json, urllib from graph import Graph class DomainSelector: def __init__(self, nodesFile, graphFile, dataPath = './', printStatus = False, targets = None): diff --git a/node_hierarchy.py b/node_hierarchy.py index 7660ce4..ac23bf9 100755 --- a/node_hierarchy.py +++ b/node_hierarchy.py @@ -71,4 +71,5 @@ targets = { ] } -ds = DomainSelector(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) \ No newline at end of file +#ds = DomainSelector(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) +ds = DomainSelector(nodesFile = 'https://freifunk-muensterland.de/map/data/nodes.json', graphFile = 'https://freifunk-muensterland.de/map/data/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) \ No newline at end of file diff --git a/track_statistics.py b/track_statistics.py index 33617c7..a818d54 100755 --- a/track_statistics.py +++ b/track_statistics.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 - #Imports: -import json +import json, urllib import operator class TrackStatistics: @@ -87,4 +87,5 @@ data = [ }, ] -stat = TrackStatistics('nodes.json', data, printStatus = True) \ No newline at end of file +#stat = TrackStatistics('nodes.json', data, printStatus = True) +stat = TrackStatistics('https://freifunk-muensterland.de/map/data/nodes.json', data, printStatus = True) \ No newline at end of file From 330e78c85f636fd7f08b2d1e13ca01e525eba9d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Fri, 8 Jan 2016 17:24:41 +0100 Subject: [PATCH 05/43] Added check for disabled autoupdater and branch --- domain_selector.py | 4 ++-- graph.py | 26 +++++++++++++++++++++++--- node.py | 4 +++- node_hierarchy.py | 11 ++++++++++- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/domain_selector.py b/domain_selector.py index c89fca3..1891e39 100644 --- a/domain_selector.py +++ b/domain_selector.py @@ -4,7 +4,7 @@ import json, urllib from graph import Graph class DomainSelector: - def __init__(self, nodesFile, graphFile, dataPath = './', printStatus = False, targets = None): + def __init__(self, nodesFile, graphFile, dataPath = './', printStatus = False, targets = None, branch = 'stable'): self.printStatus = printStatus self.targets = targets self.nodesData = self.__getFile__(nodesFile) @@ -18,7 +18,7 @@ class DomainSelector: else: nodes = {} for k,v in self.targets.iteritems(): - nodes = self.graph.getNodeCloudsIn(v) + nodes = self.graph.getNodeCloudsIn(v,branch) self.writeConfigFiles(nodes,k) self.writeDumpFile(nodes,k) nodes = {} diff --git a/graph.py b/graph.py index 00fcb56..99fcffc 100644 --- a/graph.py +++ b/graph.py @@ -21,7 +21,7 @@ class Graph: def parseNodes(self): for k,v in self.nodes['nodes'].iteritems(): lat, lon = self.getGeo(k) - node = Node(k, ipv6 = self.getPublicAddress(k), hostname = self.getHostname(k), isOnline = self.getOnlineState(k), lat=lat, lon=lon, coder = self.coder) + node = Node(k, ipv6 = self.getPublicAddress(k), hostname = self.getHostname(k), isOnline = self.getOnlineState(k), lat=lat, lon=lon, coder = self.coder, autoupdater = self.getAutoupdaterStatus(k), branch = self.getBranch(k)) self.nodes_list[k] = node def parseLinks(self): @@ -73,6 +73,22 @@ class Graph: def getHostname(self,node_id): return self.nodes['nodes'][node_id]['nodeinfo']['hostname'] + def getAutoupdaterStatus(self, node_id): + #return True + if 'autoupdater' in self.nodes['nodes'][node_id]['nodeinfo']['software']: + return self.nodes['nodes'][node_id]['nodeinfo']['software']['autoupdater']['enabled'] + else: + #if node is offline for a long time sometimes no autoupdater status can be found + return False + + def getBranch(self, node_id): + #return True + if 'autoupdater' in self.nodes['nodes'][node_id]['nodeinfo']['software']: + return self.nodes['nodes'][node_id]['nodeinfo']['software']['autoupdater']['branch'] + else: + #if node is offline for a long time sometimes no autoupdater status can be found + return None + def getGeo(self, node_id): if 'location' in self.nodes['nodes'][node_id]['nodeinfo'] and 'latitude' in self.nodes['nodes'][node_id]['nodeinfo']['location'] and 'longitude' in self.nodes['nodes'][node_id]['nodeinfo']['location']: return self.nodes['nodes'][node_id]['nodeinfo']['location']['latitude'], self.nodes['nodes'][node_id]['nodeinfo']['location']['longitude'] @@ -90,12 +106,16 @@ class Graph: return self.nodes['nodes'][node_id]['flags']['online'] - def getNodeCloudsIn(self, region): + def getNodeCloudsIn(self, region, branch = 'stable'): results = {} for k,v in self.getAllLevelXNodes(0).iteritems(): if v.geodata != None and v.isOnline == True: if v.isInRegion(region): - results.update(v.getNodeCloud({})) + for ksub,vsub in v.getNodeCloud({}).iteritems(): + if not vsub.autoupdater or vsub.branch != branch: + break + else: + results.update(v.getNodeCloud({})) print "Result:",len(results), region return results diff --git a/node.py b/node.py index 486b937..a67718b 100644 --- a/node.py +++ b/node.py @@ -4,7 +4,7 @@ from geocode import Geocode import time class Node(object): - def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None): + def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None, autoupdater = False, branch = None): self.coder = coder if self.coder == None: self.coder = Geocode(geocoderCache = True, printStatus = True) @@ -15,6 +15,8 @@ class Node(object): self.stepsToVpn = -1 self.isOnline = isOnline self.lastSeen = lastSeen + self.autoupdater = autoupdater + self.branch = branch self._geo = None self.geodata = None if lat != None and lon != None: diff --git a/node_hierarchy.py b/node_hierarchy.py index ac23bf9..abe1170 100755 --- a/node_hierarchy.py +++ b/node_hierarchy.py @@ -68,8 +68,17 @@ targets = { {'village' : u'Südlohn'}, {'town' : u'Velen'}, {'town' : u'Vreden'}, + ], + 'sassenberg' : [ + {'town' : u'Sassenberg'}, + ], + 'telgte' : [ + {'town' : u'Telgte'}, + ], + 'warendorf_stadt' : [ + {'town' : u'Warendorf'}, ] } #ds = DomainSelector(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) -ds = DomainSelector(nodesFile = 'https://freifunk-muensterland.de/map/data/nodes.json', graphFile = 'https://freifunk-muensterland.de/map/data/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) \ No newline at end of file +ds = DomainSelector(nodesFile = 'https://freifunk-muensterland.de/map/data/nodes.json', graphFile = 'https://freifunk-muensterland.de/map/data/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets, branch = 'stable') \ No newline at end of file From bd1798195b7fcb86a009612bcb46ac78efa3323a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sat, 26 Mar 2016 14:29:23 +0100 Subject: [PATCH 06/43] - Added support of GW-mesh-links (Domaene 14) - Added output of nodes without geo or disabled autoupdater - Changed output styling - Several minor changes --- domain_selector.py | 10 ++-- graph.py | 42 ++++++++----- no_coords.py | 116 ++++++++++++++++++++++++++++++++++++ node.py | 3 +- node_hierarchy.py | 143 ++++++++++++++++++++++++--------------------- 5 files changed, 230 insertions(+), 84 deletions(-) create mode 100755 no_coords.py diff --git a/domain_selector.py b/domain_selector.py index 1891e39..5b83fa6 100644 --- a/domain_selector.py +++ b/domain_selector.py @@ -22,6 +22,8 @@ class DomainSelector: self.writeConfigFiles(nodes,k) self.writeDumpFile(nodes,k) nodes = {} + self.writeConfigFiles(self.graph.nodes_no_autoupdater,"no_autoupdater") + self.writeConfigFiles(self.graph.nodes_no_geo,"no_geo") def __getFile__(self, nodesFile): if nodesFile.startswith('https://') or nodesFile.startswith('http://'): @@ -39,14 +41,12 @@ class DomainSelector: def writeConfigFiles(self, nodes, name): maxDepth = self.maxDepth(nodes) for i in range(0,maxDepth): - content = 'geo $switch {\n\tdefault\t0;' + content = 'geo $switch {\n default 0;' f = open(self.dataPath+'/'+name+'_node_level'+str(i),'w') for node in nodes.itervalues(): if node.stepsToVpn == i: if node.ipv6 and node.hostname: - content += '\n\t'+node.ipv6+'\t1;\t #'+node.hostname - #else: - # print node.nodeid + content += '\n '+node.ipv6+' 1; #'+node.hostname content += '\n}' f.write(content.encode('utf8')) f.close() @@ -69,4 +69,4 @@ class DomainSelector: for v in nodes.itervalues(): if v.stepsToVpn > maxDepth: maxDepth = v.stepsToVpn - return maxDepth+1 \ No newline at end of file + return maxDepth+1 diff --git a/graph.py b/graph.py index 99fcffc..bb090e9 100644 --- a/graph.py +++ b/graph.py @@ -13,6 +13,8 @@ class Graph: self.data = graphData self.nodes = nodesData self.nodes_list = {} + self.nodes_no_autoupdater = {} + self.nodes_no_geo = {} self.parseNodes() self.parseLinks() self.calculateStepsToVpn() @@ -21,14 +23,17 @@ class Graph: def parseNodes(self): for k,v in self.nodes['nodes'].iteritems(): lat, lon = self.getGeo(k) - node = Node(k, ipv6 = self.getPublicAddress(k), hostname = self.getHostname(k), isOnline = self.getOnlineState(k), lat=lat, lon=lon, coder = self.coder, autoupdater = self.getAutoupdaterStatus(k), branch = self.getBranch(k)) + node = Node(k, ipv6 = self.getPublicAddress(k), hostname = self.getHostname(k), isOnline = self.getOnlineState(k), lat=lat, lon=lon, coder = self.coder, autoupdater = self.getAutoupdaterStatus(k), branch = self.getBranch(k), isGateway = self.getIsGateway(k)) self.nodes_list[k] = node def parseLinks(self): link_nodes = self.data['batadv']['nodes'] for link in self.data['batadv']['links']: if 'node_id' in link_nodes[link['source']].keys() and 'node_id' in link_nodes[link['target']].keys():#else it is a vpn link - self.setLinkBetween(link_nodes[link['source']]['node_id'], link_nodes[link['target']]['node_id']) + if self.nodes_list[link_nodes[link['source']]['node_id']].isGateway == True or self.nodes_list[link_nodes[link['target']]['node_id']].isGateway: + self.setVpnLink(link['source'], link['target']) + else: + self.setLinkBetween(link_nodes[link['source']]['node_id'], link_nodes[link['target']]['node_id']) else: self.setVpnLink(link['source'], link['target']) @@ -46,11 +51,11 @@ class Graph: } def setVpnLink(self, src, dst): - if 'node_id' not in self.data['batadv']['nodes'][src].keys(): - if self.data['batadv']['nodes'][dst]['node_id']: + if 'node_id' not in self.data['batadv']['nodes'][src].keys() or self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].isGateway == True: + if 'node_id' in self.data['batadv']['nodes'][dst]: self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].stepsToVpn = 0 - elif 'node_id' not in self.data['batadv']['nodes'][dst].keys(): - if self.data['batadv']['nodes'][src]['node_id']: + elif 'node_id' not in self.data['batadv']['nodes'][dst].keys() or self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].isGateway == True: + if 'node_id' in self.data['batadv']['nodes'][src]: self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].stepsToVpn = 0 def calculateStepsToVpn(self): @@ -73,6 +78,9 @@ class Graph: def getHostname(self,node_id): return self.nodes['nodes'][node_id]['nodeinfo']['hostname'] + def getIsGateway(self,node_id): + return self.nodes['nodes'][node_id]['flags']['gateway'] + def getAutoupdaterStatus(self, node_id): #return True if 'autoupdater' in self.nodes['nodes'][node_id]['nodeinfo']['software']: @@ -108,14 +116,22 @@ class Graph: def getNodeCloudsIn(self, region, branch = 'stable'): results = {} + noAuto = False for k,v in self.getAllLevelXNodes(0).iteritems(): - if v.geodata != None and v.isOnline == True: - if v.isInRegion(region): - for ksub,vsub in v.getNodeCloud({}).iteritems(): - if not vsub.autoupdater or vsub.branch != branch: - break - else: - results.update(v.getNodeCloud({})) + if v.isOnline == True: + if v.geodata != None: + if v.isInRegion(region): + noAuto = False + for ksub,vsub in v.getNodeCloud({}).iteritems(): + if not vsub.autoupdater or (branch and vsub.branch != branch): + #break + noAuto = True + self.nodes_no_autoupdater[ksub] = vsub + #else: + if not noAuto: + results.update(v.getNodeCloud({})) + else: + self.nodes_no_geo.update(v.getNodeCloud({})) print "Result:",len(results), region return results diff --git a/no_coords.py b/no_coords.py new file mode 100755 index 0000000..3b9093e --- /dev/null +++ b/no_coords.py @@ -0,0 +1,116 @@ +#!/usr/bin/python +# +# (c) 2016 descilla +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License or any later version. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY. See the +# GNU General Public License for more details. +# +# For a copy of the GNU General Public License +# see . +# +import glob, os, json, collections, argparse, urllib, datetime +from collections import OrderedDict + +class OfflineChecker: + def __init__(self, dataFile): + self.printStatus = False + self.dataSet = self.__getFile__(dataFile) + self.fileNames = [] + self.results = {} + self.addresses = [] + self.getAddressFiles() + self.getFwState() + + def __getFile__(self, nodesFile): + if nodesFile.startswith('https://') or nodesFile.startswith('http://'): + if self.printStatus: + print "Download node.json from URL: " + nodesFile + resource = urllib.urlopen(nodesFile) + else: + if self.printStatus: + print "Open node.json file: " + nodesFile + resource = open(nodesFile) + data = json.loads(resource.read()) + resource.close() + return data + + def getAddressFiles(self): + for file in glob.iglob('./nodes_adresses_*'): + self.addresses.append(self.__getFile__(file)) + + def readFile(self): + fil = 'operate.txt' + results = [] + with open(fil) as lg: + for line in lg: + results.append(line) + return results + + def getNodeAddressItem(self,ipv6): + pub = "" + i = 0 + for adr in self.addresses: + i +=1 + for val in adr['nodes'].itervalues(): + pub = self.getPublicAddress(val) + if pub and pub in ipv6: + if 'owner' in val['nodeinfo']: + return val + + def getNodeItem(self,ipv6): + pub = "" + for val in self.dataSet['nodes'].itervalues(): + pub = self.getPublicAddress(val) + if pub and pub in ipv6: + return val + + def getFwState(self): + lastDay = datetime.datetime.today() - datetime.timedelta(hours = 48) + onlyoldernodes = False + results = {} + for nodeIP in self.readFile(): + nodeAddresses = self.getNodeAddressItem(nodeIP) + node = self.getNodeItem(nodeIP) + if node: + nodeLastSeen = datetime.datetime.strptime(node['lastseen'],'%Y-%m-%dT%H:%M:%S') + if nodeLastSeen < lastDay or onlyoldernodes == False: + au = node['nodeinfo']['software']['autoupdater']['branch'] + loca = 'JA' if 'location' in node['nodeinfo'] else 'NEIN' + if nodeAddresses: + mail = nodeAddresses['nodeinfo']['owner']['contact'] if 'owner' in nodeAddresses['nodeinfo'] else 'NEIN' + #mail = 'JA' if 'owner' in nodeAddresses['nodeinfo'] else 'NEIN' + else: + mail = 'NEIN' + results[node['nodeinfo']['node_id']] = { + 'lastseen' : node['lastseen'], + 'ipv6' : self.getPublicAddress(node), + 'node_id' : node['nodeinfo']['node_id'], + 'name' : node['nodeinfo']['hostname'], + 'contact' : mail, + 'fw_base' : node['nodeinfo']['software']['firmware']['base'], + 'fw_release' : node['nodeinfo']['software']['firmware']['release'], + 'au_enabled' : str(node['nodeinfo']['software']['autoupdater']['enabled']), + 'au_branch' : au, + 'router_modell' : node['nodeinfo']['hardware']['model'], + 'geo' : loca, + } + #print node['lastseen'] + ';' + self.getPublicAddress(node) + ';' + node['nodeinfo']['node_id'] + ';' + node['nodeinfo']['hostname'] + ';' + mail + ';' + node['nodeinfo']['software']['firmware']['base'] + ';' + node['nodeinfo']['software']['firmware']['release'] + ';' + str(node['nodeinfo']['software']['autoupdater']['enabled']) + ';' + au + ';' + node['nodeinfo']['hardware']['model'] + ';' + loca + self.printCSV(results) + def printCSV(self, data): + od = OrderedDict(sorted(data.items(), key=lambda x: x[1]['lastseen'], reverse=True)) + print 'zuletzt online;nodeid;Knotenname;mailaddress;Firmware Base;Firmware Release;Autoupdater;AU-Branch;Router-Modell;geo' + for item in od.itervalues(): + print item['lastseen'] + ';' + item['node_id'] + ';' + item['name'] + ';' + item['contact'] + ';' + item['fw_base'] + ';' + item['fw_release'] + ';' + item['au_enabled'] + ';' + item['au_branch'] + ';' + item['router_modell'] + ';' + item['geo'] + def getPublicAddress(self,node): + if 'addresses' in node['nodeinfo']['network']: + for address in node['nodeinfo']['network']['addresses']: + if address.startswith('2a03'): + return address + return None + +dmax = OfflineChecker('https://service.freifunk-muensterland.de/maps/data/nodes.json') \ No newline at end of file diff --git a/node.py b/node.py index a67718b..632de18 100644 --- a/node.py +++ b/node.py @@ -4,7 +4,7 @@ from geocode import Geocode import time class Node(object): - def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None, autoupdater = False, branch = None): + def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None, autoupdater = False, branch = None, isGateway = False): self.coder = coder if self.coder == None: self.coder = Geocode(geocoderCache = True, printStatus = True) @@ -19,6 +19,7 @@ class Node(object): self.branch = branch self._geo = None self.geodata = None + self.isGateway = isGateway if lat != None and lon != None: self.geo = { 'lat' : lat, diff --git a/node_hierarchy.py b/node_hierarchy.py index abe1170..1c4decb 100755 --- a/node_hierarchy.py +++ b/node_hierarchy.py @@ -8,77 +8,90 @@ targets = { # {'city' : u'Münster'}, # {'county' : u'Münster'}, # ], - 'kreis_warendorf' : [ - {'county' : u'Kreis Warendorf'}, - ], - 'kreis_coesfeld' : [ - {'county' : u'Kreis Coesfeld'}, - ], - 'kreis_steinfurt_west' : [ - {'town' : u'48565'}, - {'village' : u'Wettringen'}, - {'town' : u'Ochtrup'}, - {'village' : u'Metelen'}, - {'town' : u'Horstmar'}, - {'village' : u'Laer'}, - {'village' : u'Nordwalde'}, - {'village' : u'Altenberge'}, - ], - 'kreis_steinfurt_ost' : [ - {'town' : u'Emsdetten'}, - {'town' : u'Neuenkirchen'}, - {'town' : u'Rheine'}, - {'town' : u'Greven'}, - {'village' : u'Ladbergen'}, - {'town' : u'Lengerich'}, - {'town' : u'Tecklenburg'}, - {'village' : u'Lienen'}, - ], - 'muenster_stadt' : [ - {'city_district' : u'Münster-Mitte'}, - {'city_district' : u'Münster-Nord'}, - {'city_district' : u'Münster-Ost'}, - {'suburb' : u'Berg Fidel'}, - {'suburb' : u'Gremmendorf'}, - {'suburb' : u'Mecklenbeck'}, - {'suburb' : u'Gievenbeck'}, - {'suburb' : u'Nienberge'}, - {'suburb' : u'Roxel'}, - {'suburb' : u'Sentruper Höhe'}, - ], - 'muenster_sued' : [ - {'suburb' : u'Amelsbüren'}, - {'suburb' : u'Hiltrup'}, - {'suburb' : u'Albachten'}, - ], - 'kreis_borken' : [ - {'town' : u'Ahaus'}, - {'town' : u'Bocholt'}, - {'town' : u'Borken'}, - {'town' : u'Gescher'}, - {'village' : u'Heek'}, - {'town' : u'Heiden'}, - {'town' : u'Isselburg'}, - {'village' : u'Legden'}, - {'town' : u'Raesfeld'}, - {'town' : u'Reken'}, - {'town' : u'Rhede'}, - {'village' : u'Schöppingen'}, + # 'kreis_warendorf' : [ + # {'county' : u'Kreis Warendorf'}, + # ], + # 'kreis_coesfeld' : [ + # {'county' : u'Kreis Coesfeld'}, + # ], + # 'kreis_steinfurt_west' : [ + # {'town' : u'48565'}, + # {'village' : u'Wettringen'}, + # {'town' : u'Ochtrup'}, + # {'village' : u'Metelen'}, + # {'town' : u'Horstmar'}, + # {'village' : u'Laer'}, + # {'village' : u'Nordwalde'}, + # {'village' : u'Altenberge'}, + # ], + # 'kreis_steinfurt_ost' : [ + # {'town' : u'Emsdetten'}, + # {'town' : u'Neuenkirchen'}, + # {'town' : u'Rheine'}, + # {'town' : u'Greven'}, + # {'village' : u'Ladbergen'}, + # {'town' : u'Lengerich'}, + # {'town' : u'Tecklenburg'}, + # {'village' : u'Lienen'}, + # ], + # 'muenster_stadt' : [ + # {'city_district' : u'Münster-Mitte'}, + # {'city_district' : u'Münster-Nord'}, + # {'city_district' : u'Münster-Ost'}, + # {'suburb' : u'Berg Fidel'}, + # {'suburb' : u'Gremmendorf'}, + # {'suburb' : u'Mecklenbeck'}, + # {'suburb' : u'Gievenbeck'}, + # {'suburb' : u'Nienberge'}, + # {'suburb' : u'Roxel'}, + # {'suburb' : u'Sentruper Höhe'}, + # ], + # 'muenster_sued' : [ + # {'suburb' : u'Amelsbüren'}, + # {'suburb' : u'Hiltrup'}, + # {'suburb' : u'Albachten'}, + # ], + # 'kreis_borken' : [ + # {'town' : u'Ahaus'}, + # {'town' : u'Bocholt'}, + # {'town' : u'Borken'}, + # {'town' : u'Gescher'}, + # {'village' : u'Heek'}, + # {'town' : u'Heiden'}, + # {'town' : u'Isselburg'}, + # {'village' : u'Legden'}, + # {'town' : u'Raesfeld'}, + # {'town' : u'Reken'}, + # {'town' : u'Rhede'}, + # {'village' : u'Schöppingen'}, + # {'town' : u'Stadtlohn'}, + # {'village' : u'Südlohn'}, + # {'town' : u'Velen'}, + # {'town' : u'Vreden'}, + # ], + # 'sassenberg' : [ + # {'town' : u'Sassenberg'}, + # ], + # 'telgte' : [ + # {'town' : u'Telgte'}, + # ], + # 'warendorf_stadt' : [ + # {'town' : u'Warendorf'}, + # ] + 'stadt_stadtlohn' : [ {'town' : u'Stadtlohn'}, - {'village' : u'Südlohn'}, - {'town' : u'Velen'}, - {'town' : u'Vreden'}, ], - 'sassenberg' : [ - {'town' : u'Sassenberg'}, + 'stadt_bocholt' : [ + {'town' : u'Bocholt'}, ], - 'telgte' : [ + 'stadt_telgte' : [ {'town' : u'Telgte'}, ], - 'warendorf_stadt' : [ + 'stadt_warendorf' : [ {'town' : u'Warendorf'}, - ] + ], } #ds = DomainSelector(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) -ds = DomainSelector(nodesFile = 'https://freifunk-muensterland.de/map/data/nodes.json', graphFile = 'https://freifunk-muensterland.de/map/data/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets, branch = 'stable') \ No newline at end of file +#ds = DomainSelector(nodesFile = 'https://service.freifunk-muensterland.de/maps/data_legacy/nodes.json', graphFile = 'https://service.freifunk-muensterland.de/maps/data_legacy/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets, branch = None) +ds = DomainSelector(nodesFile = 'https://service.freifunk-muensterland.de/maps/data/nodes.json', graphFile = 'https://service.freifunk-muensterland.de/maps/data/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets, branch = None) From e051d64780ff424c73dabad33d40e870bb4c3168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 27 Mar 2016 19:15:16 +0200 Subject: [PATCH 07/43] Handle with IDs, which are not appear in nodes list --- graph.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/graph.py b/graph.py index bb090e9..39dad55 100644 --- a/graph.py +++ b/graph.py @@ -29,7 +29,7 @@ class Graph: def parseLinks(self): link_nodes = self.data['batadv']['nodes'] for link in self.data['batadv']['links']: - if 'node_id' in link_nodes[link['source']].keys() and 'node_id' in link_nodes[link['target']].keys():#else it is a vpn link + if 'node_id' in link_nodes[link['source']] and 'node_id' in link_nodes[link['target']]:#else it is a vpn link if self.nodes_list[link_nodes[link['source']]['node_id']].isGateway == True or self.nodes_list[link_nodes[link['target']]['node_id']].isGateway: self.setVpnLink(link['source'], link['target']) else: @@ -51,12 +51,12 @@ class Graph: } def setVpnLink(self, src, dst): - if 'node_id' not in self.data['batadv']['nodes'][src].keys() or self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].isGateway == True: - if 'node_id' in self.data['batadv']['nodes'][dst]: - self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].stepsToVpn = 0 - elif 'node_id' not in self.data['batadv']['nodes'][dst].keys() or self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].isGateway == True: - if 'node_id' in self.data['batadv']['nodes'][src]: - self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].stepsToVpn = 0 + if 'node_id' not in self.data['batadv']['nodes'][src] or (self.data['batadv']['nodes'][src]['node_id'] and self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].isGateway == True): + if 'node_id' in self.data['batadv']['nodes'][dst] and self.data['batadv']['nodes'][dst]['node_id']: + self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].stepsToVpn = 0 + elif 'node_id' not in self.data['batadv']['nodes'][dst] or (self.data['batadv']['nodes'][dst]['node_id'] and self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].isGateway == True): + if 'node_id' in self.data['batadv']['nodes'][src] and self.data['batadv']['nodes'][src]['node_id']: + self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].stepsToVpn = 0 def calculateStepsToVpn(self): for node in self.nodes_list.itervalues(): From c6a167dde5533f4cb8f35fa2b3cc888df63bc1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 29 Mar 2016 00:30:02 +0200 Subject: [PATCH 08/43] Updated node_hierarchy configuration - Added json file for target configuration - Added arguments handling for commandline - Added some error handlings - Several other minor changes --- .gitignore | 4 ++ README.md | 46 ++++++++++++++++ domain_selector.py | 24 ++++++-- get_state.py | 100 ++++++++++++++++++++++++++++++++++ hieraException.py | 7 +++ node_hierarchy.py | 133 +++++++++++++++------------------------------ targets.json | 75 +++++++++++++++++++++++++ 7 files changed, 294 insertions(+), 95 deletions(-) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 get_state.py create mode 100644 hieraException.py create mode 100644 targets.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3423407 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +nodes_* +*.pyc +geo-cache/ +contact/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..053f1c6 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# Knoten Migrationstool +Dieses Tool dient zur Generierung von nginx-Konfigurationsdateien für die Migration von Knoten von einer Domäne in eine andere Domäne. Dabei wird berücksichtigt, welche Knoten von anderen Knoten abhängen um ins Internet zu kommen. + +## Konfiguration +In der ``targets``-Datei werden Domänen (oder ähnliche Ziele) definiert. Hierbei handelt es sich um eine JSON-Datei. Dabei werden dort Gebietsrelationen für den Nominatik-Geocoder eingetragen. + +## Aufruf +Es muss eine Datei mit den ``targets`` existieren. + +Im einfachsten Fall wird das Programm dann wie folgt aufgerufen: +``` +./node_hierarcy.py --all +``` + +Sollen spezielle ``nodes.json`` und ``graph.json`` Dateien verwendet werden, so kann der Datenpfad wie folgt angegeben werden (dabei kann es sich um einen lokalen Dateipfad als auch um eine http oder https URL handel): + +``` +./node_hierarcy.py --all --json-path https://service.freifunk-muensterland.de/maps/data/ +``` + +Eine Ausgabe des Fortschritts erhält man mit dem Schalter ``-p`` oder ``--print-status``: + +``` +./node_hierarcy.py --all -p +``` + +Eine Limitierung auf eine Auswahl an Targets aus der Targets-Datei kann mit dem Schalter ``-t`` oder ``--targets`` vorgenommen werden: +``` +./node_hierarcy.py -t domaene_01 domaene_02 --print-status +``` + +Weitere Hilfestellungen erhält mann mit ``-h`` oder ``--help``: +``` +./node_hierarcy.py +``` + +### Ein- und Ausgabe +Standardmäßig wird eine Datei ``targets.json`` erwartet. Soll diese Datei von einer anderen Stelle aufgerufen werden kann das ``--targets-file``-Argument verwendet werden: +``` +./node_hierarcy.py --targets-file /root/targets.json +``` + +Standardmäßig erfolgt die Ausgabe der generierten nginx-Konfigurationsdateien in das Verzeichnis ``./webserver-configuration/``. Das kann mit dem Schalter ``--out-path`` geändert werden: +``` +./node_hierarcy.py --out-path /root/config/ +``` \ No newline at end of file diff --git a/domain_selector.py b/domain_selector.py index 5b83fa6..76c0f55 100644 --- a/domain_selector.py +++ b/domain_selector.py @@ -1,10 +1,16 @@ #!/usr/bin/python # -*- coding: utf-8 - #Imports: -import json, urllib +import json, urllib, os from graph import Graph +from hieraException import HieraException + class DomainSelector: def __init__(self, nodesFile, graphFile, dataPath = './', printStatus = False, targets = None, branch = 'stable'): + if not os.path.isdir(dataPath): + print "\033[91mError:\033[0m Output folder was not found or is not writable. Given path:", dataPath + raise HieraException + self.printStatus = printStatus self.targets = targets self.nodesData = self.__getFile__(nodesFile) @@ -28,21 +34,27 @@ class DomainSelector: def __getFile__(self, nodesFile): if nodesFile.startswith('https://') or nodesFile.startswith('http://'): if self.printStatus: - print "Download node.json from URL: " + nodesFile + print 'Download', nodesFile.rsplit('/', 1)[1] , 'from URL:', nodesFile resource = urllib.urlopen(nodesFile) else: if self.printStatus: - print "Open node.json file: " + nodesFile + print 'Open', nodesFile.rsplit('/', 1)[1] , 'from file:', nodesFile resource = open(nodesFile) - data = json.loads(resource.read()) - resource.close() + try: + data = json.loads(resource.read()) + except: + print "\033[91mError:\033[0m Error while parsing a json file (perhapes misformed file): ", nodesFile + raise HieraException + finally: + resource.close() + return data def writeConfigFiles(self, nodes, name): maxDepth = self.maxDepth(nodes) for i in range(0,maxDepth): content = 'geo $switch {\n default 0;' - f = open(self.dataPath+'/'+name+'_node_level'+str(i),'w') + f = open(self.dataPath.rstrip('/')+'/'+name+'_node_level'+str(i),'w') for node in nodes.itervalues(): if node.stepsToVpn == i: if node.ipv6 and node.hostname: diff --git a/get_state.py b/get_state.py new file mode 100644 index 0000000..c8b53e5 --- /dev/null +++ b/get_state.py @@ -0,0 +1,100 @@ +#!/usr/bin/python +# +# (c) 2016 descilla +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License or any later version. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY. See the +# GNU General Public License for more details. +# +# For a copy of the GNU General Public License +# see . +# +import glob, os, json, collections, argparse, urllib + +class OfflineChecker: + def __init__(self, fileName): + self.printStatus = True + self.fileNames = [] + self.results = {} + self.data = self.__getFile__(fileName) + self.addresses = self.__getFile__('nodes_legacy_adresses.json') + self.addressesOld = self.__getFile__('nodes_legacy_adresses_old.json') + self.parseJson(self.data) + self.getFwState() + #self.printResults() + + def __getFile__(self, nodesFile): + if nodesFile.startswith('https://') or nodesFile.startswith('http://'): + if self.printStatus: + print "Download node.json from URL: " + nodesFile + resource = urllib.urlopen(nodesFile) + else: + if self.printStatus: + print "Open node.json file: " + nodesFile + resource = open(nodesFile) + data = json.loads(resource.read()) + resource.close() + return data + + def searchInLog(self, key, arg): + files = ['/var/log/nginx/access.log', '/var/log/nginx/access.log.1'] + for fil in files: + with open(fil) as lg: + for line in lg: + if key and key in line: + if arg in line: + date = line.split('[')[1].split(']')[0] + dest_dom = line.split('gluon-')[1].split('-')[0] + return date, dest_dom + return None, None + + def parseJson(self, data): + nodes_online = 0 + users_online = 0 + day_stamp = data['timestamp'].split('T')[0] + for key, node in data['nodes'].iteritems(): + if 'statistics' in node: + users_online += node['statistics']['clients'] + if 'flags' in node: + if node['flags']['online'] == False: + if 'system' in node['nodeinfo']: + siteCode = node['nodeinfo']['system']['site_code'] + if siteCode not in self.results: + self.results[siteCode] = {} + self.results[siteCode][key] = { + 'lastseen' : node['lastseen'], + 'id' : key, + 'mac' : node['nodeinfo']['network']['mac'], + 'pub_v6' : self.getPublicAddress(node), + 'name' : node['nodeinfo']['hostname'] + } + + def getFwState(self): + print 'fw_geladen\tlastseen\tziel_dom\tipv6_adresse\tnodeid\thostname\tmailaddress' + for node, val in self.results['ffms'].iteritems(): + date, dest_dom = self.searchInLog(val['pub_v6'], "sysupgrade.bin") + if date and dest_dom: + #mail = self.addresses['nodes'][node]['nodeinfo']['owner']['contact'] if node in self.addresses['nodes'] and 'owner' in self.addresses['nodes'][node]['nodeinfo'] else '' + mail = 'JA' if (node in self.addresses['nodes'] and 'owner' in self.addresses['nodes'][node]['nodeinfo']) or (node in self.addressesOld['nodes'] and 'owner' in self.addressesOld['nodes'][node]['nodeinfo']) else 'NEIN' + print date +'\t'+ val['lastseen'] + '\t' + dest_dom + '\t' + val['pub_v6'] + '\t' + node + '\t' + val['name'] + '\t' + mail + + + def printResults(self): + ordered = collections.OrderedDict(sorted(self.results.items())) + print "date\tnodes_online\tusers_online" + for k,v in ordered.iteritems(): + print k+'\t'+str(v['nodes_online'])+'\t'+str(v['users_online']) + + + def getPublicAddress(self,node): + if 'addresses' in node['nodeinfo']['network']: + for address in node['nodeinfo']['network']['addresses']: + if address.startswith('2a03'): + return address + return None + +dmax = OfflineChecker('http://karte.freifunk-muensterland.org/data/nodes.json') \ No newline at end of file diff --git a/hieraException.py b/hieraException.py new file mode 100644 index 0000000..bab98ce --- /dev/null +++ b/hieraException.py @@ -0,0 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 - +#Imports: + + +class HieraException(Exception): + pass \ No newline at end of file diff --git a/node_hierarchy.py b/node_hierarchy.py index 1c4decb..ae4db5a 100755 --- a/node_hierarchy.py +++ b/node_hierarchy.py @@ -1,97 +1,52 @@ #!/usr/bin/python # -*- coding: utf-8 - #Imports: +import argparse, json, sys from domain_selector import DomainSelector +from hieraException import HieraException + +parser = argparse.ArgumentParser(description='This Script generates a hierarchical nodes list for node migration using nginx geo feature.') +parser.add_argument('--json-path', required=False, default='https://service.freifunk-muensterland.de/maps/data/', help='Path of nodes.json and graph.json (can be local folder or remote URL).') +parser.add_argument('--targets-file', required=False, help='Json file of targets for nominatim geocoder.', default='./targets.json') +parser.add_argument('-t', '--targets', nargs='*', required=False, help='List of target names from target-file which should be proceeded. Example: -t citya -t cityb ...') +parser.add_argument('-a', '--all', '--all-targets', required=False, help='Proceed all targets from targets file.', action='store_true') +parser.add_argument('--out-path', required=False, help='Directory where the generated Output should stored.', default='./webserver-configuration/') +parser.add_argument('--only-specific-branch', required=False, help='Only attend nodes from specific branch.', default=None) +parser.add_argument('-p', '--print-status', required=False, action='store_true', help='Print Status (like geocoder tasks).') +args = parser.parse_args() + +def prepareTargets(args): + + resource = open(args.targets_file) + targets = json.loads(resource.read()) + resource.close() + + if len(targets) == 0: + print "\033[91mError:\033[0m No targets were found in targets file." + sys.exit(1) + if args.all == True: + return targets + elif args.targets == None or len(args.targets) == 0: + print "\033[91mError:\033[0m No target was given as argument and even --all switch was not enabled." + sys.exit(1) + else: + specific_targets = {} + for k, v in targets.iteritems(): + if k in args.targets: + specific_targets[k] = v + return specific_targets + + + +print args + +targets = prepareTargets(args) + -targets = { -# 'muenster' : [ -# {'city' : u'Münster'}, -# {'county' : u'Münster'}, -# ], - # 'kreis_warendorf' : [ - # {'county' : u'Kreis Warendorf'}, - # ], - # 'kreis_coesfeld' : [ - # {'county' : u'Kreis Coesfeld'}, - # ], - # 'kreis_steinfurt_west' : [ - # {'town' : u'48565'}, - # {'village' : u'Wettringen'}, - # {'town' : u'Ochtrup'}, - # {'village' : u'Metelen'}, - # {'town' : u'Horstmar'}, - # {'village' : u'Laer'}, - # {'village' : u'Nordwalde'}, - # {'village' : u'Altenberge'}, - # ], - # 'kreis_steinfurt_ost' : [ - # {'town' : u'Emsdetten'}, - # {'town' : u'Neuenkirchen'}, - # {'town' : u'Rheine'}, - # {'town' : u'Greven'}, - # {'village' : u'Ladbergen'}, - # {'town' : u'Lengerich'}, - # {'town' : u'Tecklenburg'}, - # {'village' : u'Lienen'}, - # ], - # 'muenster_stadt' : [ - # {'city_district' : u'Münster-Mitte'}, - # {'city_district' : u'Münster-Nord'}, - # {'city_district' : u'Münster-Ost'}, - # {'suburb' : u'Berg Fidel'}, - # {'suburb' : u'Gremmendorf'}, - # {'suburb' : u'Mecklenbeck'}, - # {'suburb' : u'Gievenbeck'}, - # {'suburb' : u'Nienberge'}, - # {'suburb' : u'Roxel'}, - # {'suburb' : u'Sentruper Höhe'}, - # ], - # 'muenster_sued' : [ - # {'suburb' : u'Amelsbüren'}, - # {'suburb' : u'Hiltrup'}, - # {'suburb' : u'Albachten'}, - # ], - # 'kreis_borken' : [ - # {'town' : u'Ahaus'}, - # {'town' : u'Bocholt'}, - # {'town' : u'Borken'}, - # {'town' : u'Gescher'}, - # {'village' : u'Heek'}, - # {'town' : u'Heiden'}, - # {'town' : u'Isselburg'}, - # {'village' : u'Legden'}, - # {'town' : u'Raesfeld'}, - # {'town' : u'Reken'}, - # {'town' : u'Rhede'}, - # {'village' : u'Schöppingen'}, - # {'town' : u'Stadtlohn'}, - # {'village' : u'Südlohn'}, - # {'town' : u'Velen'}, - # {'town' : u'Vreden'}, - # ], - # 'sassenberg' : [ - # {'town' : u'Sassenberg'}, - # ], - # 'telgte' : [ - # {'town' : u'Telgte'}, - # ], - # 'warendorf_stadt' : [ - # {'town' : u'Warendorf'}, - # ] - 'stadt_stadtlohn' : [ - {'town' : u'Stadtlohn'}, - ], - 'stadt_bocholt' : [ - {'town' : u'Bocholt'}, - ], - 'stadt_telgte' : [ - {'town' : u'Telgte'}, - ], - 'stadt_warendorf' : [ - {'town' : u'Warendorf'}, - ], -} #ds = DomainSelector(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) #ds = DomainSelector(nodesFile = 'https://service.freifunk-muensterland.de/maps/data_legacy/nodes.json', graphFile = 'https://service.freifunk-muensterland.de/maps/data_legacy/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets, branch = None) -ds = DomainSelector(nodesFile = 'https://service.freifunk-muensterland.de/maps/data/nodes.json', graphFile = 'https://service.freifunk-muensterland.de/maps/data/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets, branch = None) +try: + ds = DomainSelector(nodesFile = args.json_path.rstrip('/')+'/nodes.json', graphFile = args.json_path.rstrip('/')+'/graph.json', printStatus = args.print_status, dataPath = args.out_path, targets = targets, branch = args.only_specific_branch) +except HieraException: + print "\033[93mFailed:\033[0m Process was interrupted by HieraException-Exception (see error messages above)." \ No newline at end of file diff --git a/targets.json b/targets.json new file mode 100644 index 0000000..bde6619 --- /dev/null +++ b/targets.json @@ -0,0 +1,75 @@ +{ + "domaene_01" : [ + {"city_district" : "Münster-Mitte"}, + {"city_district" : "Münster-Nord"}, + {"city_district" : "Münster-Ost"}, + {"suburb" : "Berg Fidel"}, + {"suburb" : "Gremmendorf"}, + {"suburb" : "Mecklenbeck"}, + {"suburb" : "Gievenbeck"}, + {"suburb" : "Nienberge"}, + {"suburb" : "Roxel"}, + {"suburb" : "Sentruper Höhe"} + ], + "domaene_02" : [ + {"county" : "Kreis Coesfeld"} + ], + "domaene_03" : [ + {"town" : "48565"}, + {"village" : "Wettringen"}, + {"town" : "Ochtrup"}, + {"village" : "Metelen"}, + {"town" : "Horstmar"}, + {"village" : "Laer"}, + {"village" : "Nordwalde"}, + {"village" : "Altenberge"} + ], + "domaene_04" : [ + {"town" : "Emsdetten"}, + {"town" : "Neuenkirchen"}, + {"town" : "Rheine"}, + {"town" : "Greven"}, + {"village" : "Ladbergen"}, + {"town" : "Lengerich"}, + {"town" : "Tecklenburg"}, + {"village" : "Lienen"} + ], + "domaene_05" : [ + {"suburb" : "Amelsbüren"}, + {"suburb" : "Hiltrup"}, + {"suburb" : "Albachten"} + ], + "domaene_06" : [ + {"town" : "Ahaus"}, + {"town" : "Bocholt"}, + {"town" : "Borken"}, + {"town" : "Gescher"}, + {"village" : "Heek"}, + {"town" : "Heiden"}, + {"town" : "Isselburg"}, + {"village" : "Legden"}, + {"town" : "Raesfeld"}, + {"town" : "Reken"}, + {"town" : "Rhede"}, + {"village" : "Schöppingen"}, + {"town" : "Stadtlohn"}, + {"village" : "Südlohn"}, + {"town" : "Velen"}, + {"town" : "Vreden"} + ], + "domaene_07" : [ + {"town" : "Telgte"} + ], + "domaene_09" : [ + {"town" : "Stadtlohn"} + ], + "domaene_11" : [ + {"town" : "Bocholt"} + ], + "stadt_warendorf" : [ + {"town" : "Warendorf"} + ], + "domaene_14" : [ + {"county" : "Kreis Warendorf"} + ] +} \ No newline at end of file From fac219a7acca43025b4f206d3c15627f124c0a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 29 Mar 2016 17:59:35 +0200 Subject: [PATCH 09/43] Updated mechanism for generating output for nodes with disabled autoupdater or no geoinformations --- domain_selector.py | 37 +++++++++++++++++++++++-------------- graph.py | 38 +++++++++++++++++++++++++++++--------- node_hierarchy.py | 8 -------- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/domain_selector.py b/domain_selector.py index 76c0f55..6464466 100644 --- a/domain_selector.py +++ b/domain_selector.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 - #Imports: -import json, urllib, os +import json, urllib, os, glob from graph import Graph from hieraException import HieraException @@ -13,9 +13,11 @@ class DomainSelector: self.printStatus = printStatus self.targets = targets + self.dataPath = dataPath.rstrip('/') self.nodesData = self.__getFile__(nodesFile) self.graphData = self.__getFile__(graphFile) - self.dataPath = dataPath + + self.__prepareOutDir__() self.graph = Graph(self.nodesData, self.graphData) if self.targets == None: @@ -28,8 +30,14 @@ class DomainSelector: self.writeConfigFiles(nodes,k) self.writeDumpFile(nodes,k) nodes = {} - self.writeConfigFiles(self.graph.nodes_no_autoupdater,"no_autoupdater") - self.writeConfigFiles(self.graph.nodes_no_geo,"no_geo") + self.writeConfigFiles(self.graph.getProblemNodes(noAutoupdater = True),"no_autoupdater") + self.writeConfigFiles(self.graph.getProblemNodes(noGeodata = True),"no_geo") + self.writeConfigFiles(self.graph.getProblemNodes(noGeodata = True, noAutoupdater = True),"no_nothing") + + def __prepareOutDir__(self): + files = glob.glob(self.dataPath+'/*') + for f in files: + os.remove(f) def __getFile__(self, nodesFile): if nodesFile.startswith('https://') or nodesFile.startswith('http://'): @@ -52,16 +60,17 @@ class DomainSelector: def writeConfigFiles(self, nodes, name): maxDepth = self.maxDepth(nodes) - for i in range(0,maxDepth): - content = 'geo $switch {\n default 0;' - f = open(self.dataPath.rstrip('/')+'/'+name+'_node_level'+str(i),'w') - for node in nodes.itervalues(): - if node.stepsToVpn == i: - if node.ipv6 and node.hostname: - content += '\n '+node.ipv6+' 1; #'+node.hostname - content += '\n}' - f.write(content.encode('utf8')) - f.close() + if len(nodes) > 0: + for i in range(0,maxDepth): + content = 'geo $switch {\n default 0;' + f = open(self.dataPath.rstrip('/')+'/'+name+'_node_level'+str(i),'w') + for node in nodes.itervalues(): + if node.stepsToVpn == i: + if node.ipv6 and node.hostname: + content += '\n '+node.ipv6+' 1; #'+node.hostname + content += '\n}' + f.write(content.encode('utf8')) + f.close() def writeDumpFile(self, nodes, name): content = {} diff --git a/graph.py b/graph.py index 39dad55..c5ba268 100644 --- a/graph.py +++ b/graph.py @@ -113,25 +113,45 @@ class Graph: def getOnlineState(self,node_id): return self.nodes['nodes'][node_id]['flags']['online'] + def getProblemNodes(self, noAutoupdater = False, noGeodata = False, online = True): + results = {} + for k,v in self.nodes_list.iteritems(): + if v.isOnline or online == False: + if noAutoupdater and noGeodata: + if not v.autoupdater and not v.geodata: + results[k] = v + elif noAutoupdater: + if v.autoupdater and v.geodata: + results[k] = v + elif noGeodata: + if not v.geodata and v.autoupdater: + results[k] = v + return results + def getNodeCloudsIn(self, region, branch = 'stable'): results = {} - noAuto = False +# noAuto = False for k,v in self.getAllLevelXNodes(0).iteritems(): if v.isOnline == True: if v.geodata != None: if v.isInRegion(region): - noAuto = False for ksub,vsub in v.getNodeCloud({}).iteritems(): if not vsub.autoupdater or (branch and vsub.branch != branch): - #break - noAuto = True - self.nodes_no_autoupdater[ksub] = vsub - #else: - if not noAuto: + break + else: results.update(v.getNodeCloud({})) - else: - self.nodes_no_geo.update(v.getNodeCloud({})) +# noAuto = False +# for ksub,vsub in v.getNodeCloud({}).iteritems(): +# if not vsub.autoupdater or (branch and vsub.branch != branch): +# #break +# noAuto = True +# self.nodes_no_autoupdater[ksub] = vsub +# #else: +# if not noAuto: +# results.update(v.getNodeCloud({})) +# else: +# self.nodes_no_geo.update(v.getNodeCloud({})) print "Result:",len(results), region return results diff --git a/node_hierarchy.py b/node_hierarchy.py index ae4db5a..6411ba4 100755 --- a/node_hierarchy.py +++ b/node_hierarchy.py @@ -36,16 +36,8 @@ def prepareTargets(args): specific_targets[k] = v return specific_targets - - -print args - targets = prepareTargets(args) - - -#ds = DomainSelector(nodesFile = 'nodes.json', graphFile = 'graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets) -#ds = DomainSelector(nodesFile = 'https://service.freifunk-muensterland.de/maps/data_legacy/nodes.json', graphFile = 'https://service.freifunk-muensterland.de/maps/data_legacy/graph.json', printStatus = True, dataPath = '../domaenensplit_webserver_config/', targets = targets, branch = None) try: ds = DomainSelector(nodesFile = args.json_path.rstrip('/')+'/nodes.json', graphFile = args.json_path.rstrip('/')+'/graph.json', printStatus = args.print_status, dataPath = args.out_path, targets = targets, branch = args.only_specific_branch) except HieraException: From 222bd388a3cb86d5b589f46c0e661a0fa502c65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 3 Apr 2016 13:14:51 +0200 Subject: [PATCH 10/43] Removed comments. Fixed minor issue. --- graph.py | 11 ----------- node.py | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/graph.py b/graph.py index c5ba268..7492ed0 100644 --- a/graph.py +++ b/graph.py @@ -141,17 +141,6 @@ class Graph: break else: results.update(v.getNodeCloud({})) -# noAuto = False -# for ksub,vsub in v.getNodeCloud({}).iteritems(): -# if not vsub.autoupdater or (branch and vsub.branch != branch): -# #break -# noAuto = True -# self.nodes_no_autoupdater[ksub] = vsub -# #else: -# if not noAuto: -# results.update(v.getNodeCloud({})) -# else: -# self.nodes_no_geo.update(v.getNodeCloud({})) print "Result:",len(results), region return results diff --git a/node.py b/node.py index 632de18..1fbe8ef 100644 --- a/node.py +++ b/node.py @@ -105,4 +105,4 @@ class Node(object): if result['cached'] == False: time.sleep(1) else: - self['geodata'] = None \ No newline at end of file + self.getodata = None \ No newline at end of file From 1eb13ac4e6368458c866d02ce696e4d89704ef6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 3 Apr 2016 13:27:17 +0200 Subject: [PATCH 11/43] Added domaene_08, domaene_12 and domaene_13 to targets.json --- targets.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/targets.json b/targets.json index bde6619..c97c0a6 100644 --- a/targets.json +++ b/targets.json @@ -60,16 +60,32 @@ "domaene_07" : [ {"town" : "Telgte"} ], + "domaene_08" : [ + {"town" : "Gescher"} + ], "domaene_09" : [ {"town" : "Stadtlohn"} ], "domaene_11" : [ {"town" : "Bocholt"} ], + "domaene_12" : [ + { + "town" : "Dülmen", + "suburb" : "Mitte" + }, + {"suburb" : "Hausdülmen"}, + {"suburb" : "Merfeld"}, + {"suburb" : "Buldern"}, + {"suburb" : "Hiddingsel"} + ], + "domaene_13" : [ + {"suburb" : "Rorup"} + ], "stadt_warendorf" : [ {"town" : "Warendorf"} ], "domaene_14" : [ {"county" : "Kreis Warendorf"} ] -} \ No newline at end of file +} From 225bbfaec918b7ef63893403848e3cceaa57a6b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Fri, 29 Apr 2016 16:09:52 +0200 Subject: [PATCH 12/43] Initial commit --- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9cecc1d --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From 500f0a6047cf0c2244839b18ae6d1cabecd02117 Mon Sep 17 00:00:00 2001 From: "Matthias P. Walther" Date: Thu, 26 May 2016 13:35:13 +0200 Subject: [PATCH 13/43] =?UTF-8?q?=20-=20neue=20Dom=C3=A4nen=20in=20targets?= =?UTF-8?q?=20eingetragen,=20Kreis=20Stinfurt=20West=20(23)=20und=20Kreis?= =?UTF-8?q?=20Steinfurt=20Ost=20(25)=20fehlen=20noch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- targets.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/targets.json b/targets.json index c97c0a6..a48d057 100644 --- a/targets.json +++ b/targets.json @@ -87,5 +87,35 @@ ], "domaene_14" : [ {"county" : "Kreis Warendorf"} + ], + "domaene_17" : [ + {"town" : "Emsdetten"} + ], + "domaene_18" : [ + {"city" : "Greven"} + ], + "domaene_19" : [ + {"town" : "Neuenkirchen"} + ], + "domaene_20" : [ + {"town" : "Emsdetten"} + ], + "domaene_21" : [ + {"city" : "Rheine"} + ], + "domaene_22" : [ + {"city" : "Steinfurt"} + ], + "domaene_24" : [ + {"town" : "Wettringen"} + ], + "domaene_25" : [ + {"town" : "Emsdetten"} + ], + "domaene_26" : [ + {"city" : "Borken"} + ], + "domaene_27" : [ + {"city" : "Selm"} ] } From c760b3779a6f9b8b0cae691180628d4beb6825da Mon Sep 17 00:00:00 2001 From: "Matthias P. Walther" Date: Thu, 26 May 2016 21:52:49 +0200 Subject: [PATCH 14/43] =?UTF-8?q?=20-=20Dom=C3=A4nen=20Steinfurt-West=20un?= =?UTF-8?q?d=20-Ost=20eingeteilt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- targets.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/targets.json b/targets.json index a48d057..119c540 100644 --- a/targets.json +++ b/targets.json @@ -106,11 +106,22 @@ "domaene_22" : [ {"city" : "Steinfurt"} ], + "domaene_23" : [ + {"town" : "Altenberge"}, + {"town" : "Horstmar"}, + {"town" : "Laer"}, + {"town" : "Metelen"}, + {"town" : "Nordwalde"} + ], "domaene_24" : [ {"town" : "Wettringen"} ], "domaene_25" : [ - {"town" : "Emsdetten"} + {"city" : "Ibbenbüren"}, + {"town" : "Ladbergen"}, + {"town" : "Lengerich"}, + {"town" : "Lienen"}, + {"town" : "Tecklenburg"} ], "domaene_26" : [ {"city" : "Borken"} From 718237ad95b7b9dc71eb19c9d82db35a856acf19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Thu, 26 May 2016 23:45:43 +0200 Subject: [PATCH 15/43] Added target for domaene 16 --- targets.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/targets.json b/targets.json index 119c540..d8b5c9b 100644 --- a/targets.json +++ b/targets.json @@ -88,6 +88,9 @@ "domaene_14" : [ {"county" : "Kreis Warendorf"} ], + "domaene_16" : [ + {"suburb" : "Altstadt"} + ], "domaene_17" : [ {"town" : "Emsdetten"} ], From c739e566767bfd4f906477c017720b4827660801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Thu, 26 May 2016 23:46:43 +0200 Subject: [PATCH 16/43] Ignore Clouds with LAN mesh links in it --- graph.py | 71 ++++++-- node.py | 5 +- .../domaene_01_node_level0 | 151 +++++++++++++++ .../domaene_01_node_level1 | 25 +++ .../domaene_01_node_level2 | 4 + .../domaene_01_node_statistics.json | 1 + .../domaene_02_node_statistics.json | 1 + .../domaene_03_node_statistics.json | 1 + .../domaene_04_node_statistics.json | 1 + .../domaene_05_node_statistics.json | 1 + .../domaene_06_node_statistics.json | 1 + .../domaene_07_node_statistics.json | 1 + .../domaene_08_node_statistics.json | 1 + .../domaene_09_node_statistics.json | 1 + .../domaene_11_node_statistics.json | 1 + .../domaene_12_node_statistics.json | 1 + .../domaene_13_node_statistics.json | 1 + .../domaene_14_node_statistics.json | 1 + .../domaene_16_node_level0 | 14 ++ .../domaene_16_node_level1 | 4 + .../domaene_16_node_statistics.json | 1 + .../domaene_17_node_statistics.json | 1 + .../domaene_18_node_statistics.json | 1 + .../domaene_19_node_statistics.json | 1 + .../domaene_20_node_statistics.json | 1 + .../domaene_21_node_statistics.json | 1 + .../domaene_22_node_statistics.json | 1 + .../domaene_23_node_statistics.json | 1 + .../domaene_24_node_statistics.json | 1 + .../domaene_25_node_statistics.json | 1 + .../domaene_26_node_statistics.json | 1 + .../domaene_27_node_statistics.json | 1 + .../no_autoupdater_node_level0 | 172 ++++++++++++++++++ .../no_autoupdater_node_level1 | 49 +++++ .../no_autoupdater_node_level2 | 6 + webserver-configuration/no_geo_node_level0 | 22 +++ webserver-configuration/no_geo_node_level1 | 12 ++ .../stadt_warendorf_node_statistics.json | 1 + 38 files changed, 541 insertions(+), 20 deletions(-) create mode 100644 webserver-configuration/domaene_01_node_level0 create mode 100644 webserver-configuration/domaene_01_node_level1 create mode 100644 webserver-configuration/domaene_01_node_level2 create mode 100644 webserver-configuration/domaene_01_node_statistics.json create mode 100644 webserver-configuration/domaene_02_node_statistics.json create mode 100644 webserver-configuration/domaene_03_node_statistics.json create mode 100644 webserver-configuration/domaene_04_node_statistics.json create mode 100644 webserver-configuration/domaene_05_node_statistics.json create mode 100644 webserver-configuration/domaene_06_node_statistics.json create mode 100644 webserver-configuration/domaene_07_node_statistics.json create mode 100644 webserver-configuration/domaene_08_node_statistics.json create mode 100644 webserver-configuration/domaene_09_node_statistics.json create mode 100644 webserver-configuration/domaene_11_node_statistics.json create mode 100644 webserver-configuration/domaene_12_node_statistics.json create mode 100644 webserver-configuration/domaene_13_node_statistics.json create mode 100644 webserver-configuration/domaene_14_node_statistics.json create mode 100644 webserver-configuration/domaene_16_node_level0 create mode 100644 webserver-configuration/domaene_16_node_level1 create mode 100644 webserver-configuration/domaene_16_node_statistics.json create mode 100644 webserver-configuration/domaene_17_node_statistics.json create mode 100644 webserver-configuration/domaene_18_node_statistics.json create mode 100644 webserver-configuration/domaene_19_node_statistics.json create mode 100644 webserver-configuration/domaene_20_node_statistics.json create mode 100644 webserver-configuration/domaene_21_node_statistics.json create mode 100644 webserver-configuration/domaene_22_node_statistics.json create mode 100644 webserver-configuration/domaene_23_node_statistics.json create mode 100644 webserver-configuration/domaene_24_node_statistics.json create mode 100644 webserver-configuration/domaene_25_node_statistics.json create mode 100644 webserver-configuration/domaene_26_node_statistics.json create mode 100644 webserver-configuration/domaene_27_node_statistics.json create mode 100644 webserver-configuration/no_autoupdater_node_level0 create mode 100644 webserver-configuration/no_autoupdater_node_level1 create mode 100644 webserver-configuration/no_autoupdater_node_level2 create mode 100644 webserver-configuration/no_geo_node_level0 create mode 100644 webserver-configuration/no_geo_node_level1 create mode 100644 webserver-configuration/stadt_warendorf_node_statistics.json diff --git a/graph.py b/graph.py index 7492ed0..e1f4c33 100644 --- a/graph.py +++ b/graph.py @@ -23,7 +23,7 @@ class Graph: def parseNodes(self): for k,v in self.nodes['nodes'].iteritems(): lat, lon = self.getGeo(k) - node = Node(k, ipv6 = self.getPublicAddress(k), hostname = self.getHostname(k), isOnline = self.getOnlineState(k), lat=lat, lon=lon, coder = self.coder, autoupdater = self.getAutoupdaterStatus(k), branch = self.getBranch(k), isGateway = self.getIsGateway(k)) + node = Node(k, ipv6 = self.getPublicAddress(k), hostname = self.getHostname(k), isOnline = self.getOnlineState(k), lat=lat, lon=lon, coder = self.coder, autoupdater = self.getAutoupdaterStatus(k), branch = self.getBranch(k), isGateway = self.getIsGateway(k), interfaces = self.getInterfaces(k)) self.nodes_list[k] = node def parseLinks(self): @@ -33,30 +33,46 @@ class Graph: if self.nodes_list[link_nodes[link['source']]['node_id']].isGateway == True or self.nodes_list[link_nodes[link['target']]['node_id']].isGateway: self.setVpnLink(link['source'], link['target']) else: - self.setLinkBetween(link_nodes[link['source']]['node_id'], link_nodes[link['target']]['node_id']) + self.setLinkBetween(link_nodes[link['source']], link_nodes[link['target']]) else: self.setVpnLink(link['source'], link['target']) - + + def getLinkType(self, interfaces, link_id): + if not interfaces: + return None + for k, v in interfaces.iteritems(): + if link_id in v: + return k + def setLinkBetween(self, src, dst, stateOnline = True, lastSeen = None): - if src and dst: - self.nodes_list[src].links[dst] = { - 'node' : self.nodes_list[dst], + src_id = src['node_id'] + dst_id = dst['node_id'] + src_type = self.getLinkType(self.nodes_list[src_id].interfaces, src['id']) + dst_type = self.getLinkType(self.nodes_list[dst_id].interfaces, dst['id']) + if dst_type == 'other' or src_type == 'other': + print 'LAN Link: src:', self.nodes_list[src_id].hostname, 'dst:', self.nodes_list[dst_id].hostname + + if src_id and dst_id: + self.nodes_list[src_id].links[dst_id] = { + 'node' : self.nodes_list[dst_id], 'state_online' : stateOnline, - 'last_seen' : lastSeen + 'last_seen' : lastSeen, + 'type' : src_type } - self.nodes_list[dst].links[src] = { - 'node' : self.nodes_list[src], + self.nodes_list[dst_id].links[src_id] = { + 'node' : self.nodes_list[src_id], 'state_online' : stateOnline, - 'last_seen' : lastSeen + 'last_seen' : lastSeen, + 'type' : dst_type } def setVpnLink(self, src, dst): - if 'node_id' not in self.data['batadv']['nodes'][src] or (self.data['batadv']['nodes'][src]['node_id'] and self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].isGateway == True): - if 'node_id' in self.data['batadv']['nodes'][dst] and self.data['batadv']['nodes'][dst]['node_id']: - self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].stepsToVpn = 0 - elif 'node_id' not in self.data['batadv']['nodes'][dst] or (self.data['batadv']['nodes'][dst]['node_id'] and self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].isGateway == True): - if 'node_id' in self.data['batadv']['nodes'][src] and self.data['batadv']['nodes'][src]['node_id']: - self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].stepsToVpn = 0 + if 'node_id' not in self.data['batadv']['nodes'][src] or (self.data['batadv']['nodes'][src]['node_id'] and self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].isGateway == True): + if 'node_id' in self.data['batadv']['nodes'][dst] and self.data['batadv']['nodes'][dst]['node_id']: + self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].stepsToVpn = 0 + elif 'node_id' not in self.data['batadv']['nodes'][dst] or (self.data['batadv']['nodes'][dst]['node_id'] and self.nodes_list[self.data['batadv']['nodes'][dst]['node_id']].isGateway == True): + if 'node_id' in self.data['batadv']['nodes'][src] and self.data['batadv']['nodes'][src]['node_id']: + self.nodes_list[self.data['batadv']['nodes'][src]['node_id']].stepsToVpn = 0 def calculateStepsToVpn(self): for node in self.nodes_list.itervalues(): @@ -75,6 +91,12 @@ class Graph: return zmap + def getInterfaces(self, node_id): + try: + return self.nodes['nodes'][node_id]['nodeinfo']['network']['mesh']['bat0']['interfaces'] + except: + return None #lecagy nodes or non well formed node + def getHostname(self,node_id): return self.nodes['nodes'][node_id]['nodeinfo']['hostname'] @@ -136,14 +158,27 @@ class Graph: if v.isOnline == True: if v.geodata != None: if v.isInRegion(region): - for ksub,vsub in v.getNodeCloud({}).iteritems(): + ncloud = v.getNodeCloud({}) + for ksub,vsub in ncloud.iteritems(): if not vsub.autoupdater or (branch and vsub.branch != branch): break else: - results.update(v.getNodeCloud({})) + if self.isLANlinkInCloud(ncloud) == False: + results.update(ncloud) print "Result:",len(results), region return results + def isLANlinkInCloud(self, nodeCloud): + for k,v in nodeCloud.iteritems(): + for ksub, vsub in v.links.iteritems(): + if k in self.nodes_list and ksub in self.nodes_list[k].links: + if self.nodes_list[k].links[ksub]['type'] == 'other': + return True + if ksub in self.nodes_list and k in self.nodes_list[ksub].links: + if self.nodes_list[ksub].links[k]['type'] == 'other': + return True + return False + def maxDepth(self): maxDepth = 0 for v in self.nodes_list.itervalues(): diff --git a/node.py b/node.py index 1fbe8ef..7ebd625 100644 --- a/node.py +++ b/node.py @@ -4,7 +4,7 @@ from geocode import Geocode import time class Node(object): - def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None, autoupdater = False, branch = None, isGateway = False): + def __init__(self, nodeid, ipv6 = None, hostname = None, isOnline = False, lastSeen = None, lat = None, lon = None, coder = None, autoupdater = False, branch = None, isGateway = False, interfaces = None): self.coder = coder if self.coder == None: self.coder = Geocode(geocoderCache = True, printStatus = True) @@ -20,12 +20,13 @@ class Node(object): self._geo = None self.geodata = None self.isGateway = isGateway + self.interfaces = interfaces + self.isLANlinkInCloud = False if lat != None and lon != None: self.geo = { 'lat' : lat, 'lon' : lon } - def addLink(self,nodeid, node): if not nodeid in self.links: diff --git a/webserver-configuration/domaene_01_node_level0 b/webserver-configuration/domaene_01_node_level0 new file mode 100644 index 0000000..0139ad3 --- /dev/null +++ b/webserver-configuration/domaene_01_node_level0 @@ -0,0 +1,151 @@ +geo $switch { + default 0; + 2a03:2260:115:100:62e3:27ff:febd:9a12 1; #EGS1 + 2a03:2260:115:100:ea94:f6ff:fecd:ac0a 1; #DashFree + 2a03:2260:115:100:f6f2:6dff:fe3e:9218 1; #Freifunk-FSP05 + 2a03:2260:115:100:62e3:27ff:febd:99e2 1; #EGS3 + 2a03:2260:115:100:ea94:f6ff:fe29:fb0a 1; #Dorbaumstrasse + 2a03:2260:115:100:32b5:c2ff:fe6e:8841 1; #ffms-HeartOfGold-01 + 2a03:2260:115:100:eade:27ff:fed6:1338 1; #heerde-nord + 2a03:2260:115:100:c6e9:84ff:fe33:4ddc 1; #Burg-G.Wgn + 2a03:2260:115:100:f6f2:6dff:fe3f:9bf8 1; #Essmanns-Backstube-MS-Mecklenbeck-F69 + 2a03:2260:115:100:ea94:f6ff:fe69:b542 1; #marie-curie + 2a03:2260:115:100:ea94:f6ff:fe42:77a0 1; #wastlx1 + 2a03:2260:115:100:32b5:c2ff:fec6:f8ca 1; #phonerepair.ms + 2a03:2260:115:100:32b5:c2ff:fee7:9204 1; #Siedler_Freifunk01 + 2a03:2260:115:100:ea94:f6ff:febf:8600 1; #ffms-mimipalast + 2a03:2260:115:100:62e3:27ff:fee7:33be 1; #ff-akademie-der-schoenen-kuenste + 2a03:2260:115:100:62e3:27ff:feed:98ce 1; #freifunk_Sieversgruppe + 2a03:2260:115:100:26a4:3cff:fed8:8fc4 1; #Last_Resort + 2a03:2260:115:100:c6e9:84ff:feb5:ea5a 1; #freifunk-nobrain + 2a03:2260:115:100:eade:27ff:fed6:10d4 1; #tardis + 2a03:2260:115:100:c66e:1fff:feb3:7818 1; #ffms-lenz + 2a03:2260:115:100:ea94:f6ff:fe6d:1344 1; #Le-petit-Reve + 2a03:2260:115:100:f6f2:6dff:fed5:3a24 1; #Freifunk_by_MCBattleAxe.de_und_PCFT.de + 2a03:2260:115:100:12fe:edff:fef1:4c24 1; #Stehrweg22 + 2a03:2260:115:100:16cc:20ff:fe3b:1926 1; #ff0.andymwwwy + 2a03:2260:115:100:c66e:1fff:feff:db4e 1; #knoten1 + 2a03:2260:115:100:c66e:1fff:fee7:b92e 1; #ffwaf-psiforce1 + 2a03:2260:115:100:32b5:c2ff:fec6:d290 1; #freifunk-meppener-str + 2a03:2260:115:100:c6e9:84ff:feb5:ebb8 1; #HalloMensch + 2a03:2260:115:100:eade:27ff:fed6:b64 1; #wallywlan01 + 2a03:2260:115:100:62e3:27ff:fe5a:76 1; #Sparklenet_2 + 2a03:2260:115:100:ea94:f6ff:fe29:8552 1; #PIRATEN_OEDP_WeselerStr + 2a03:2260:115:100:62e3:27ff:fe5a:70 1; #AtriumKulturverein + 2a03:2260:115:100:ea94:f6ff:fe90:b05e 1; #Freifunk-Frank + 2a03:2260:115:100:ea94:f6ff:fe90:a326 1; #coerde-eins + 2a03:2260:115:100:16cc:20ff:febb:be5e 1; #FreifunkMSbyL1Nch + 2a03:2260:115:100:c66e:1fff:fe87:54e0 1; #rabbit_hole_1 + 2a03:2260:115:100:12fe:edff:feb7:a9c 1; #da1l6 + 2a03:2260:115:100:ea94:f6ff:fe69:c672 1; #gut-verkleidet.de + 2a03:2260:115:100:32b5:c2ff:fe2a:cd0c 1; #WF-FF-02 + 2a03:2260:115:100:62e3:27ff:fece:d5b8 1; #freifunk60e327ced5b8 + 2a03:2260:115:100:ea94:f6ff:fe69:c5b0 1; #dunstkreis-001 + 2a03:2260:115:100:ea94:f6ff:fe29:da56 1; #Cafe_Ecksteins_01 + 2a03:2260:115:100:ea94:f6ff:fe0c:8f7a 1; #CanisLupus + 2a03:2260:115:100:ea94:f6ff:fe69:b510 1; #Last_Resort_VPN + 2a03:2260:115:100:32b5:c2ff:fe70:4ae8 1; #Sporckweg + 2a03:2260:115:100:6670:2ff:fe52:6868 1; #ffms-cafe-med-buero + 2a03:2260:115:100:12fe:edff:fec4:66c6 1; #fungur-test + 2a03:2260:115:100:ea94:f6ff:fe29:8394 1; #freifunk-dieckmann + 2a03:2260:115:100:ea94:f6ff:feab:2972 1; #FF-Ferdinand + 2a03:2260:115:100:ea94:f6ff:fe33:a4cc 1; #freifunk-emslaenderweg + 2a03:2260:115:100:32b5:c2ff:fe2a:cd02 1; #WF-FF-03 + 2a03:2260:115:100:c66e:1fff:febd:498 1; #Bambusleitung + 2a03:2260:115:100:12fe:edff:fef3:fa14 1; #Begegnungszentrum-Kinderhaus-Jugendsalon + 2a03:2260:115:100:16cc:20ff:fe6f:b48 1; #SpecOps-Freifunk + 2a03:2260:115:100:ea94:f6ff:fe29:f738 1; #Windhorststrasse + 2a03:2260:115:100:32b5:c2ff:fe7e:91f2 1; #Suedstern + 2a03:2260:115:100:16cc:20ff:feb0:cffa 1; #ffms-rudolfstr + 2a03:2260:115:100:ea94:f6ff:fecd:ab08 1; #samohtius + 2a03:2260:115:100:c66e:1fff:fee8:eb2 1; #freifunk-roxel-01 + 2a03:2260:115:100:ea94:f6ff:fe29:852c 1; #harryismus + 2a03:2260:115:100:62e3:27ff:fece:bfc4 1; #Rotes-Haus + 2a03:2260:115:100:a2f3:c1ff:fe7a:250a 1; #burster + 2a03:2260:115:100:62e3:27ff:fee7:1cd4 1; #HabichtsHorst + 2a03:2260:115:100:c66e:1fff:fe2c:4a4c 1; #Goebenstrasse + 2a03:2260:115:100:32b5:c2ff:fe7e:2e94 1; #freifunk30b5c27e2e94 + 2a03:2260:115:100:16cc:20ff:fe4d:337c 1; #freifunkkurzegeist1 + 2a03:2260:115:100:ea94:f6ff:fe29:f9c2 1; #doctor-phunc + 2a03:2260:115:100:c6e9:84ff:feb5:ea10 1; #Orchidee-ThaiMassage-Muenster + 2a03:2260:115:100:ea94:f6ff:fe2a:3da 1; #BlackLight-Bar + 2a03:2260:115:100:ee08:6bff:fe61:8708 1; #freifunk-dorotheenstrasse + 2a03:2260:115:100:fad1:11ff:fe3a:a4cc 1; #AScode + 2a03:2260:115:100:ea94:f6ff:fe29:7f50 1; #ffms_ktown01 + 2a03:2260:115:100:eade:27ff:feca:9ca4 1; #WF-FF-01 + 2a03:2260:115:100:c66e:1fff:fee7:f1c6 1; #FanLin-DaGe + 2a03:2260:115:100:c6e9:84ff:fe5b:1086 1; #freifunk-heekweg + 2a03:2260:115:100:ea94:f6ff:fe2a:391c 1; #meer-funk + 2a03:2260:115:100:62e3:27ff:feee:677a 1; #freifunk60e327ee677a + 2a03:2260:115:100:12fe:edff:fe92:efe2 1; #promenadenblick01 + 2a03:2260:115:100:62e3:27ff:fe9a:b0c8 1; #ffms-westwind + 2a03:2260:115:100:16cc:20ff:fe6f:afc4 1; #freifunk-stickamp + 2a03:2260:115:100:c66e:1fff:fe70:b64 1; #FeuerFreiFunk + 2a03:2260:115:100:eade:27ff:fed5:e2ec 1; #LaPaloma-Base + 2a03:2260:115:100:6666:b3ff:feaf:e4fe 1; #4gewinnt + 2a03:2260:115:100:ea94:f6ff:fe29:fab6 1; #gerryth + 2a03:2260:115:100:16cc:20ff:fe4b:fd64 1; #Eckhart_Bald_Naturmoebel + 2a03:2260:115:100:c6e9:84ff:feb5:eb1a 1; #Da-Tartufo + 2a03:2260:115:100:ea94:f6ff:fe2a:38f6 1; #Meerweisenet90 + 2a03:2260:115:100:f6f2:6dff:fe3f:da8a 1; #MS4Life + 2a03:2260:115:100:ea94:f6ff:fe4b:3afa 1; #freifunk-mschae + 2a03:2260:115:100:ea94:f6ff:fe2a:3ca 1; #freifunk-krehlio + 2a03:2260:115:100:c66e:1fff:fee6:dfca 1; #seecurity-1 + 2a03:2260:115:100:16cc:20ff:fea4:996a 1; #SPD-Muenster-01 + 2a03:2260:115:100:c66e:1fff:febd:19c4 1; #Agathastr + 2a03:2260:115:100:c66e:1fff:fe87:8534 1; #freifunk-gasselstiege-2 + 2a03:2260:115:100:32b5:c2ff:fe22:d142 1; #freifunk30b5c222d142 + 2a03:2260:115:100:6670:2ff:fe9d:dc70 1; #freifunk_blackdragon01 + 2a03:2260:115:100:62e3:27ff:fe5a:34 1; #Sakanaya-Sushi + 2a03:2260:115:100:ea94:f6ff:fe6c:cfe8 1; #Funki + 2a03:2260:115:100:ea94:f6ff:fe69:b694 1; #Sparklenet + 2a03:2260:115:100:f6f2:6dff:fe3f:cbe2 1; #Freifunk-MS-DH + 2a03:2260:115:100:ea94:f6ff:fe6d:4074 1; #Schlossgarten-Cafe-01 + 2a03:2260:115:100:62e3:27ff:febd:a3a2 1; #EGS2 + 2a03:2260:115:100:ea94:f6ff:fe42:8f88 1; #coinsfunk + 2a03:2260:115:100:ea94:f6ff:fe29:8512 1; #freifunk-stadtlohnweg01 + 2a03:2260:115:100:f6f2:6dff:fe40:479a 1; #freifunk-Kanal + 2a03:2260:115:100:62e3:27ff:fe76:9de2 1; #freifunk60e327769de2 + 2a03:2260:115:100:32b5:c2ff:febd:28ce 1; #Burg-C.Wgn + 2a03:2260:115:100:ea94:f6ff:fe4f:b4ac 1; #freifunk-Am-Krug + 2a03:2260:115:100:c66e:1fff:fee6:9874 1; #Wiese + 2a03:2260:115:100:ea94:f6ff:fe29:f854 1; #dubtown_ms + 2a03:2260:115:100:c6e9:84ff:fe33:485a 1; #HansaRingFunk + 2a03:2260:115:100:62e3:27ff:fec7:11f2 1; #EGS4 + 2a03:2260:115:100:ea94:f6ff:fe4f:b3e2 1; #Freifunk-48 + 2a03:2260:115:100:ea94:f6ff:fea2:1aa8 1; #South_Central + 2a03:2260:115:100:223:cdff:fe20:bb26 1; #freifunk-fever + 2a03:2260:115:100:ea94:f6ff:fecd:33d4 1; #freifunk-Paulstrasse + 2a03:2260:115:100:eade:27ff:fe62:d6da 1; #freifunk-kolpingsfamilie-1 + 2a03:2260:115:100:c6e9:84ff:feb6:5d8 1; #freifunk-fsp02 + 2a03:2260:115:100:c66e:1fff:fe87:6a40 1; #anaptis + 2a03:2260:115:100:ea94:f6ff:fe6c:cf60 1; #Freifunk_RHW + 2a03:2260:115:100:16cc:20ff:fe31:efc2 1; #Freifunk-Aasee-SHM + 2a03:2260:115:100:ea94:f6ff:feba:fab0 1; #t8o-1 + 2a03:2260:115:100:62e3:27ff:fee7:7788 1; #southside + 2a03:2260:115:100:92f6:52ff:fe27:2f2c 1; #yk2ms002 + 2a03:2260:115:100:eade:27ff:fead:8104 1; #freifunk-amigolan + 2a03:2260:115:100:c66e:1fff:fe7a:99fe 1; #freifunk-c46e1f7a99fe + 2a03:2260:115:100:ea94:f6ff:fe6d:3ff6 1; #fair_and_friendly_Buero + 2a03:2260:115:100:ea94:f6ff:fe29:8568 1; #freifunk-8D + 2a03:2260:115:100:fa1a:67ff:fe5a:ad47 1; #Funkwerk + 2a03:2260:115:100:32b5:c2ff:feb0:74fa 1; #Freifunk-Rumphorst-01 + 2a03:2260:115:100:16cc:20ff:fe6a:432a 1; #ffms-www.team4m.de-01 + 2a03:2260:115:100:eade:27ff:fed6:1632 1; #Schneeschwung + 2a03:2260:115:100:a62b:b0ff:fed8:6dc2 1; #Essmanns-Backstube-Muenster-Ludgeristrasse-F49 + 2a03:2260:115:100:c66e:1fff:fe41:61fc 1; #freifunk-mm-ms-001 + 2a03:2260:115:100:16cc:20ff:fe6f:46ae 1; #Ewaldi22.2 + 2a03:2260:115:100:f6f2:6dff:fe49:9114 1; #ffms-blume9-WR940N + 2a03:2260:115:100:32b5:c2ff:fe22:705c 1; #ffms_DG6YY + 2a03:2260:115:100:ea94:f6ff:fe2a:8f28 1; #rainbowdash + 2a03:2260:115:100:62e3:27ff:febd:c59c 1; #freifunk_lebensfreude_post + 2a03:2260:115:100:12fe:edff:fe9c:49e 1; #freifunk-www.Pension-Haselmann.de + 2a03:2260:115:100:6a72:51ff:fe2e:e0a3 1; #ffms-blume9-gartenhaus + 2a03:2260:115:100:32b5:c2ff:febd:7374 1; #freifunk-sprakel01 + 2a03:2260:115:100:ea94:f6ff:fe42:8fc0 1; #comline-d23-01 + 2a03:2260:115:100:ea94:f6ff:fe6d:cc6 1; #the_maze + 2a03:2260:115:100:6666:b3ff:feb0:21a6 1; #Freifunk + 2a03:2260:115:100:c66e:1fff:fe7a:9a1a 1; #aqua-maris-Muenster + 2a03:2260:115:100:c6e9:84ff:fee3:6742 1; #carl-neuendorff-weg + 2a03:2260:115:100:f6f2:6dff:fe3f:de76 1; #Freifunk_NCC1701F +} \ No newline at end of file diff --git a/webserver-configuration/domaene_01_node_level1 b/webserver-configuration/domaene_01_node_level1 new file mode 100644 index 0000000..c595a4d --- /dev/null +++ b/webserver-configuration/domaene_01_node_level1 @@ -0,0 +1,25 @@ +geo $switch { + default 0; + 2a03:2260:115:100:16cc:20ff:fea4:9a36 1; #SPD-Muenster-02 + 2a03:2260:115:100:fa1a:67ff:fef3:480a 1; #freifunkf81a67f3480a + 2a03:2260:115:100:ea94:f6ff:fe6d:26fc 1; #Schlossgarten-Cafe-03 + 2a03:2260:115:100:c66e:1fff:fe58:94b8 1; #ffms-www.team4m.de-02 + 2a03:2260:115:100:62e3:27ff:fee7:ad8 1; #freifunk_Sieversgruppe2 + 2a03:2260:115:100:c66e:1fff:fee8:116e 1; #Freifunk-Aasee-LaVela + 2a03:2260:115:100:6a72:51ff:fe38:ef59 1; #ffms-westwind-1 + 2a03:2260:115:100:6a72:51ff:fe20:ab80 1; #cafe-med-aussen + 2a03:2260:115:100:ea94:f6ff:fe6d:407c 1; #Schlossgarten-Cafe-02 + 2a03:2260:115:100:c6e9:84ff:feb0:dbb8 1; #SPD-Muenster-03 + 2a03:2260:115:100:ea94:f6ff:fe69:c626 1; #wastlx2 + 2a03:2260:115:100:c6e9:84ff:fe99:a1be 1; #SPD-Muenster-04 + 2a03:2260:115:100:ea94:f6ff:fe6d:1c38 1; #Schlossgarten-Cafe-04 + 2a03:2260:115:100:62e3:27ff:fec7:10c 1; #EGS5 + 2a03:2260:115:100:fa1a:67ff:fe3f:e4e0 1; #auf_Mauritz + 2a03:2260:115:100:ea94:f6ff:fe0c:a604 1; #Jp-Cut + 2a03:2260:115:100:62e3:27ff:fee7:aa4 1; #freifunk_Sieversgruppe4 + 2a03:2260:115:100:32b5:c2ff:fe22:e8d6 1; #freifunk_gaer + 2a03:2260:115:100:f6f2:6dff:fe52:b44e 1; #freifunkkurzegeist4 + 2a03:2260:115:100:62e3:27ff:fee7:b06 1; #freifunk_Sieversgruppe5 + 2a03:2260:115:100:c6e9:84ff:feb5:ebcc 1; #freifunkkurzegeist2 + 2a03:2260:115:100:6a72:51ff:fe10:a66c 1; #LaPaloma +} \ No newline at end of file diff --git a/webserver-configuration/domaene_01_node_level2 b/webserver-configuration/domaene_01_node_level2 new file mode 100644 index 0000000..63b02aa --- /dev/null +++ b/webserver-configuration/domaene_01_node_level2 @@ -0,0 +1,4 @@ +geo $switch { + default 0; + 2a03:2260:115:100:62e3:27ff:fee7:1548 1; #freifunk_Sieversgruppe3 +} \ No newline at end of file diff --git a/webserver-configuration/domaene_01_node_statistics.json b/webserver-configuration/domaene_01_node_statistics.json new file mode 100644 index 0000000..1b77945 --- /dev/null +++ b/webserver-configuration/domaene_01_node_statistics.json @@ -0,0 +1 @@ +{"f4f26d3fda8a": {"level": 0, "hostname": "MS4Life", "nodeid": "f4f26d3fda8a", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe3f:da8a"}, "60e327bd9a12": {"level": 0, "hostname": "EGS1", "nodeid": "60e327bd9a12", "ipv6": "2a03:2260:115:100:62e3:27ff:febd:9a12"}, "e894f6cdac0a": {"level": 0, "hostname": "DashFree", "nodeid": "e894f6cdac0a", "ipv6": "2a03:2260:115:100:ea94:f6ff:fecd:ac0a"}, "14cc20a49a36": {"level": 1, "hostname": "SPD-Muenster-02", "nodeid": "14cc20a49a36", "ipv6": "2a03:2260:115:100:16cc:20ff:fea4:9a36"}, "f4f26d3e9218": {"level": 0, "hostname": "Freifunk-FSP05", "nodeid": "f4f26d3e9218", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe3e:9218"}, "60e327bd99e2": {"level": 0, "hostname": "EGS3", "nodeid": "60e327bd99e2", "ipv6": "2a03:2260:115:100:62e3:27ff:febd:99e2"}, "e894f629fb0a": {"level": 0, "hostname": "Dorbaumstrasse", "nodeid": "e894f629fb0a", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:fb0a"}, "30b5c26e8841": {"level": 0, "hostname": "ffms-HeartOfGold-01", "nodeid": "30b5c26e8841", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe6e:8841"}, "e8de27d61338": {"level": 0, "hostname": "heerde-nord", "nodeid": "e8de27d61338", "ipv6": "2a03:2260:115:100:eade:27ff:fed6:1338"}, "c4e984334ddc": {"level": 0, "hostname": "Burg-G.Wgn", "nodeid": "c4e984334ddc", "ipv6": "2a03:2260:115:100:c6e9:84ff:fe33:4ddc"}, "f4f26d3f9bf8": {"level": 0, "hostname": "Essmanns-Backstube-MS-Mecklenbeck-F69", "nodeid": "f4f26d3f9bf8", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe3f:9bf8"}, "e894f669b542": {"level": 0, "hostname": "marie-curie", "nodeid": "e894f669b542", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe69:b542"}, "e894f64277a0": {"level": 0, "hostname": "wastlx1", "nodeid": "e894f64277a0", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe42:77a0"}, "f81a67f3480a": {"level": 1, "hostname": "freifunkf81a67f3480a", "nodeid": "f81a67f3480a", "ipv6": "2a03:2260:115:100:fa1a:67ff:fef3:480a"}, "30b5c2c6f8ca": {"level": 0, "hostname": "phonerepair.ms", "nodeid": "30b5c2c6f8ca", "ipv6": "2a03:2260:115:100:32b5:c2ff:fec6:f8ca"}, "30b5c2e79204": {"level": 0, "hostname": "Siedler_Freifunk01", "nodeid": "30b5c2e79204", "ipv6": "2a03:2260:115:100:32b5:c2ff:fee7:9204"}, "30b5c222d142": {"level": 0, "hostname": "freifunk30b5c222d142", "nodeid": "30b5c222d142", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe22:d142"}, "60e327e733be": {"level": 0, "hostname": "ff-akademie-der-schoenen-kuenste", "nodeid": "60e327e733be", "ipv6": "2a03:2260:115:100:62e3:27ff:fee7:33be"}, "60e327ed98ce": {"level": 0, "hostname": "freifunk_Sieversgruppe", "nodeid": "60e327ed98ce", "ipv6": "2a03:2260:115:100:62e3:27ff:feed:98ce"}, "e894f66d26fc": {"level": 1, "hostname": "Schlossgarten-Cafe-03", "nodeid": "e894f66d26fc", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6d:26fc"}, "6470029ddc70": {"level": 0, "hostname": "freifunk_blackdragon01", "nodeid": "6470029ddc70", "ipv6": "2a03:2260:115:100:6670:2ff:fe9d:dc70"}, "c4e984b5ea5a": {"level": 0, "hostname": "freifunk-nobrain", "nodeid": "c4e984b5ea5a", "ipv6": "2a03:2260:115:100:c6e9:84ff:feb5:ea5a"}, "e8de27d610d4": {"level": 0, "hostname": "tardis", "nodeid": "e8de27d610d4", "ipv6": "2a03:2260:115:100:eade:27ff:fed6:10d4"}, "c46e1fb37818": {"level": 0, "hostname": "ffms-lenz", "nodeid": "c46e1fb37818", "ipv6": "2a03:2260:115:100:c66e:1fff:feb3:7818"}, "e894f66d1344": {"level": 0, "hostname": "Le-petit-Reve", "nodeid": "e894f66d1344", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6d:1344"}, "f4f26dd53a24": {"level": 0, "hostname": "Freifunk_by_MCBattleAxe.de_und_PCFT.de", "nodeid": "f4f26dd53a24", "ipv6": "2a03:2260:115:100:f6f2:6dff:fed5:3a24"}, "c46e1fe8116e": {"level": 1, "hostname": "Freifunk-Aasee-LaVela", "nodeid": "c46e1fe8116e", "ipv6": "2a03:2260:115:100:c66e:1fff:fee8:116e"}, "14cc203b1926": {"level": 0, "hostname": "ff0.andymwwwy", "nodeid": "14cc203b1926", "ipv6": "2a03:2260:115:100:16cc:20ff:fe3b:1926"}, "c46e1fffdb4e": {"level": 0, "hostname": "knoten1", "nodeid": "c46e1fffdb4e", "ipv6": "2a03:2260:115:100:c66e:1fff:feff:db4e"}, "c46e1fe7b92e": {"level": 0, "hostname": "ffwaf-psiforce1", "nodeid": "c46e1fe7b92e", "ipv6": "2a03:2260:115:100:c66e:1fff:fee7:b92e"}, "c4e984b5ebb8": {"level": 0, "hostname": "HalloMensch", "nodeid": "c4e984b5ebb8", "ipv6": "2a03:2260:115:100:c6e9:84ff:feb5:ebb8"}, "e8de27d60b64": {"level": 0, "hostname": "wallywlan01", "nodeid": "e8de27d60b64", "ipv6": "2a03:2260:115:100:eade:27ff:fed6:b64"}, "60e3275a0076": {"level": 0, "hostname": "Sparklenet_2", "nodeid": "60e3275a0076", "ipv6": "2a03:2260:115:100:62e3:27ff:fe5a:76"}, "e894f6298552": {"level": 0, "hostname": "PIRATEN_OEDP_WeselerStr", "nodeid": "e894f6298552", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:8552"}, "60e3275a0070": {"level": 0, "hostname": "AtriumKulturverein", "nodeid": "60e3275a0070", "ipv6": "2a03:2260:115:100:62e3:27ff:fe5a:70"}, "e894f629da56": {"level": 0, "hostname": "Cafe_Ecksteins_01", "nodeid": "e894f629da56", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:da56"}, "14cc204d337c": {"level": 0, "hostname": "freifunkkurzegeist1", "nodeid": "14cc204d337c", "ipv6": "2a03:2260:115:100:16cc:20ff:fe4d:337c"}, "14cc20bbbe5e": {"level": 0, "hostname": "FreifunkMSbyL1Nch", "nodeid": "14cc20bbbe5e", "ipv6": "2a03:2260:115:100:16cc:20ff:febb:be5e"}, "c46e1f8754e0": {"level": 0, "hostname": "rabbit_hole_1", "nodeid": "c46e1f8754e0", "ipv6": "2a03:2260:115:100:c66e:1fff:fe87:54e0"}, "c46e1fe69874": {"level": 0, "hostname": "Wiese", "nodeid": "c46e1fe69874", "ipv6": "2a03:2260:115:100:c66e:1fff:fee6:9874"}, "10feedb70a9c": {"level": 0, "hostname": "da1l6", "nodeid": "10feedb70a9c", "ipv6": "2a03:2260:115:100:12fe:edff:feb7:a9c"}, "e894f669c672": {"level": 0, "hostname": "gut-verkleidet.de", "nodeid": "e894f669c672", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe69:c672"}, "30b5c22acd0c": {"level": 0, "hostname": "WF-FF-02", "nodeid": "30b5c22acd0c", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe2a:cd0c"}, "e894f669c5b0": {"level": 0, "hostname": "dunstkreis-001", "nodeid": "e894f669c5b0", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe69:c5b0"}, "60e327e70ad8": {"level": 1, "hostname": "freifunk_Sieversgruppe2", "nodeid": "60e327e70ad8", "ipv6": "2a03:2260:115:100:62e3:27ff:fee7:ad8"}, "e894f690b05e": {"level": 0, "hostname": "Freifunk-Frank", "nodeid": "e894f690b05e", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe90:b05e"}, "e894f60c8f7a": {"level": 0, "hostname": "CanisLupus", "nodeid": "e894f60c8f7a", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe0c:8f7a"}, "30b5c2704ae8": {"level": 0, "hostname": "Sporckweg", "nodeid": "30b5c2704ae8", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe70:4ae8"}, "647002526868": {"level": 0, "hostname": "ffms-cafe-med-buero", "nodeid": "647002526868", "ipv6": "2a03:2260:115:100:6670:2ff:fe52:6868"}, "10feedc466c6": {"level": 0, "hostname": "fungur-test", "nodeid": "10feedc466c6", "ipv6": "2a03:2260:115:100:12fe:edff:fec4:66c6"}, "e894f6298394": {"level": 0, "hostname": "freifunk-dieckmann", "nodeid": "e894f6298394", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:8394"}, "e894f6ab2972": {"level": 0, "hostname": "FF-Ferdinand", "nodeid": "e894f6ab2972", "ipv6": "2a03:2260:115:100:ea94:f6ff:feab:2972"}, "10feedf14c24": {"level": 0, "hostname": "Stehrweg22", "nodeid": "10feedf14c24", "ipv6": "2a03:2260:115:100:12fe:edff:fef1:4c24"}, "e894f633a4cc": {"level": 0, "hostname": "freifunk-emslaenderweg", "nodeid": "e894f633a4cc", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe33:a4cc"}, "30b5c22acd02": {"level": 0, "hostname": "WF-FF-03", "nodeid": "30b5c22acd02", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe2a:cd02"}, "c46e1fbd0498": {"level": 0, "hostname": "Bambusleitung", "nodeid": "c46e1fbd0498", "ipv6": "2a03:2260:115:100:c66e:1fff:febd:498"}, "68725138ef59": {"level": 1, "hostname": "ffms-westwind-1", "nodeid": "68725138ef59", "ipv6": "2a03:2260:115:100:6a72:51ff:fe38:ef59"}, "10feedf3fa14": {"level": 0, "hostname": "Begegnungszentrum-Kinderhaus-Jugendsalon", "nodeid": "10feedf3fa14", "ipv6": "2a03:2260:115:100:12fe:edff:fef3:fa14"}, "14cc206f0b48": {"level": 0, "hostname": "SpecOps-Freifunk", "nodeid": "14cc206f0b48", "ipv6": "2a03:2260:115:100:16cc:20ff:fe6f:b48"}, "e894f629f738": {"level": 0, "hostname": "Windhorststrasse", "nodeid": "e894f629f738", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:f738"}, "30b5c27e91f2": {"level": 0, "hostname": "Suedstern", "nodeid": "30b5c27e91f2", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe7e:91f2"}, "14cc20b0cffa": {"level": 0, "hostname": "ffms-rudolfstr", "nodeid": "14cc20b0cffa", "ipv6": "2a03:2260:115:100:16cc:20ff:feb0:cffa"}, "e894f6cdab08": {"level": 0, "hostname": "samohtius", "nodeid": "e894f6cdab08", "ipv6": "2a03:2260:115:100:ea94:f6ff:fecd:ab08"}, "c46e1fe80eb2": {"level": 0, "hostname": "freifunk-roxel-01", "nodeid": "c46e1fe80eb2", "ipv6": "2a03:2260:115:100:c66e:1fff:fee8:eb2"}, "e894f629852c": {"level": 0, "hostname": "harryismus", "nodeid": "e894f629852c", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:852c"}, "68725120ab80": {"level": 1, "hostname": "cafe-med-aussen", "nodeid": "68725120ab80", "ipv6": "2a03:2260:115:100:6a72:51ff:fe20:ab80"}, "60e327cebfc4": {"level": 0, "hostname": "Rotes-Haus", "nodeid": "60e327cebfc4", "ipv6": "2a03:2260:115:100:62e3:27ff:fece:bfc4"}, "a0f3c17a250a": {"level": 0, "hostname": "burster", "nodeid": "a0f3c17a250a", "ipv6": "2a03:2260:115:100:a2f3:c1ff:fe7a:250a"}, "60e327e71cd4": {"level": 0, "hostname": "HabichtsHorst", "nodeid": "60e327e71cd4", "ipv6": "2a03:2260:115:100:62e3:27ff:fee7:1cd4"}, "c46e1f2c4a4c": {"level": 0, "hostname": "Goebenstrasse", "nodeid": "c46e1f2c4a4c", "ipv6": "2a03:2260:115:100:c66e:1fff:fe2c:4a4c"}, "30b5c27e2e94": {"level": 0, "hostname": "freifunk30b5c27e2e94", "nodeid": "30b5c27e2e94", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe7e:2e94"}, "e894f690a326": {"level": 0, "hostname": "coerde-eins", "nodeid": "e894f690a326", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe90:a326"}, "e894f629f9c2": {"level": 0, "hostname": "doctor-phunc", "nodeid": "e894f629f9c2", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:f9c2"}, "c4e984b5ea10": {"level": 0, "hostname": "Orchidee-ThaiMassage-Muenster", "nodeid": "c4e984b5ea10", "ipv6": "2a03:2260:115:100:c6e9:84ff:feb5:ea10"}, "e894f62a03da": {"level": 0, "hostname": "BlackLight-Bar", "nodeid": "e894f62a03da", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe2a:3da"}, "ec086b618708": {"level": 0, "hostname": "freifunk-dorotheenstrasse", "nodeid": "ec086b618708", "ipv6": "2a03:2260:115:100:ee08:6bff:fe61:8708"}, "c46e1f5894b8": {"level": 1, "hostname": "ffms-www.team4m.de-02", "nodeid": "c46e1f5894b8", "ipv6": "2a03:2260:115:100:c66e:1fff:fe58:94b8"}, "e894f6297f50": {"level": 0, "hostname": "ffms_ktown01", "nodeid": "e894f6297f50", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:7f50"}, "e8de27ca9ca4": {"level": 0, "hostname": "WF-FF-01", "nodeid": "e8de27ca9ca4", "ipv6": "2a03:2260:115:100:eade:27ff:feca:9ca4"}, "c46e1fe7f1c6": {"level": 0, "hostname": "FanLin-DaGe", "nodeid": "c46e1fe7f1c6", "ipv6": "2a03:2260:115:100:c66e:1fff:fee7:f1c6"}, "e894f62a8f28": {"level": 0, "hostname": "rainbowdash", "nodeid": "e894f62a8f28", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe2a:8f28"}, "e894f62a391c": {"level": 0, "hostname": "meer-funk", "nodeid": "e894f62a391c", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe2a:391c"}, "60e327ee677a": {"level": 0, "hostname": "freifunk60e327ee677a", "nodeid": "60e327ee677a", "ipv6": "2a03:2260:115:100:62e3:27ff:feee:677a"}, "10feed92efe2": {"level": 0, "hostname": "promenadenblick01", "nodeid": "10feed92efe2", "ipv6": "2a03:2260:115:100:12fe:edff:fe92:efe2"}, "e894f66d407c": {"level": 1, "hostname": "Schlossgarten-Cafe-02", "nodeid": "e894f66d407c", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6d:407c"}, "c4e984b0dbb8": {"level": 1, "hostname": "SPD-Muenster-03", "nodeid": "c4e984b0dbb8", "ipv6": "2a03:2260:115:100:c6e9:84ff:feb0:dbb8"}, "60e3279ab0c8": {"level": 0, "hostname": "ffms-westwind", "nodeid": "60e3279ab0c8", "ipv6": "2a03:2260:115:100:62e3:27ff:fe9a:b0c8"}, "14cc206fafc4": {"level": 0, "hostname": "freifunk-stickamp", "nodeid": "14cc206fafc4", "ipv6": "2a03:2260:115:100:16cc:20ff:fe6f:afc4"}, "c46e1f700b64": {"level": 0, "hostname": "FeuerFreiFunk", "nodeid": "c46e1f700b64", "ipv6": "2a03:2260:115:100:c66e:1fff:fe70:b64"}, "e8de27d5e2ec": {"level": 0, "hostname": "LaPaloma-Base", "nodeid": "e8de27d5e2ec", "ipv6": "2a03:2260:115:100:eade:27ff:fed5:e2ec"}, "e894f669c626": {"level": 1, "hostname": "wastlx2", "nodeid": "e894f669c626", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe69:c626"}, "6466b3afe4fe": {"level": 0, "hostname": "4gewinnt", "nodeid": "6466b3afe4fe", "ipv6": "2a03:2260:115:100:6666:b3ff:feaf:e4fe"}, "e894f66d4074": {"level": 0, "hostname": "Schlossgarten-Cafe-01", "nodeid": "e894f66d4074", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6d:4074"}, "60e327bdc59c": {"level": 0, "hostname": "freifunk_lebensfreude_post", "nodeid": "60e327bdc59c", "ipv6": "2a03:2260:115:100:62e3:27ff:febd:c59c"}, "e894f629fab6": {"level": 0, "hostname": "gerryth", "nodeid": "e894f629fab6", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:fab6"}, "14cc204bfd64": {"level": 0, "hostname": "Eckhart_Bald_Naturmoebel", "nodeid": "14cc204bfd64", "ipv6": "2a03:2260:115:100:16cc:20ff:fe4b:fd64"}, "c4e984b5eb1a": {"level": 0, "hostname": "Da-Tartufo", "nodeid": "c4e984b5eb1a", "ipv6": "2a03:2260:115:100:c6e9:84ff:feb5:eb1a"}, "c4e98499a1be": {"level": 1, "hostname": "SPD-Muenster-04", "nodeid": "c4e98499a1be", "ipv6": "2a03:2260:115:100:c6e9:84ff:fe99:a1be"}, "e894f62a38f6": {"level": 0, "hostname": "Meerweisenet90", "nodeid": "e894f62a38f6", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe2a:38f6"}, "30b5c2c6d290": {"level": 0, "hostname": "freifunk-meppener-str", "nodeid": "30b5c2c6d290", "ipv6": "2a03:2260:115:100:32b5:c2ff:fec6:d290"}, "e894f64b3afa": {"level": 0, "hostname": "freifunk-mschae", "nodeid": "e894f64b3afa", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe4b:3afa"}, "e894f62a03ca": {"level": 0, "hostname": "freifunk-krehlio", "nodeid": "e894f62a03ca", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe2a:3ca"}, "c46e1fe6dfca": {"level": 0, "hostname": "seecurity-1", "nodeid": "c46e1fe6dfca", "ipv6": "2a03:2260:115:100:c66e:1fff:fee6:dfca"}, "14cc20a4996a": {"level": 0, "hostname": "SPD-Muenster-01", "nodeid": "14cc20a4996a", "ipv6": "2a03:2260:115:100:16cc:20ff:fea4:996a"}, "c46e1fbd19c4": {"level": 0, "hostname": "Agathastr", "nodeid": "c46e1fbd19c4", "ipv6": "2a03:2260:115:100:c66e:1fff:febd:19c4"}, "c46e1f878534": {"level": 0, "hostname": "freifunk-gasselstiege-2", "nodeid": "c46e1f878534", "ipv6": "2a03:2260:115:100:c66e:1fff:fe87:8534"}, "e894f6bf8600": {"level": 0, "hostname": "ffms-mimipalast", "nodeid": "e894f6bf8600", "ipv6": "2a03:2260:115:100:ea94:f6ff:febf:8600"}, "e894f66d1c38": {"level": 1, "hostname": "Schlossgarten-Cafe-04", "nodeid": "e894f66d1c38", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6d:1c38"}, "24a43cd88fc4": {"level": 0, "hostname": "Last_Resort", "nodeid": "24a43cd88fc4", "ipv6": "2a03:2260:115:100:26a4:3cff:fed8:8fc4"}, "60e3275a0034": {"level": 0, "hostname": "Sakanaya-Sushi", "nodeid": "60e3275a0034", "ipv6": "2a03:2260:115:100:62e3:27ff:fe5a:34"}, "e894f66ccfe8": {"level": 0, "hostname": "Funki", "nodeid": "e894f66ccfe8", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6c:cfe8"}, "e894f669b694": {"level": 0, "hostname": "Sparklenet", "nodeid": "e894f669b694", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe69:b694"}, "f4f26d3fcbe2": {"level": 0, "hostname": "Freifunk-MS-DH", "nodeid": "f4f26d3fcbe2", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe3f:cbe2"}, "e894f669b510": {"level": 0, "hostname": "Last_Resort_VPN", "nodeid": "e894f669b510", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe69:b510"}, "60e327bda3a2": {"level": 0, "hostname": "EGS2", "nodeid": "60e327bda3a2", "ipv6": "2a03:2260:115:100:62e3:27ff:febd:a3a2"}, "30b5c2bd7374": {"level": 0, "hostname": "freifunk-sprakel01", "nodeid": "30b5c2bd7374", "ipv6": "2a03:2260:115:100:32b5:c2ff:febd:7374"}, "e894f6298512": {"level": 0, "hostname": "freifunk-stadtlohnweg01", "nodeid": "e894f6298512", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:8512"}, "f4f26d40479a": {"level": 0, "hostname": "freifunk-Kanal", "nodeid": "f4f26d40479a", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe40:479a"}, "60e327769de2": {"level": 0, "hostname": "freifunk60e327769de2", "nodeid": "60e327769de2", "ipv6": "2a03:2260:115:100:62e3:27ff:fe76:9de2"}, "60e327c7010c": {"level": 1, "hostname": "EGS5", "nodeid": "60e327c7010c", "ipv6": "2a03:2260:115:100:62e3:27ff:fec7:10c"}, "30b5c2bd28ce": {"level": 0, "hostname": "Burg-C.Wgn", "nodeid": "30b5c2bd28ce", "ipv6": "2a03:2260:115:100:32b5:c2ff:febd:28ce"}, "e894f64fb4ac": {"level": 0, "hostname": "freifunk-Am-Krug", "nodeid": "e894f64fb4ac", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe4f:b4ac"}, "f8d1113aa4cc": {"level": 0, "hostname": "AScode", "nodeid": "f8d1113aa4cc", "ipv6": "2a03:2260:115:100:fad1:11ff:fe3a:a4cc"}, "e894f629f854": {"level": 0, "hostname": "dubtown_ms", "nodeid": "e894f629f854", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:f854"}, "c4e98433485a": {"level": 0, "hostname": "HansaRingFunk", "nodeid": "c4e98433485a", "ipv6": "2a03:2260:115:100:c6e9:84ff:fe33:485a"}, "f81a673fe4e0": {"level": 1, "hostname": "auf_Mauritz", "nodeid": "f81a673fe4e0", "ipv6": "2a03:2260:115:100:fa1a:67ff:fe3f:e4e0"}, "60e327c711f2": {"level": 0, "hostname": "EGS4", "nodeid": "60e327c711f2", "ipv6": "2a03:2260:115:100:62e3:27ff:fec7:11f2"}, "e894f64fb3e2": {"level": 0, "hostname": "Freifunk-48", "nodeid": "e894f64fb3e2", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe4f:b3e2"}, "e894f6a21aa8": {"level": 0, "hostname": "South_Central", "nodeid": "e894f6a21aa8", "ipv6": "2a03:2260:115:100:ea94:f6ff:fea2:1aa8"}, "0023cd20bb26": {"level": 0, "hostname": "freifunk-fever", "nodeid": "0023cd20bb26", "ipv6": "2a03:2260:115:100:223:cdff:fe20:bb26"}, "e894f6cd33d4": {"level": 0, "hostname": "freifunk-Paulstrasse", "nodeid": "e894f6cd33d4", "ipv6": "2a03:2260:115:100:ea94:f6ff:fecd:33d4"}, "e8de2762d6da": {"level": 0, "hostname": "freifunk-kolpingsfamilie-1", "nodeid": "e8de2762d6da", "ipv6": "2a03:2260:115:100:eade:27ff:fe62:d6da"}, "c4e984b605d8": {"level": 0, "hostname": "freifunk-fsp02", "nodeid": "c4e984b605d8", "ipv6": "2a03:2260:115:100:c6e9:84ff:feb6:5d8"}, "c46e1f876a40": {"level": 0, "hostname": "anaptis", "nodeid": "c46e1f876a40", "ipv6": "2a03:2260:115:100:c66e:1fff:fe87:6a40"}, "e894f66ccf60": {"level": 0, "hostname": "Freifunk_RHW", "nodeid": "e894f66ccf60", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6c:cf60"}, "14cc2031efc2": {"level": 0, "hostname": "Freifunk-Aasee-SHM", "nodeid": "14cc2031efc2", "ipv6": "2a03:2260:115:100:16cc:20ff:fe31:efc2"}, "e894f6bafab0": {"level": 0, "hostname": "t8o-1", "nodeid": "e894f6bafab0", "ipv6": "2a03:2260:115:100:ea94:f6ff:feba:fab0"}, "60e327e77788": {"level": 0, "hostname": "southside", "nodeid": "60e327e77788", "ipv6": "2a03:2260:115:100:62e3:27ff:fee7:7788"}, "90f652272f2c": {"level": 0, "hostname": "yk2ms002", "nodeid": "90f652272f2c", "ipv6": "2a03:2260:115:100:92f6:52ff:fe27:2f2c"}, "e8de27ad8104": {"level": 0, "hostname": "freifunk-amigolan", "nodeid": "e8de27ad8104", "ipv6": "2a03:2260:115:100:eade:27ff:fead:8104"}, "c46e1f7a99fe": {"level": 0, "hostname": "freifunk-c46e1f7a99fe", "nodeid": "c46e1f7a99fe", "ipv6": "2a03:2260:115:100:c66e:1fff:fe7a:99fe"}, "e894f66d3ff6": {"level": 0, "hostname": "fair_and_friendly_Buero", "nodeid": "e894f66d3ff6", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6d:3ff6"}, "e894f6298568": {"level": 0, "hostname": "freifunk-8D", "nodeid": "e894f6298568", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:8568"}, "f81a675aad47": {"level": 0, "hostname": "Funkwerk", "nodeid": "f81a675aad47", "ipv6": "2a03:2260:115:100:fa1a:67ff:fe5a:ad47"}, "30b5c2b074fa": {"level": 0, "hostname": "Freifunk-Rumphorst-01", "nodeid": "30b5c2b074fa", "ipv6": "2a03:2260:115:100:32b5:c2ff:feb0:74fa"}, "e894f60ca604": {"level": 1, "hostname": "Jp-Cut", "nodeid": "e894f60ca604", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe0c:a604"}, "60e327e70aa4": {"level": 1, "hostname": "freifunk_Sieversgruppe4", "nodeid": "60e327e70aa4", "ipv6": "2a03:2260:115:100:62e3:27ff:fee7:aa4"}, "14cc206a432a": {"level": 0, "hostname": "ffms-www.team4m.de-01", "nodeid": "14cc206a432a", "ipv6": "2a03:2260:115:100:16cc:20ff:fe6a:432a"}, "e8de27d61632": {"level": 0, "hostname": "Schneeschwung", "nodeid": "e8de27d61632", "ipv6": "2a03:2260:115:100:eade:27ff:fed6:1632"}, "30b5c222e8d6": {"level": 1, "hostname": "freifunk_gaer", "nodeid": "30b5c222e8d6", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe22:e8d6"}, "a42bb0d86dc2": {"level": 0, "hostname": "Essmanns-Backstube-Muenster-Ludgeristrasse-F49", "nodeid": "a42bb0d86dc2", "ipv6": "2a03:2260:115:100:a62b:b0ff:fed8:6dc2"}, "c46e1f4161fc": {"level": 0, "hostname": "freifunk-mm-ms-001", "nodeid": "c46e1f4161fc", "ipv6": "2a03:2260:115:100:c66e:1fff:fe41:61fc"}, "f4f26d52b44e": {"level": 1, "hostname": "freifunkkurzegeist4", "nodeid": "f4f26d52b44e", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe52:b44e"}, "14cc206f46ae": {"level": 0, "hostname": "Ewaldi22.2", "nodeid": "14cc206f46ae", "ipv6": "2a03:2260:115:100:16cc:20ff:fe6f:46ae"}, "f4f26d499114": {"level": 0, "hostname": "ffms-blume9-WR940N", "nodeid": "f4f26d499114", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe49:9114"}, "30b5c222705c": {"level": 0, "hostname": "ffms_DG6YY", "nodeid": "30b5c222705c", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe22:705c"}, "c4e9845b1086": {"level": 0, "hostname": "freifunk-heekweg", "nodeid": "c4e9845b1086", "ipv6": "2a03:2260:115:100:c6e9:84ff:fe5b:1086"}, "60e327e71548": {"level": 2, "hostname": "freifunk_Sieversgruppe3", "nodeid": "60e327e71548", "ipv6": "2a03:2260:115:100:62e3:27ff:fee7:1548"}, "60e327ced5b8": {"level": 0, "hostname": "freifunk60e327ced5b8", "nodeid": "60e327ced5b8", "ipv6": "2a03:2260:115:100:62e3:27ff:fece:d5b8"}, "60e327e70b06": {"level": 1, "hostname": "freifunk_Sieversgruppe5", "nodeid": "60e327e70b06", "ipv6": "2a03:2260:115:100:62e3:27ff:fee7:b06"}, "10feed9c049e": {"level": 0, "hostname": "freifunk-www.Pension-Haselmann.de", "nodeid": "10feed9c049e", "ipv6": "2a03:2260:115:100:12fe:edff:fe9c:49e"}, "6872512ee0a3": {"level": 0, "hostname": "ffms-blume9-gartenhaus", "nodeid": "6872512ee0a3", "ipv6": "2a03:2260:115:100:6a72:51ff:fe2e:e0a3"}, "e894f6428f88": {"level": 0, "hostname": "coinsfunk", "nodeid": "e894f6428f88", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe42:8f88"}, "c4e984b5ebcc": {"level": 1, "hostname": "freifunkkurzegeist2", "nodeid": "c4e984b5ebcc", "ipv6": "2a03:2260:115:100:c6e9:84ff:feb5:ebcc"}, "e894f6428fc0": {"level": 0, "hostname": "comline-d23-01", "nodeid": "e894f6428fc0", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe42:8fc0"}, "e894f66d0cc6": {"level": 0, "hostname": "the_maze", "nodeid": "e894f66d0cc6", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe6d:cc6"}, "6466b3b021a6": {"level": 0, "hostname": "Freifunk", "nodeid": "6466b3b021a6", "ipv6": "2a03:2260:115:100:6666:b3ff:feb0:21a6"}, "68725110a66c": {"level": 1, "hostname": "LaPaloma", "nodeid": "68725110a66c", "ipv6": "2a03:2260:115:100:6a72:51ff:fe10:a66c"}, "c46e1f7a9a1a": {"level": 0, "hostname": "aqua-maris-Muenster", "nodeid": "c46e1f7a9a1a", "ipv6": "2a03:2260:115:100:c66e:1fff:fe7a:9a1a"}, "c4e984e36742": {"level": 0, "hostname": "carl-neuendorff-weg", "nodeid": "c4e984e36742", "ipv6": "2a03:2260:115:100:c6e9:84ff:fee3:6742"}, "f4f26d3fde76": {"level": 0, "hostname": "Freifunk_NCC1701F", "nodeid": "f4f26d3fde76", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe3f:de76"}} \ No newline at end of file diff --git a/webserver-configuration/domaene_02_node_statistics.json b/webserver-configuration/domaene_02_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_02_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_03_node_statistics.json b/webserver-configuration/domaene_03_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_03_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_04_node_statistics.json b/webserver-configuration/domaene_04_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_04_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_05_node_statistics.json b/webserver-configuration/domaene_05_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_05_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_06_node_statistics.json b/webserver-configuration/domaene_06_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_06_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_07_node_statistics.json b/webserver-configuration/domaene_07_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_07_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_08_node_statistics.json b/webserver-configuration/domaene_08_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_08_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_09_node_statistics.json b/webserver-configuration/domaene_09_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_09_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_11_node_statistics.json b/webserver-configuration/domaene_11_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_11_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_12_node_statistics.json b/webserver-configuration/domaene_12_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_12_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_13_node_statistics.json b/webserver-configuration/domaene_13_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_13_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_14_node_statistics.json b/webserver-configuration/domaene_14_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_14_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_16_node_level0 b/webserver-configuration/domaene_16_node_level0 new file mode 100644 index 0000000..8aad33c --- /dev/null +++ b/webserver-configuration/domaene_16_node_level0 @@ -0,0 +1,14 @@ +geo $switch { + default 0; + 2a03:2260:115:100:a62b:b0ff:fed8:6dc2 1; #Essmanns-Backstube-Muenster-Ludgeristrasse-F49 + 2a03:2260:115:100:eade:27ff:fe62:d6da 1; #freifunk-kolpingsfamilie-1 + 2a03:2260:115:100:ea94:f6ff:fe69:b542 1; #marie-curie + 2a03:2260:115:100:ea94:f6ff:fe29:f738 1; #Windhorststrasse + 2a03:2260:115:100:eade:27ff:fed6:10d4 1; #tardis + 2a03:2260:115:100:ea94:f6ff:fe29:f854 1; #dubtown_ms + 2a03:2260:115:100:ea94:f6ff:fe42:8f88 1; #coinsfunk + 2a03:2260:115:100:f6f2:6dff:fe3f:cbe2 1; #Freifunk-MS-DH + 2a03:2260:115:100:c66e:1fff:feb3:7818 1; #ffms-lenz + 2a03:2260:115:100:62e3:27ff:fece:bfc4 1; #Rotes-Haus + 2a03:2260:115:100:fa1a:67ff:fe5a:ad47 1; #Funkwerk +} \ No newline at end of file diff --git a/webserver-configuration/domaene_16_node_level1 b/webserver-configuration/domaene_16_node_level1 new file mode 100644 index 0000000..4a7eaf5 --- /dev/null +++ b/webserver-configuration/domaene_16_node_level1 @@ -0,0 +1,4 @@ +geo $switch { + default 0; + 2a03:2260:115:100:32b5:c2ff:fe22:e8d6 1; #freifunk_gaer +} \ No newline at end of file diff --git a/webserver-configuration/domaene_16_node_statistics.json b/webserver-configuration/domaene_16_node_statistics.json new file mode 100644 index 0000000..10dc37f --- /dev/null +++ b/webserver-configuration/domaene_16_node_statistics.json @@ -0,0 +1 @@ +{"a42bb0d86dc2": {"level": 0, "hostname": "Essmanns-Backstube-Muenster-Ludgeristrasse-F49", "nodeid": "a42bb0d86dc2", "ipv6": "2a03:2260:115:100:a62b:b0ff:fed8:6dc2"}, "e8de2762d6da": {"level": 0, "hostname": "freifunk-kolpingsfamilie-1", "nodeid": "e8de2762d6da", "ipv6": "2a03:2260:115:100:eade:27ff:fe62:d6da"}, "e894f669b542": {"level": 0, "hostname": "marie-curie", "nodeid": "e894f669b542", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe69:b542"}, "e894f629f738": {"level": 0, "hostname": "Windhorststrasse", "nodeid": "e894f629f738", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:f738"}, "e8de27d610d4": {"level": 0, "hostname": "tardis", "nodeid": "e8de27d610d4", "ipv6": "2a03:2260:115:100:eade:27ff:fed6:10d4"}, "e894f629f854": {"level": 0, "hostname": "dubtown_ms", "nodeid": "e894f629f854", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe29:f854"}, "e894f6428f88": {"level": 0, "hostname": "coinsfunk", "nodeid": "e894f6428f88", "ipv6": "2a03:2260:115:100:ea94:f6ff:fe42:8f88"}, "f4f26d3fcbe2": {"level": 0, "hostname": "Freifunk-MS-DH", "nodeid": "f4f26d3fcbe2", "ipv6": "2a03:2260:115:100:f6f2:6dff:fe3f:cbe2"}, "30b5c222e8d6": {"level": 1, "hostname": "freifunk_gaer", "nodeid": "30b5c222e8d6", "ipv6": "2a03:2260:115:100:32b5:c2ff:fe22:e8d6"}, "c46e1fb37818": {"level": 0, "hostname": "ffms-lenz", "nodeid": "c46e1fb37818", "ipv6": "2a03:2260:115:100:c66e:1fff:feb3:7818"}, "60e327cebfc4": {"level": 0, "hostname": "Rotes-Haus", "nodeid": "60e327cebfc4", "ipv6": "2a03:2260:115:100:62e3:27ff:fece:bfc4"}, "f81a675aad47": {"level": 0, "hostname": "Funkwerk", "nodeid": "f81a675aad47", "ipv6": "2a03:2260:115:100:fa1a:67ff:fe5a:ad47"}} \ No newline at end of file diff --git a/webserver-configuration/domaene_17_node_statistics.json b/webserver-configuration/domaene_17_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_17_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_18_node_statistics.json b/webserver-configuration/domaene_18_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_18_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_19_node_statistics.json b/webserver-configuration/domaene_19_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_19_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_20_node_statistics.json b/webserver-configuration/domaene_20_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_20_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_21_node_statistics.json b/webserver-configuration/domaene_21_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_21_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_22_node_statistics.json b/webserver-configuration/domaene_22_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_22_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_23_node_statistics.json b/webserver-configuration/domaene_23_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_23_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_24_node_statistics.json b/webserver-configuration/domaene_24_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_24_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_25_node_statistics.json b/webserver-configuration/domaene_25_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_25_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_26_node_statistics.json b/webserver-configuration/domaene_26_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_26_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/domaene_27_node_statistics.json b/webserver-configuration/domaene_27_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/domaene_27_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/webserver-configuration/no_autoupdater_node_level0 b/webserver-configuration/no_autoupdater_node_level0 new file mode 100644 index 0000000..f5a7c4c --- /dev/null +++ b/webserver-configuration/no_autoupdater_node_level0 @@ -0,0 +1,172 @@ +geo $switch { + default 0; + 2a03:2260:115:100:f6f2:6dff:fe3f:da8a 1; #MS4Life + 2a03:2260:115:100:62e3:27ff:febd:9a12 1; #EGS1 + 2a03:2260:115:100:ea94:f6ff:fecd:ac0a 1; #DashFree + 2a03:2260:115:100:f6f2:6dff:fe3e:9218 1; #Freifunk-FSP05 + 2a03:2260:115:100:62e3:27ff:febd:99e2 1; #EGS3 + 2a03:2260:115:100:ea94:f6ff:fe29:fb0a 1; #Dorbaumstrasse + 2a03:2260:115:100:32b5:c2ff:fe6e:8841 1; #ffms-HeartOfGold-01 + 2a03:2260:115:100:eade:27ff:fed6:1338 1; #heerde-nord + 2a03:2260:115:100:c6e9:84ff:fee3:69d2 1; #Waffelschmiede_Wollbecker + 2a03:2260:115:100:c6e9:84ff:fe33:4ddc 1; #Burg-G.Wgn + 2a03:2260:115:100:f6f2:6dff:fe3f:9bf8 1; #Essmanns-Backstube-MS-Mecklenbeck-F69 + 2a03:2260:115:100:ea94:f6ff:fe69:b542 1; #marie-curie + 2a03:2260:115:100:c66e:1fff:fee7:f1c6 1; #FanLin-DaGe + 2a03:2260:115:100:32b5:c2ff:fec6:f8ca 1; #phonerepair.ms + 2a03:2260:115:100:92f6:52ff:fe4e:bd26 1; #freifunk90f6524ebd26 + 2a03:2260:115:100:ea94:f6ff:febf:8600 1; #ffms-mimipalast + 2a03:2260:115:100:62e3:27ff:feed:98ce 1; #freifunk_Sieversgruppe + 2a03:2260:115:100:c66e:1fff:fe7a:9a1a 1; #aqua-maris-Muenster + 2a03:2260:115:100:26a4:3cff:fed8:8fc4 1; #Last_Resort + 2a03:2260:115:100:c6e9:84ff:feb5:ea5a 1; #freifunk-nobrain + 2a03:2260:115:100:eade:27ff:fed6:10d4 1; #tardis + 2a03:2260:115:100:62e3:27ff:fe59:fd90 1; #peynation + 2a03:2260:115:100:c66e:1fff:feb3:7818 1; #ffms-lenz + 2a03:2260:115:100:c66e:1fff:fe2c:4a4c 1; #Goebenstrasse + 2a03:2260:115:100:ea94:f6ff:fe6d:1344 1; #Le-petit-Reve + 2a03:2260:115:100:f6f2:6dff:fed5:3a24 1; #Freifunk_by_MCBattleAxe.de_und_PCFT.de + 2a03:2260:115:100:12fe:edff:fef1:4c24 1; #Stehrweg22 + 2a03:2260:115:100:16cc:20ff:fe3b:1926 1; #ff0.andymwwwy + 2a03:2260:115:100:c66e:1fff:feff:db4e 1; #knoten1 + 2a03:2260:115:100:c66e:1fff:fee7:b92e 1; #ffwaf-psiforce1 + 2a03:2260:115:100:16cc:20ff:fe70:9f02 1; #warpzone-uplink + 2a03:2260:115:100:c6e9:84ff:feb5:ebb8 1; #HalloMensch + 2a03:2260:115:100:eade:27ff:fed6:b64 1; #wallywlan01 + 2a03:2260:115:100:62e3:27ff:fe5a:76 1; #Sparklenet_2 + 2a03:2260:115:100:ea94:f6ff:fe29:8552 1; #PIRATEN_OEDP_WeselerStr + 2a03:2260:115:100:62e3:27ff:fe5a:70 1; #AtriumKulturverein + 2a03:2260:115:100:ea94:f6ff:fe29:da56 1; #Cafe_Ecksteins_01 + 2a03:2260:115:100:16cc:20ff:fe4d:337c 1; #freifunkkurzegeist1 + 2a03:2260:115:100:16cc:20ff:febb:be5e 1; #FreifunkMSbyL1Nch + 2a03:2260:115:100:ea94:f6ff:febf:ff9a 1; #Bleker-IT + 2a03:2260:115:100:32b5:c2ff:feb0:74fa 1; #Freifunk-Rumphorst-01 + 2a03:2260:115:100:c66e:1fff:fe87:54e0 1; #rabbit_hole_1 + 2a03:2260:115:100:12fe:edff:feb7:a9c 1; #da1l6 + 2a03:2260:115:100:32b5:c2ff:febd:7374 1; #freifunk-sprakel01 + 2a03:2260:115:100:32b5:c2ff:fe2a:cd0c 1; #WF-FF-02 + 2a03:2260:115:100:62e3:27ff:fece:d5b8 1; #freifunk60e327ced5b8 + 2a03:2260:115:100:ea94:f6ff:fe69:c5b0 1; #dunstkreis-001 + 2a03:2260:115:100:ea94:f6ff:fe90:b05e 1; #Freifunk-Frank + 2a03:2260:115:100:ea94:f6ff:fe90:84b8 1; #SputnikBuero + 2a03:2260:115:100:ea94:f6ff:fe0c:8f7a 1; #CanisLupus + 2a03:2260:115:100:32b5:c2ff:fe70:4ae8 1; #Sporckweg + 2a03:2260:115:100:6670:2ff:fe52:6868 1; #ffms-cafe-med-buero + 2a03:2260:115:100:12fe:edff:fec4:66c6 1; #fungur-test + 2a03:2260:115:100:ea94:f6ff:fe29:8394 1; #freifunk-dieckmann + 2a03:2260:115:100:ea94:f6ff:fe33:a4cc 1; #freifunk-emslaenderweg + 2a03:2260:115:100:32b5:c2ff:fe2a:cd02 1; #WF-FF-03 + 2a03:2260:115:100:c66e:1fff:febd:498 1; #Bambusleitung + 2a03:2260:115:100:ea94:f6ff:feab:2972 1; #FF-Ferdinand + 2a03:2260:115:100:12fe:edff:fef3:fa14 1; #Begegnungszentrum-Kinderhaus-Jugendsalon + 2a03:2260:115:100:ea94:f6ff:fe29:fab6 1; #gerryth + 2a03:2260:115:100:16cc:20ff:fe6f:b48 1; #SpecOps-Freifunk + 2a03:2260:115:100:ea94:f6ff:fe42:77a0 1; #wastlx1 + 2a03:2260:115:100:ea94:f6ff:fe90:a326 1; #coerde-eins + 2a03:2260:115:100:32b5:c2ff:fe7e:91f2 1; #Suedstern + 2a03:2260:115:100:16cc:20ff:feb0:cffa 1; #ffms-rudolfstr + 2a03:2260:115:100:6a72:51ff:fe2e:d76b 1; #Pizzeria-Lido-2 + 2a03:2260:115:100:ea94:f6ff:fecd:ab08 1; #samohtius + 2a03:2260:115:100:c66e:1fff:fee8:eb2 1; #freifunk-roxel-01 + 2a03:2260:115:100:ea94:f6ff:fe29:852c 1; #harryismus + 2a03:2260:115:100:62e3:27ff:fece:bfc4 1; #Rotes-Haus + 2a03:2260:115:100:a2f3:c1ff:fe7a:250a 1; #burster + 2a03:2260:115:100:62e3:27ff:fee7:1cd4 1; #HabichtsHorst + 2a03:2260:115:100:32b5:c2ff:fe7e:2e94 1; #freifunk30b5c27e2e94 + 2a03:2260:115:100:fad1:11ff:fe3a:a4cc 1; #AScode + 2a03:2260:115:100:ea94:f6ff:fe29:f9c2 1; #doctor-phunc + 2a03:2260:115:100:c6e9:84ff:feb5:ea10 1; #Orchidee-ThaiMassage-Muenster + 2a03:2260:115:100:32b5:c2ff:fed9:9a3e 1; #FreifunkGrueneMuenster + 2a03:2260:115:100:ea94:f6ff:fe2a:3da 1; #BlackLight-Bar + 2a03:2260:115:100:ee08:6bff:fe61:8708 1; #freifunk-dorotheenstrasse + 2a03:2260:115:100:ea94:f6ff:fe29:7f50 1; #ffms_ktown01 + 2a03:2260:115:100:eade:27ff:feca:9ca4 1; #WF-FF-01 + 2a03:2260:115:100:ea94:f6ff:fe2a:8f28 1; #rainbowdash + 2a03:2260:115:100:ea94:f6ff:fe6d:cf0 1; #Banane-01 + 2a03:2260:115:100:ea94:f6ff:fe2a:391c 1; #meer-funk + 2a03:2260:115:100:ea94:f6ff:fe29:f664 1; #freifunk-Bunker-VPN + 2a03:2260:115:100:62e3:27ff:feee:677a 1; #freifunk60e327ee677a + 2a03:2260:115:100:12fe:edff:fe92:efe2 1; #promenadenblick01 + 2a03:2260:115:100:ea94:f6ff:fe63:d02 1; #Banane-02 + 2a03:2260:115:100:62e3:27ff:fe9a:b0c8 1; #ffms-westwind + 2a03:2260:115:100:16cc:20ff:fe6f:afc4 1; #freifunk-stickamp + 2a03:2260:115:100:c66e:1fff:fe70:b64 1; #FeuerFreiFunk + 2a03:2260:115:100:eade:27ff:fed5:e2ec 1; #LaPaloma-Base + 2a03:2260:115:100:a62b:b0ff:fed8:6dc2 1; #Essmanns-Backstube-Muenster-Ludgeristrasse-F49 + 2a03:2260:115:100:ea94:f6ff:fe29:f738 1; #Windhorststrasse + 2a03:2260:115:100:6666:b3ff:feaf:e4fe 1; #4gewinnt + 2a03:2260:115:100:ea94:f6ff:fe6d:4074 1; #Schlossgarten-Cafe-01 + 2a03:2260:115:100:62e3:27ff:fee7:33be 1; #ff-akademie-der-schoenen-kuenste + 2a03:2260:115:100:62e3:27ff:febd:c59c 1; #freifunk_lebensfreude_post + 2a03:2260:115:100:c66e:1fff:fe41:61fc 1; #freifunk-mm-ms-001 + 2a03:2260:115:100:16cc:20ff:fe4b:fd64 1; #Eckhart_Bald_Naturmoebel + 2a03:2260:115:100:c6e9:84ff:feb5:eb1a 1; #Da-Tartufo + 2a03:2260:115:100:16cc:20ff:fe6a:432a 1; #ffms-www.team4m.de-01 + 2a03:2260:115:100:ea94:f6ff:fe2a:38f6 1; #Meerweisenet90 + 2a03:2260:115:100:32b5:c2ff:fec6:d290 1; #freifunk-meppener-str + 2a03:2260:115:100:ea94:f6ff:fe4b:3afa 1; #freifunk-mschae + 2a03:2260:115:100:ea94:f6ff:fe2a:3ca 1; #freifunk-krehlio + 2a03:2260:115:100:c66e:1fff:fee6:dfca 1; #seecurity-1 + 2a03:2260:115:100:16cc:20ff:fea4:996a 1; #SPD-Muenster-01 + 2a03:2260:115:100:c66e:1fff:febd:19c4 1; #Agathastr + 2a03:2260:115:100:ea94:f6ff:fe69:c672 1; #gut-verkleidet.de + 2a03:2260:115:100:c66e:1fff:fe87:8534 1; #freifunk-gasselstiege-2 + 2a03:2260:115:100:32b5:c2ff:fe22:d142 1; #freifunk30b5c222d142 + 2a03:2260:115:100:6670:2ff:fe9d:dc70 1; #freifunk_blackdragon01 + 2a03:2260:115:100:62e3:27ff:fe5a:34 1; #Sakanaya-Sushi + 2a03:2260:115:100:ea94:f6ff:fe6c:cfe8 1; #Funki + 2a03:2260:115:100:ea94:f6ff:fe69:b694 1; #Sparklenet + 2a03:2260:115:100:f6f2:6dff:fe3f:cbe2 1; #Freifunk-MS-DH + 2a03:2260:115:100:ea94:f6ff:fe69:b510 1; #Last_Resort_VPN + 2a03:2260:115:100:62e3:27ff:febd:a3a2 1; #EGS2 + 2a03:2260:115:100:32b5:c2ff:fe6f:20e0 1; #Caritas-Nienberge-01 + 2a03:2260:115:100:ea94:f6ff:fe29:8512 1; #freifunk-stadtlohnweg01 + 2a03:2260:115:100:f6f2:6dff:fe40:479a 1; #freifunk-Kanal + 2a03:2260:115:100:62e3:27ff:fe76:9de2 1; #freifunk60e327769de2 + 2a03:2260:115:100:32b5:c2ff:febd:28ce 1; #Burg-C.Wgn + 2a03:2260:115:100:219:99ff:fe5f:b364 1; #Commander1024-worker + 2a03:2260:115:100:62e3:27ff:feed:87e4 1; #Teilchen + 2a03:2260:115:100:ea94:f6ff:fe4f:b4ac 1; #freifunk-Am-Krug + 2a03:2260:115:100:c66e:1fff:fee6:9874 1; #Wiese + 2a03:2260:115:100:ea94:f6ff:fe29:f854 1; #dubtown_ms + 2a03:2260:115:100:c6e9:84ff:fe33:485a 1; #HansaRingFunk + 2a03:2260:115:100:62e3:27ff:fec7:11f2 1; #EGS4 + 2a03:2260:115:100:ea94:f6ff:fe4f:b3e2 1; #Freifunk-48 + 2a03:2260:115:100:ea94:f6ff:fea2:1aa8 1; #South_Central + 2a03:2260:115:100:223:cdff:fe20:bb26 1; #freifunk-fever + 2a03:2260:115:100:ea94:f6ff:fecd:33d4 1; #freifunk-Paulstrasse + 2a03:2260:115:100:eade:27ff:fe62:d6da 1; #freifunk-kolpingsfamilie-1 + 2a03:2260:115:100:c6e9:84ff:feb6:5d8 1; #freifunk-fsp02 + 2a03:2260:115:100:c66e:1fff:fe87:6a40 1; #anaptis + 2a03:2260:115:100:ea94:f6ff:fe6c:cf60 1; #Freifunk_RHW + 2a03:2260:115:100:16cc:20ff:fe31:efc2 1; #Freifunk-Aasee-SHM + 2a03:2260:115:100:ea94:f6ff:feba:fab0 1; #t8o-1 + 2a03:2260:115:100:5ed9:98ff:fe9e:861a 1; #freifunk-futro + 2a03:2260:115:100:62e3:27ff:fee7:7788 1; #southside + 2a03:2260:115:100:92f6:52ff:fe27:2f2c 1; #yk2ms002 + 2a03:2260:115:100:eade:27ff:fead:8104 1; #freifunk-amigolan + 2a03:2260:115:100:c66e:1fff:fe7a:99fe 1; #freifunk-c46e1f7a99fe + 2a03:2260:115:100:62e3:27ff:fecf:72 1; #Freifunk_by_PCFT.de_6 + 2a03:2260:115:100:ea94:f6ff:fe6d:3ff6 1; #fair_and_friendly_Buero + 2a03:2260:115:100:ea94:f6ff:fe29:8568 1; #freifunk-8D + 2a03:2260:115:100:fa1a:67ff:fe5a:ad47 1; #Funkwerk + 2a03:2260:115:100:32b5:c2ff:fe3e:9dbe 1; #Jannis_test + 2a03:2260:115:100:32b5:c2ff:fee7:9204 1; #Siedler_Freifunk01 + 2a03:2260:115:100:eade:27ff:fed6:1632 1; #Schneeschwung + 2a03:2260:115:100:c6e9:84ff:fee3:647a 1; #Pizzeria-Lido + 2a03:2260:115:100:16cc:20ff:fe6f:46ae 1; #Ewaldi22.2 + 2a03:2260:115:100:32b5:c2ff:fe22:705c 1; #ffms_DG6YY + 2a03:2260:115:100:c6e9:84ff:fe5b:1086 1; #freifunk-heekweg + 2a03:2260:115:100:ea94:f6ff:fe69:c550 1; #Starweg-1 + 2a03:2260:115:100:f6f2:6dff:fe49:9114 1; #ffms-blume9-WR940N + 2a03:2260:115:100:12fe:edff:fe9c:49e 1; #freifunk-www.Pension-Haselmann.de + 2a03:2260:115:100:ea94:f6ff:fe42:8f86 1; #cult-cars + 2a03:2260:115:100:6a72:51ff:fe2e:e0a3 1; #ffms-blume9-gartenhaus + 2a03:2260:115:100:ea94:f6ff:fe42:8f88 1; #coinsfunk + 2a03:2260:115:100:ea94:f6ff:fe42:8fc0 1; #comline-d23-01 + 2a03:2260:115:100:ea94:f6ff:fe6d:cc6 1; #the_maze + 2a03:2260:115:100:6666:b3ff:feb0:21a6 1; #Freifunk + 2a03:2260:115:100:c6e9:84ff:fee3:6742 1; #carl-neuendorff-weg + 2a03:2260:115:100:f6f2:6dff:fe3f:de76 1; #Freifunk_NCC1701F + 2a03:2260:115:100:c66e:1fff:fe2d:3e6a 1; #kgbvax-porno-patrol +} \ No newline at end of file diff --git a/webserver-configuration/no_autoupdater_node_level1 b/webserver-configuration/no_autoupdater_node_level1 new file mode 100644 index 0000000..efab3c6 --- /dev/null +++ b/webserver-configuration/no_autoupdater_node_level1 @@ -0,0 +1,49 @@ +geo $switch { + default 0; + 2a03:2260:115:100:16cc:20ff:fea4:9a36 1; #SPD-Muenster-02 + 2a03:2260:115:100:fa1a:67ff:fef3:480a 1; #freifunkf81a67f3480a + 2a03:2260:115:100:618:d6ff:fe0b:a795 1; #SputnikCafe + 2a03:2260:115:100:c66e:1fff:febd:1ec 1; #00Q_DineUp.de + 2a03:2260:115:100:62e3:27ff:feb7:9384 1; #ASB_Buero + 2a03:2260:115:100:62e3:27ff:fe59:fbe8 1; #Caritas-Nienberge-03 + 2a03:2260:115:100:62e3:27ff:fe59:fca8 1; #Caritas-Nienberge-06 + 2a03:2260:115:100:618:d6ff:fe6d:54a 1; #SputnikHalle + 2a03:2260:115:100:6a72:51ff:fe20:6213 1; #FanLin-CoOp-Bleker-IT + 2a03:2260:115:100:ea94:f6ff:fe69:c626 1; #wastlx2 + 2a03:2260:115:100:62e3:27ff:fe59:fd3a 1; #Caritas-Nienberge-04 + 2a03:2260:115:100:62e3:27ff:fee7:ad8 1; #freifunk_Sieversgruppe2 + 2a03:2260:115:100:6a72:51ff:fe38:ef59 1; #ffms-westwind-1 + 2a03:2260:115:100:c66e:1fff:fee8:116e 1; #Freifunk-Aasee-LaVela + 2a03:2260:115:100:62e3:27ff:fe59:fdda 1; #Caritas-Nienberge-08 + 2a03:2260:115:100:c66e:1fff:fe87:8558 1; #freifunk-c46e1f878558 + 2a03:2260:115:100:6a72:51ff:fe20:ab80 1; #cafe-med-aussen + 2a03:2260:115:100:c6e9:84ff:feb5:ebcc 1; #freifunkkurzegeist2 + 2a03:2260:115:100:ea94:f6ff:fe6d:40a8 1; #MV-Verlag-2 + 2a03:2260:115:100:c66e:1fff:fe58:94b8 1; #ffms-www.team4m.de-02 + 2a03:2260:115:100:62e3:27ff:fe59:ff20 1; #Caritas-Nienberge-02 + 2a03:2260:115:100:c6e9:84ff:feb5:ca9c 1; #Caritas-Nienberge-05 + 2a03:2260:115:100:ea94:f6ff:fe6d:407c 1; #Schlossgarten-Cafe-02 + 2a03:2260:115:100:c6e9:84ff:feb0:dbb8 1; #SPD-Muenster-03 + 2a03:2260:115:100:ea94:f6ff:fe2a:3cc 1; #haus-g-og1 + 2a03:2260:115:100:12fe:edff:fe7d:8c9e 1; #Commander1024-2 + 2a03:2260:115:100:ea94:f6ff:fe6d:1c38 1; #Schlossgarten-Cafe-04 + 2a03:2260:115:100:26a4:3cff:fedf:a10e 1; #warpzone-unifi-1 + 2a03:2260:115:100:6a72:51ff:fe0c:4145 1; #freifunk-Bunker + 2a03:2260:115:100:ea94:f6ff:fe6d:26fc 1; #Schlossgarten-Cafe-03 + 2a03:2260:115:100:c6e9:84ff:fe5b:9dce 1; #Hof_Ausleuchter + 2a03:2260:115:100:fa1a:67ff:fe3f:e4e0 1; #auf_Mauritz + 2a03:2260:115:100:62e3:27ff:feb2:d4a4 1; #FreifunkGrueneMuenster2 + 2a03:2260:115:100:ea94:f6ff:fe6d:10ce 1; #Commander1024-1 + 2a03:2260:115:100:62e3:27ff:fec7:10c 1; #EGS5 + 2a03:2260:115:100:26a4:3cff:fef0:b9ae 1; #kgbvax-m2-c + 2a03:2260:115:100:ea94:f6ff:fe0c:a604 1; #Jp-Cut + 2a03:2260:115:100:62e3:27ff:fee7:aa4 1; #freifunk_Sieversgruppe4 + 2a03:2260:115:100:c6e9:84ff:fe99:a1be 1; #SPD-Muenster-04 + 2a03:2260:115:100:32b5:c2ff:fe22:e8d6 1; #freifunk_gaer + 2a03:2260:115:100:6a72:51ff:fe48:1445 1; #ff-benny + 2a03:2260:115:100:f6f2:6dff:fe52:b44e 1; #freifunkkurzegeist4 + 2a03:2260:115:100:62e3:27ff:fee7:b06 1; #freifunk_Sieversgruppe5 + 2a03:2260:115:100:ea94:f6ff:fe6d:cda 1; #Banane-03 + 2a03:2260:115:100:6a72:51ff:fe10:a66c 1; #LaPaloma + 2a03:2260:115:100:62e3:27ff:fe59:fff2 1; #Caritas-Nienberge-07 +} \ No newline at end of file diff --git a/webserver-configuration/no_autoupdater_node_level2 b/webserver-configuration/no_autoupdater_node_level2 new file mode 100644 index 0000000..9750b60 --- /dev/null +++ b/webserver-configuration/no_autoupdater_node_level2 @@ -0,0 +1,6 @@ +geo $switch { + default 0; + 2a03:2260:115:100:62e3:27ff:feed:9ce6 1; #Atelier-Haus-G + 2a03:2260:115:100:32b5:c2ff:febc:f442 1; #kgbvax-pius-cpe + 2a03:2260:115:100:62e3:27ff:fee7:1548 1; #freifunk_Sieversgruppe3 +} \ No newline at end of file diff --git a/webserver-configuration/no_geo_node_level0 b/webserver-configuration/no_geo_node_level0 new file mode 100644 index 0000000..a13a4fd --- /dev/null +++ b/webserver-configuration/no_geo_node_level0 @@ -0,0 +1,22 @@ +geo $switch { + default 0; + 2a03:2260:115:100:eade:27ff:fe58:7718 1; #freifunk-vvwl + 2a03:2260:115:100:32b5:c2ff:feee:911a 1; #freifunk-Heinz + 2a03:2260:115:100:62e3:27ff:fe81:edf8 1; #mk_4 + 2a03:2260:115:100:c66e:1fff:fe58:973b 1; #freifunkc46e1f58973b + 2a03:2260:115:100:62e3:27ff:fee7:9090 1; #FF-WA-Viehhof + 2a03:2260:115:100:ea94:f6ff:fef3:461b 1; #DreiEichen-1 + 2a03:2260:115:100:fa1a:67ff:fef9:1bca 1; #osterwiese + 2a03:2260:115:100:62e3:27ff:fe81:ee6a 1; #mk_1 + 2a03:2260:115:100:92f6:52ff:fe25:d0a2 1; #void-test + 2a03:2260:115:100:62e3:27ff:feee:5c52 1; #00q_bb57 + 2a03:2260:115:100:62e3:27ff:fece:eb16 1; #FF-Mstr-EGS + 2a03:2260:115:100:62e3:27ff:feee:5c2c 1; #00q_bb88 + 2a03:2260:115:100:32b5:c2ff:fe87:9e5a 1; #freifunk30b5c2879e5a + 2a03:2260:115:100:32b5:c2ff:feed:12e8 1; #freifunk30b5c2ed12e8 + 2a03:2260:115:100:62e3:27ff:fe59:95e0 1; #Anstatthotel.com-AP-29-BASE + 2a03:2260:115:100:32b5:c2ff:fe87:9e92 1; #freifunk30b5c2879e92 + 2a03:2260:115:100:16cc:20ff:fe2c:3998 1; #Hafenkante + 2a03:2260:115:100:c6e9:84ff:feb5:f7c4 1; #Natuerlich_unverpackt + 2a03:2260:115:100:eade:27ff:fe3c:17a4 1; #00Q_49661_2 +} \ No newline at end of file diff --git a/webserver-configuration/no_geo_node_level1 b/webserver-configuration/no_geo_node_level1 new file mode 100644 index 0000000..821ca8d --- /dev/null +++ b/webserver-configuration/no_geo_node_level1 @@ -0,0 +1,12 @@ +geo $switch { + default 0; + 2a03:2260:115:100:ea94:f6ff:fe2a:900c 1; #DreiEichen-2 + 2a03:2260:115:100:c6e9:84ff:fe7f:2baa 1; #mk_2 + 2a03:2260:115:100:62e3:27ff:feee:5c5c 1; #00q_bb99 + 2a03:2260:115:100:62e3:27ff:fee7:8624 1; #Anstatthotel.com-AP-29-1OGR + 2a03:2260:115:100:eade:27ff:fe4a:f334 1; #DreiEichen-3 + 2a03:2260:115:100:c66e:1fff:fe86:f22a 1; #00Q_49661_1 + 2a03:2260:115:100:62e3:27ff:fee7:87a0 1; #Anstatthotel.com-AP-29-EGR + 2a03:2260:115:100:62e3:27ff:feee:5770 1; #ooq_bb1 + 2a03:2260:115:100:c6e9:84ff:fe7f:29d2 1; #mk_3 +} \ No newline at end of file diff --git a/webserver-configuration/stadt_warendorf_node_statistics.json b/webserver-configuration/stadt_warendorf_node_statistics.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/webserver-configuration/stadt_warendorf_node_statistics.json @@ -0,0 +1 @@ +{} \ No newline at end of file From df7cbb8c2ffad52e97c7f8d64b689d71e9ee8a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Thu, 26 May 2016 23:47:18 +0200 Subject: [PATCH 17/43] Added initial geocache --- geo-cache/config.json | 1 + .../all_keys_with_undefined | Bin 0 -> 241779 bytes .../objects/002c4c37869a4564a9eb67aebe70dd3f | 1 + .../objects/002d5bbbebd94270bcb52797eaf8a2d4 | 1 + .../objects/00367af712f746e8bd133605867afae9 | 1 + .../objects/00566dee72f149cd893e944f65ecf8d4 | 1 + .../objects/005b87a42bde4ff08602db3afbcd5780 | 1 + .../objects/005e69619a134c9a8502981be8dd6194 | 1 + .../objects/0068f7d7df0c4a4fb9f8d3ea10814942 | 1 + .../objects/00899a6166114099afd4d76ef2214f7f | 1 + .../objects/008a6b6969f2488f8c47920dca862274 | 1 + .../objects/0091b47814314f6cb67b3311ad7a78b1 | 1 + .../objects/00cae3a17bab497cb611758a255b64fd | 1 + .../objects/00d3bf269c924023b136c18e74b02165 | 1 + .../objects/00d4418b5bcc4aeb89d414a4b9220b54 | 1 + .../objects/0113788ac63a4c6481a779429de9c615 | 1 + .../objects/0120c5c1b2114a09aafec4bf8dfdcdc9 | 1 + .../objects/012f4226ab754ffe9c6baefa1459ff15 | 1 + .../objects/013f57ef6f4b477b962f4379ea5e9eea | 1 + .../objects/016520f656fc496c9ac4f4c5f623729d | 1 + .../objects/019208a8339049ddb409311d56363dcc | 1 + .../objects/01a3490ba3d4447fabd9ebe242a4f432 | 1 + .../objects/01ac36f793a24a1a88c9d806750bd765 | 1 + .../objects/01bbb58706564c8b8c87f8b128e25f6c | 1 + .../objects/01d2c03b486042da86b06c2b193a54e6 | 1 + .../objects/01e4339abc204e75a14096a8ae678df5 | 1 + .../objects/02071769630a4711a6447af8a20e2570 | 1 + .../objects/020a710962f245029825d539df497e05 | 1 + .../objects/021b548d645c41ba8e3110ca9a739aff | 1 + .../objects/022e044c969740ef82c9835b68eb425f | 1 + .../objects/0230ef43466e4d37bd88a1de6c9682b2 | 1 + .../objects/023a211e00d74d798e568acfa9a4779d | 1 + .../objects/024ddf804cf34d4ab42326def7b101f9 | 1 + .../objects/02509b4d50954ce3a1556bbb64a1cff4 | 1 + .../objects/02802c1dd0964cf6b983503269f22b26 | 1 + .../objects/02b024af36794190860cda09c2b2b550 | 1 + .../objects/02b2186bae1241848ccd2ee7ddcf86e2 | 1 + .../objects/02d0ea6e9ece4899b744374436a43efb | 1 + .../objects/02e6823a5ca44a568ffc42ae9388039c | 1 + .../objects/02ece3271d744c32a217d7929d68a67a | 1 + .../objects/02f20c9e25184872936328e192bfdf14 | 1 + .../objects/02f3642e4a2e4b12a6ae5b7b4d781dce | 1 + .../objects/02f999bd791248bbbe3f088864660f7d | 1 + .../objects/032df21ebc5c4a229e72ef995bb8d986 | 1 + .../objects/033e8d854de44ef1909b627dc347667f | 1 + .../objects/035ba112014e42c285fb952ce8e24f05 | 1 + .../objects/035e534d04b641019addc893ac4e34cf | 1 + .../objects/0360e63ce7214aaaaa0788eaa33402a7 | 1 + .../objects/037458da20c740528749d0b657edcf4e | 1 + .../objects/037f48fd35fe430abb0a4c21bd60e065 | 1 + .../objects/0388547e1d5f49ccba2d8ea006e6c60b | 1 + .../objects/0388773c667e4bac91ffccdaa92e99ac | 1 + .../objects/0390ea3861b84789ae33d86b19379f19 | 1 + .../objects/03a3257e143f47c3ae9a37a0ed75e3f6 | 1 + .../objects/03ee881258a443e4bb9ded8ed3b87db9 | 1 + .../objects/03fe62ff9d7a4cc9a598015c23d24ded | 1 + .../objects/040b077474524674b3fb8dd224bfde67 | 1 + .../objects/04119d5e735944649443636c5fb7196b | 1 + .../objects/042629c37879489486a31e1d1a49b3ee | 1 + .../objects/045d8ebe7fb04d319b7b07fe5d16765c | 1 + .../objects/04967fc6b68640769b24a74b1308dc19 | 1 + .../objects/04a00fefb8a540109a14366bd3eab4ca | 1 + .../objects/04c670a4def54865a3d51d0c821adba6 | 1 + .../objects/04d7d9c7ca4540809478a72ad5d635b5 | 1 + .../objects/0546fa7853f54d6b9349640ee55d590f | 1 + .../objects/054f7fc6c97247159ed750e0e3b6628a | 1 + .../objects/056afff4d3db4378bca5a91729a3209d | 1 + .../objects/058edfaf6a4943d1a709d4a71a371633 | 1 + .../objects/0590119a9581413395afff18b1725f8b | 1 + .../objects/05adccfba0d2434d8e5067426bdef4b0 | 1 + .../objects/05b479d1c84441228417f267fef89f57 | 1 + .../objects/06157060162e40b3a4d327629c3fcd68 | 1 + .../objects/0615d7e1ab864e91ba8cfd1ee59c4ed3 | 1 + .../objects/0646342dfade4e2da62815541793e6ba | 1 + .../objects/0671d3dcc2404c89a2b71e09fe5346f4 | 1 + .../objects/06b4c9753bbd434b8d2407edb5e8cb10 | 1 + .../objects/06eab519737b448d92f00dfad57542a7 | 1 + .../objects/06fae20ce8494681974e5fa154377632 | 1 + .../objects/073216b38d49496e99e8e8a44866333a | 1 + .../objects/0742cdcb58ca4d53b8f7002445f3b7e0 | 1 + .../objects/0771fc0be562499486d5ca5042616988 | 1 + .../objects/07abb209020747bda71223fd2ec9e369 | 1 + .../objects/07c0ec6dcdb34322a316cd2e3d29c4b4 | 1 + .../objects/07c2d3bc656044a381b02a76448001d8 | 1 + .../objects/07c36c4982054914a2e3a611e2afbb88 | 1 + .../objects/07e8bb778d4f4d6d93aacc6ce00737f7 | 1 + .../objects/07ec0c8deb284e86962a1aca4998a35a | 1 + .../objects/082049290f1447e6bb665ad06c805d17 | 1 + .../objects/0828b0b669b94689a8ceebc333f01131 | 1 + .../objects/0834ed708dce452eac69f0d04d6bf036 | 1 + .../objects/08377d2b0ddf4764b666e14fd6323f99 | 1 + .../objects/084dc7b4f4c9485084531b09450ee5c9 | 1 + .../objects/0853270775f74a65aaa2c5c3d20474b1 | 1 + .../objects/087866468e634ee89893d0aa4ced0bec | 1 + .../objects/088fc40718db41bfaa5e3b63e5e7f244 | 1 + .../objects/08c761c92fe2490a8efeda8a8eaf5ad6 | 1 + .../objects/0907540ea8d74a128baffbbe9e2853a7 | 1 + .../objects/0921b5691afd4d7ea08a3ed74d6b53ab | 1 + .../objects/094736fc93964bea9c636277ae074aa0 | 1 + .../objects/099df00f05344746943b319da2800fd9 | 1 + .../objects/09a5bfe77e85421fa2f6f2f4f02f3ece | 1 + .../objects/09d2829962e64ab58873e6f0c85a737e | 1 + .../objects/09ee7138673f424db45310ef6f858f76 | 1 + .../objects/09f56c6dadd54f3aaeac77c75658ed50 | 1 + .../objects/0a066bca458c44fbbbab2b6185370eb0 | 1 + .../objects/0a0a9932a88646da8b70b67a6aa21928 | 1 + .../objects/0a1de49e5cbd4bd6a4820c0452ddb81e | 1 + .../objects/0a3202f1d1574f8287be43b1d64d35ab | 1 + .../objects/0a6f8489505d40df9162dd05cf269e3e | 1 + .../objects/0a75e7abef3048c3981238c4dfa94a2a | 1 + .../objects/0ac872df1ebc44b8950f6a499201b337 | 1 + .../objects/0b09264a978c4e7b92009d20b05b0a6c | 1 + .../objects/0b139f3126f145daa618b42fe33163a8 | 1 + .../objects/0b25bf37ff8c4136a2f4aa672d5597ce | 1 + .../objects/0b29cc38c00d49fe9322326d38257450 | 1 + .../objects/0b6346916c4c4ad9835d1ec46df8fba5 | 1 + .../objects/0b8e3d7fb41e4ca49eb3e342afb9ec55 | 1 + .../objects/0baa5c7b054a42a4a0a0cac0eb17cd5e | 1 + .../objects/0bb4d070d4b24891ad6f43b02dbc0a1d | 1 + .../objects/0bc6980fb43743e59f453b9a410ce655 | 1 + .../objects/0c02f8271b874202b2d45e67469a2d4d | 1 + .../objects/0c0414612d354a0f8bb1c33597fcc974 | 1 + .../objects/0c0ae245224d4bc5b14c030070f2a01b | 1 + .../objects/0c3d528bcc294cb49ebfe3eb3d072765 | 1 + .../objects/0ca41c731e84439c90f4e1f26ab193b1 | 1 + .../objects/0cc1d2861f964d37a10641f642b77802 | 1 + .../objects/0cc7f5440f4b48e296e36848ced37edd | 1 + .../objects/0ce8f70c6bf54f90939137456a7e6f76 | 1 + .../objects/0d4a8ba756ae4d60902e6b7d4d7a24f8 | 1 + .../objects/0d634b6387cd43cba45bf8dbb37425c2 | 1 + .../objects/0d74b88bce7246d19fdc4710e242a128 | 1 + .../objects/0dbbf0789be844639562e33e3d2ab978 | 1 + .../objects/0dc5ae8199db4d13959d405965f17d0f | 1 + .../objects/0dca4b69dfc741f08ee4828af5227efa | 1 + .../objects/0de50880ed054379a8c6eab7c746d4da | 1 + .../objects/0de6da6e25e744a7986d97a853836138 | 1 + .../objects/0e0f3b934eb948cb8a4004240f7463fd | 1 + .../objects/0e12c902c5d44551822a64b65d832137 | 1 + .../objects/0e13ffd7e56940d9b992dc0a4f0d3e61 | 1 + .../objects/0e16cb1f6f2d4f219c80a343ad9011e6 | 1 + .../objects/0e2e6a4338cb4966a81fbc9a4d5a24c0 | 1 + .../objects/0e5b6e3dd7fc4bb081451edd08bb1a5f | 1 + .../objects/0e7632eb6f2d43bba0b8e811b04fdb97 | 1 + .../objects/0e7ff2ad03a24c2094e7ff32e791ccb5 | 1 + .../objects/0ea32c268eaa4889af79b22965f78dd0 | 1 + .../objects/0f143d0772c34cf2a20856aeb1e71356 | 1 + .../objects/0f16b40412ae480fbb89cad60b8a12e1 | 1 + .../objects/0f1809887e484e668cd736a704904c6e | 1 + .../objects/0f35270056da4c17a7a9900976af848c | 1 + .../objects/0f3d1909853e47f1a8e4c45d0ea51bf9 | 1 + .../objects/0f4024e4db874503a38c52467dc0f1da | 1 + .../objects/0f5d3675f44c4187b18e416df3a9af33 | 1 + .../objects/0f65088e3dc94a6f87eade854063e946 | 1 + .../objects/0f870a02ea2f45aa99299d22a23dc990 | 1 + .../objects/0f8e32419b5245b9840cc3599b2a8269 | 1 + .../objects/0fc7a3ef4ef9423cb702dc7a2e2d909a | 1 + .../objects/0fd3f35664db4b53bb68f38b03729e60 | 1 + .../objects/1043bec2b9c14856880eb739e3188ec7 | 1 + .../objects/104e4920dd7f4345b35cfee5bea977d6 | 1 + .../objects/108788d747cd4de7ae672fec1ecd088e | 1 + .../objects/108b662ea6f244428c8c01ab0e2e35dd | 1 + .../objects/10c52c7ceb9f4548a4cb278fefc1b9e7 | 1 + .../objects/10c704f0ce1a4471a7d0cbd42080079d | 1 + .../objects/10e31e5b8f144885bbad3b7b639848cb | 1 + .../objects/10ff0593a81344c1b483cb5c789c904a | 1 + .../objects/10ff7113b0ef4f1a80fc8089146643a4 | 1 + .../objects/11036bdbaeaf41adb8efe69f76267d7a | 1 + .../objects/1143b68f5ce84211858af6806d335790 | 1 + .../objects/11451fdbb919475a92d9117365007968 | 1 + .../objects/1162ff547eb344459f1eee1b08853886 | 1 + .../objects/116e7f43d8f34e6f8b1a3dbccafd9af4 | 1 + .../objects/11addeb3c1c64113999be40a73220608 | 1 + .../objects/11b83ef02e994c519298874ab7ff6b45 | 1 + .../objects/11ba17b84b964d438b2cc908266ccbbc | 1 + .../objects/11c859a463f44e05a804b0f4304111c0 | 1 + .../objects/11dd02a0c046469e92f8f7c71561e805 | 1 + .../objects/122825c615344bf1bad2660526f78847 | 1 + .../objects/123ed61a2f5b4c75a800136c38a2634d | 1 + .../objects/12459def082946d6b0cc76c01c29a6cf | 1 + .../objects/1247a08f6bd44aac9118ee5aac3c86bd | 1 + .../objects/1248cb89f0a04d4b969a252fefe9d9e5 | 1 + .../objects/12508a78e92b49a18f39a52bef2460c1 | 1 + .../objects/125ec62740154327b4c6161b2c0a8ba0 | 1 + .../objects/12645a67fbf243828157864635ae7222 | 1 + .../objects/12676a6de3634318aa9250af4ea9a698 | 1 + .../objects/127c105ec13d4fbba2060a6d3fcbacf4 | 1 + .../objects/12ac60d59d874914b792c949eee9e25f | 1 + .../objects/12bf88f1784a4d12a27b2e6b6fd48139 | 1 + .../objects/12bf9e44cbb548499f868dcf40e5a83e | 1 + .../objects/12c762cc6e4f42b48974a1477db59371 | 1 + .../objects/12eee91c2aeb4fb2bb8ca8f57a1aa1cb | 1 + .../objects/12f83b512e9343dbb83625ee46507555 | 1 + .../objects/1326d0571a5d445c941493c8a374113b | 1 + .../objects/13414ef48a3b49feaffba62b98a9043b | 1 + .../objects/134cfb2fc2f64b5ba17fac08b2f81604 | 1 + .../objects/1355efa054b54f3f9d7f2bdd616095c1 | 1 + .../objects/136e1e0793794be9a9656137d2fb6c23 | 1 + .../objects/13718cd8b1be44b5a61b785841d40221 | 1 + .../objects/13b03ad74d564429a4d31b733a30fade | 1 + .../objects/13c38a8267a14106a866c7bb3ed59522 | 1 + .../objects/13cd31f46a6e4175aa549a1d56cee313 | 1 + .../objects/1422f2be9d8b43cb96eef9df2884bb23 | 1 + .../objects/145ad8f4d231481399478a76b01a3082 | 1 + .../objects/147bb2a3b0364656be72b8260dec3894 | 1 + .../objects/14868b4d7ea1437bbf15869818a5c368 | 1 + .../objects/14a76d74c2eb4726aeacf80026db1e08 | 1 + .../objects/14b9c812ddeb473493422bbea5bb4de2 | 1 + .../objects/14b9fe06e46b4f36ab0a3965d560182f | 1 + .../objects/15445f2699884e8382dfdbce3fff21b3 | 1 + .../objects/1562935516b249e99233c3e7ba675946 | 1 + .../objects/15677a33fad4452cbce19a167cbab92f | 1 + .../objects/156a45b3621d496499bbbadb166faff0 | 1 + .../objects/1571dfbaa643493c87558f85919eb057 | 1 + .../objects/1577b1f5d2134c308cba79b337991489 | 1 + .../objects/157f966761dd40dd9159dfbfc3ab15a4 | 1 + .../objects/1599e9e3da744f479a7bbe09cc3f51c7 | 1 + .../objects/15a7382a7f584703b377f5510dba8d9b | 1 + .../objects/15be5142f099497093c82f9cc328843c | 1 + .../objects/15d366ab910840038f77c28edda94c64 | 1 + .../objects/15ee1c660016408597f37c575d98360a | 1 + .../objects/164f4af6c2714f5089e2e758669234e3 | 1 + .../objects/1672c99a86254edabb5b32331d117672 | 1 + .../objects/1690ad4a62234fa8acd83938831f806c | 1 + .../objects/16d634b706804a4c9c64f54c5b42dc8f | 1 + .../objects/16fa7863a68542fea81b986ff7657e15 | 1 + .../objects/170c6823b012424b96cc33b8f55834e7 | 1 + .../objects/17196c430a5642baa12416f6d809ba4b | 1 + .../objects/17238321af7946cfb5e5d6308ce81daf | 1 + .../objects/172974b5769c423a904847979d5b62b1 | 1 + .../objects/17752d7801bc42cdb27f94d8ca92acf2 | 1 + .../objects/17851978be124dd8af5af473c9965e8b | 1 + .../objects/179862337f95477bbc2c96fb605c8214 | 1 + .../objects/1798feda210b426dae3d8e854ad8167e | 1 + .../objects/179ea51a32834efda0cc7d44952230f6 | 1 + .../objects/17a5080cd57d4cddb3f80711accd4e6a | 1 + .../objects/17cba258169f4291ad28bde9eefbe49b | 1 + .../objects/17d6dbc20f974c3f95fc467d176e3238 | 1 + .../objects/183a30f87c884a0f91b34c3b81480f09 | 1 + .../objects/183b717353fe4a22ba8db39d09ecadd7 | 1 + .../objects/183cab914e404cf592cdd16995fdac8e | 1 + .../objects/184274c77914483d8122a04a28525b35 | 1 + .../objects/186b2934576e4c0bb0acfab91e82ba4f | 1 + .../objects/1875304fbcb24b2eacd58c1e4f98fecf | 1 + .../objects/1891cacc425d4026975f2374693af052 | 1 + .../objects/18a2d988c24644b6bdf0ec4ff570966e | 1 + .../objects/18b0ef18a2b44092a7cc9e5aeee3a6f8 | 1 + .../objects/18ccfe61638041a0b81cdaa51a7d0322 | 1 + .../objects/18d118dc2f074a37a771ac9bb7681209 | 1 + .../objects/18e4ed69659b45ce8850049015bcdc80 | 1 + .../objects/18eeca3212aa4cb2bef189276e67ca50 | 1 + .../objects/1907f1bddf9442ddad7636469b11f08f | 1 + .../objects/192be6c501164d41bc5a02d442d83141 | 1 + .../objects/197cb4fa8839482a90e4306503dcc69c | 1 + .../objects/197f96a72b6c48f1a53b7a53aac5890f | 1 + .../objects/1986fe42ce494d0ba9dc66a3b2e97798 | 1 + .../objects/19a4a802c34a4ba7a1af4d0483ee7626 | 1 + .../objects/19aa6ce5284e4c89adc4987d369c2c71 | 1 + .../objects/19ad771d6a374d1ab66744c35fa75720 | 1 + .../objects/19b1790df8c04380a7bf459ad10620e3 | 1 + .../objects/19dde2d371d440f5bcc4f7f0f860b922 | 1 + .../objects/19e00579bc744627a0a7807f6addad0b | 1 + .../objects/19fb9fdf14e347afaa090e759b2b90a8 | 1 + .../objects/1a07ed4712944843ba0a2467584139a0 | 1 + .../objects/1a23ef03e3124cb095480f8a5eef1419 | 1 + .../objects/1a3b9e05921342199a60b8323cfff90c | 1 + .../objects/1a53cd6a8464401ea915a538e87bfc85 | 1 + .../objects/1a5eb6a7dff0463fb7e290d271620e4f | 1 + .../objects/1a7328392f604c9aa151ba4a072e4aad | 1 + .../objects/1aa76370322441c8a6cd659a5064b8ba | 1 + .../objects/1aacbbbe2d7745fdb04c53ecd8098cce | 1 + .../objects/1ab3967a613c483bb1c3b6024c5ab63b | 1 + .../objects/1ac660accea14d96b32b0e537d6ee5c7 | 1 + .../objects/1aea9188c3ba4575a895cb55d31b48cb | 1 + .../objects/1aec1b66f62240318a76a407960086d0 | 1 + .../objects/1af4de922a4d448a9e2a178a6f2fbcd4 | 1 + .../objects/1b40019b8eea43b78a270ab6b315583a | 1 + .../objects/1b46c6b892224b379751ff7abd31e576 | 1 + .../objects/1b54f3c0b0484d4985def2bf170408d9 | 1 + .../objects/1b61b07dc1e34bd78980b5464b073d1b | 1 + .../objects/1b7c718f6a1945b48df3cb2e7155de06 | 1 + .../objects/1bb25c7da93b408c8e8b8a178f36c47c | 1 + .../objects/1bdd4caa86014ed899969dc2ccb032f2 | 1 + .../objects/1beeaa5de67a47d8bc6ab381c7b2b047 | 1 + .../objects/1bfbae8d035b4a4faaae4ea3427adb22 | 1 + .../objects/1c058a02534c47548d206f022858574c | 1 + .../objects/1c083abe10dd4dd9945e8e5e88ad12b2 | 1 + .../objects/1c23db554dfd4dba8ace821d1ed1e007 | 1 + .../objects/1c2a7320bee34929bd793fb87946f520 | 1 + .../objects/1c3f0eb408f74b759637e0393bcbd0ce | 1 + .../objects/1c47f0156ca541628f5cac06fb3daea9 | 1 + .../objects/1c5ae729b67c498aab0043e4dad934e4 | 1 + .../objects/1c5e108bcf69479b8b0dc8d716e9a628 | 1 + .../objects/1ccdabee8c92470690aae1285b2bc08c | 1 + .../objects/1ce48f94db1f43a3a1a47c9b9e21ba36 | 1 + .../objects/1ce9e5ad79e74290bc795c7a0ee594b1 | 1 + .../objects/1d0e1c20ad6e4e8097a17859442bbc0a | 1 + .../objects/1d22fcb261ca455493ac5c9e22ac6507 | 1 + .../objects/1d4ff19162424f3997bf47b967e0a8f6 | 1 + .../objects/1d544bd812c94de0b3d7b4b7eb02bfb1 | 1 + .../objects/1d5d27b49247454980c261961544706d | 1 + .../objects/1d62d28625674c8db1d2260a8cf06ee4 | 1 + .../objects/1d7b8b50ae894d4e811bc6cd9f1adcee | 1 + .../objects/1d9dc72495f94f0da0848df97f0c97de | 1 + .../objects/1da51258d2434d3daddd722c0a93ba10 | 1 + .../objects/1dd43e87b4d54c00a16787a17ea960d0 | 1 + .../objects/1de9bc80b7ee470694d17f5f4f200577 | 1 + .../objects/1dfbb4b8629c4f55a3ad0643bff8858f | 1 + .../objects/1e3ed5ae9b0c42619bd3fb6395b14f45 | 1 + .../objects/1e43194e2a66432e8d9a547c0bd4d108 | 1 + .../objects/1e925c8637944edc8db3ec0ab52708cb | 1 + .../objects/1ef5e25fed334ada8bf8df0e7a2dda97 | 1 + .../objects/1f1388fe2ebc44c7a663d380158adeaa | 1 + .../objects/1f456abad0a74152baf75d826415fde9 | 1 + .../objects/1f68280b25a9420090d3301d56344a0a | 1 + .../objects/1f74e3a6af6b4a5c9fd36e24a6787252 | 1 + .../objects/1f7b3121bf7a428c80475a7520ca2411 | 1 + .../objects/1f8a61241f8642dcb7e18a16233e46e8 | 1 + .../objects/1fca77cad45a47839dd4a86ca433a3bb | 1 + .../objects/1fdbc089f7cd4fa8b22238131241941e | 1 + .../objects/2017b06eec35465cadc472b41f47531b | 1 + .../objects/201c938705894afdb06ad4767d6e27d6 | 1 + .../objects/20314f5ccb56475e872090bccbb4c5cd | 1 + .../objects/206394d12f4446f196f45ca2757aebd4 | 1 + .../objects/2069cb68032748bdb4c843dcba1d76e9 | 1 + .../objects/20a39cd842134a94995f99a7bf39a43f | 1 + .../objects/20a4eab473924298b4f8fa9e68fc1350 | 1 + .../objects/20a5c9a238474d3888f315d871248a13 | 1 + .../objects/20af499ca8594628afdbd6beacbd6ebe | 1 + .../objects/20d5101761b845119244f9b12085985e | 1 + .../objects/21005ea335394ac9b16a9a48bba7455c | 1 + .../objects/21179a8845c349e0b9cb96457cdf2e03 | 1 + .../objects/213bf44395dc4d65b321179b82d210a8 | 1 + .../objects/215fbe69174d4e849bb8e017aa46ed58 | 1 + .../objects/217a3b4915f84a3aa2ece6538f4138ad | 1 + .../objects/218dbfa08ee645cfade2de39d3e8fa2d | 1 + .../objects/21b7fa5a2820481484ef48b601191e1d | 1 + .../objects/21cd3613baca4676b925b2a1ab68fa02 | 1 + .../objects/21ec0eaf4fdc4097a46288fc2a7491bd | 1 + .../objects/21f40ae9ac8f4e66a726338620d161ed | 1 + .../objects/21f448fc4bea45ac97756808a94e17a9 | 1 + .../objects/21f693088e4647238feb4bdbcf67515b | 1 + .../objects/2214745292124421a400189125431664 | 1 + .../objects/2238801fa7c444adb802a20bdb434a75 | 1 + .../objects/2274f20883f34149938129cdf3e8b5a5 | 1 + .../objects/22795e293e3a4a029d16f737c10d6c83 | 1 + .../objects/228741eed8bc46b3aa1d88dc98c6f0cf | 1 + .../objects/229e9e683d4846758979f4eb4439d8e0 | 1 + .../objects/22a595f5c92a40829c927b377cffa1e5 | 1 + .../objects/22a9d489f98e4b8dbd9b85880669b9e0 | 1 + .../objects/22eff58f8fd443e792899412b28b703f | 1 + .../objects/2319b8e3a9d64b43a33537ef499d024e | 1 + .../objects/2322d5762ceb4d18927048f08ff1e75d | 1 + .../objects/23818cd4df1a41c992ef41e7f0dd5496 | 1 + .../objects/239c35035c0540fabb0397c38d7bd3f8 | 1 + .../objects/23cc04f5ba3240c0af52fab2f570f258 | 1 + .../objects/23e1c25d503c4131a9bc809b67521b3a | 1 + .../objects/23ee272706794d1cbeb706c87cbff780 | 1 + .../objects/240f96e23c5c4f03a28af9702f6dbe05 | 1 + .../objects/2420937e7da1406f8fefdede431f4826 | 1 + .../objects/2421e0bbd3e648c39db4b05bf899d610 | 1 + .../objects/2430f8f8e8074bf186081ef60ab3bba7 | 1 + .../objects/2437dc143fd045e7a648ccf1dcbb5f70 | 1 + .../objects/243ed49769054d5897f18b039a919a20 | 1 + .../objects/2456764868464a4cacccdaec55188a33 | 1 + .../objects/2495d6f4e2e7403a96224503c5ed353d | 1 + .../objects/24a358e6fc564c738ab774063e072a9a | 1 + .../objects/24b5fce4f9fd4ff6b1a9819d0da89324 | 1 + .../objects/24e2ffe5c257417f9f1d0a1e49b879ad | 1 + .../objects/24ff43cd9d7b47d9ae6114da08315de0 | 1 + .../objects/253f86760a06432a9c343206b6305aef | 1 + .../objects/2565e37ab76044d88a58ccebbe8fc3e7 | 1 + .../objects/2572b49c157447bda7abb6863c99d4b7 | 1 + .../objects/2577b2a9f60c41de9a8482d89f4c9fdf | 1 + .../objects/258e599336ac46ea924e8761e6102712 | 1 + .../objects/25a3a2dc9c53447eb50155377ebc307c | 1 + .../objects/25aadfc0ec444bb1a1effe2e7e1891c9 | 1 + .../objects/25bfb20cc13741afb7ba71305f47e23c | 1 + .../objects/25c4735006e248b7b5af710bb4b6be82 | 1 + .../objects/25d881b1e1df49de8a89a36f23fae48b | 1 + .../objects/25ee9e1a73af435b913b0c3ac37a8eed | 1 + .../objects/25f93378f2974992aea95d6d74d857ed | 1 + .../objects/261c0e90f8c54728a02320cd4f2c73fb | 1 + .../objects/263e488ca4b84d18a2de685800c360a0 | 1 + .../objects/26583b2a94c14965bfd2791322ea9590 | 1 + .../objects/266bd8f381e042aca84a251182261658 | 1 + .../objects/2693aa0950ef438780b4a433aa3a4d5c | 1 + .../objects/26bfc6dc00854dacbed0599e9a1666d4 | 1 + .../objects/26c0b929756946c48e7b25a9cb0a2b2d | 1 + .../objects/271337ca44fc44b7b395206a54b82d43 | 1 + .../objects/2717a7790a21429eab85068c7fa27ed4 | 1 + .../objects/27529735feaf4b2b86a3b5926b8ea4a2 | 1 + .../objects/27545030ed694573953a6da2ea3d5fa0 | 1 + .../objects/275f86cadb28439ab97c65091198d8c6 | 1 + .../objects/276b3da0dfe54a9cb8f9d7484185f458 | 1 + .../objects/27895e32178a4283b5555057b7086957 | 1 + .../objects/27a0b8fa769c4d8bbd816638d634c3a4 | 1 + .../objects/27d1ea9f1ab34c58bd66d28b5c67fe34 | 1 + .../objects/27d7c07e33114029abcd505d6d2861cb | 1 + .../objects/281b2d2fd6b44cf9880fcc5212e63c0f | 1 + .../objects/281f676e61a74850b572fb220d5c75c7 | 1 + .../objects/2823689c62af4979969fd341ebf7e093 | 1 + .../objects/2835c091da70467c95ff65a5ca0a4829 | 1 + .../objects/2842edef2b8b46509adc5a26c0d14d9e | 1 + .../objects/284be7b911da435ab4d381948d028290 | 1 + .../objects/286e5faaac2c4a78bb931137fd825643 | 1 + .../objects/2871e28afe684f6eb532130d4a33a79b | 1 + .../objects/28bfb704149e4a36be5bd2d28b5fcf92 | 1 + .../objects/28c501899b924353a768b0868a7c7373 | 1 + .../objects/28ca08e3c26d40b883f0fccf13066b73 | 1 + .../objects/28d65bc4642744219ea7224bbcac21b9 | 1 + .../objects/28f0013e5bfa49ea945cc2982b7fa392 | 1 + .../objects/28faa66a4d384536ba76ac96429903cc | 1 + .../objects/295b908f0eca40d7bc58f70a16f75016 | 1 + .../objects/29883cf0e59945689a51651ec11cc925 | 1 + .../objects/2994dda0396f46a393dc92b699a1647c | 1 + .../objects/29bf619ddf2849d2a60b6f1a720e959d | 1 + .../objects/29cab06067fc4dd795f1fec938d5b355 | 1 + .../objects/29e63eb142774f3ab8214f8d62f99f07 | 1 + .../objects/29e97000164f4a20814d0b693696df9f | 1 + .../objects/2a0650f2c4ec465bb6f85b9867e0d4c1 | 1 + .../objects/2a0827b88fc54e81ae880227c3a433d7 | 1 + .../objects/2a096157fabf47ee9dcc0e610bf45337 | 1 + .../objects/2a0bd086f86f4ba28ca6e20a311304c2 | 1 + .../objects/2a312b999fa14279921b3a38b9d89be5 | 1 + .../objects/2a55fcbdab93457ca6e2d1302e235501 | 1 + .../objects/2a6ad635cc48420296eb7daaa512ac30 | 1 + .../objects/2a6cf6bab0884ae681bf445745a3ce2b | 1 + .../objects/2a7a270f0287474e8a9ad9b1c47be8a3 | 1 + .../objects/2a8c4f6e2422477aa6b44fff4e4ead64 | 1 + .../objects/2aa9c9c218ad4ba5b79322405ac37d3f | 1 + .../objects/2aac4a1ee2f0417c8fb285e1a2b00c3e | 1 + .../objects/2ab9cd6d900c400885319ef293621274 | 1 + .../objects/2ac3c30aa11f4c1794aaa3627bb0c9fe | 1 + .../objects/2ad01a6a1f284b62a4487e8be6170014 | 1 + .../objects/2ae00623e2e440c9a2e20e85c46875e1 | 1 + .../objects/2ae570de692641d48667adf038819be8 | 1 + .../objects/2ae747611fcd47ecaea1cf207cc17aaa | 1 + .../objects/2b086a1449eb48f6ac22f06aabffc9e8 | 1 + .../objects/2b224d01ec4646b6933b68545bffc5c0 | 1 + .../objects/2b2ccdf744574928b38308beba50c216 | 1 + .../objects/2b38dd7318f0486ab1f3e14c83c1d8b5 | 1 + .../objects/2b61527cf713494daf567df548a67224 | 1 + .../objects/2b729755e0864d2c8b34aba2ba0f40c0 | 1 + .../objects/2b78597df3fc42db877c40d15eb58f93 | 1 + .../objects/2baaa83507ff4932ad357da58eefbb48 | 1 + .../objects/2bc30e35f7a641909ac795d125bd7f03 | 1 + .../objects/2bc651b74b404225bd689543d3c63cb8 | 1 + .../objects/2bd69f7926b6448ba603fd64d9356a31 | 1 + .../objects/2bd70f754d234e6fa1c99b9e348f90bb | 1 + .../objects/2be203b9f83a4feeb07ae335a0d1fb27 | 1 + .../objects/2beb92b8843c418994cc0fdde07e929a | 1 + .../objects/2bf183a73ac94f16bb237258cf47e7da | 1 + .../objects/2bf60872f85d40eb993e86857eacc8c0 | 1 + .../objects/2c378523a72344639c7c188024e8d2c2 | 1 + .../objects/2c4e4015e6664913bcf1ca9b8b63be3f | 1 + .../objects/2c6a7e34124f425e89eec1e1a38404ae | 1 + .../objects/2c75a27db993477a9f3be6ef728d29bf | 1 + .../objects/2c9e06fb5c4447c0ab9aaec0b26b2d6b | 1 + .../objects/2ca3e04ca6d64b05b5bada4dec8dee9a | 1 + .../objects/2caa3ad2a89142548410db89d7023979 | 1 + .../objects/2cabea4b0811464d80e95750140a7c4d | 1 + .../objects/2cb844dfe7d74ed6873e34ba14d32d7e | 1 + .../objects/2cbdec1c411e4da0ae38a86979130bd4 | 1 + .../objects/2cc26e4085774c5a86ced0dde219bc65 | 1 + .../objects/2ce2a71bc95c44b597ee740fbaabe1bb | 1 + .../objects/2cedd8f1ccdf4da48415cde34a4c5555 | 1 + .../objects/2cfd551be5b944e6bbea29b1fa1d6c28 | 1 + .../objects/2d0155ff9f514189a981fc0bb7d66e2a | 1 + .../objects/2d027c64f81c4d2aa89092e3a668c5ef | 1 + .../objects/2d273f662ff046dfa3290f0f81201ed2 | 1 + .../objects/2d3094dfda02442ea81e8ae3236d9cc5 | 1 + .../objects/2d494173b21447e5a315e2cfbbcb741b | 1 + .../objects/2d547d6117e04d49a4e1ebe25f1f97d6 | 1 + .../objects/2d6dcbfdf6a64463a8e4f45798aa349a | 1 + .../objects/2dbb61e75b03438f916849dd6e20cbdb | 1 + .../objects/2df847e452394a30b56d267e08c2f565 | 1 + .../objects/2dfb8befa5784970af369cb422ebdbf5 | 1 + .../objects/2e00c7962be64e4fbb8f08fb8413dbb0 | 1 + .../objects/2e05c3553a9444cd86d4465796c1b8ed | 1 + .../objects/2e1455a7f58149f8a310d985eee77df8 | 1 + .../objects/2e4d43dbdc6748919c3357dafa93fa04 | 1 + .../objects/2e54f20697494e7a8ce6e2869d4c07ee | 1 + .../objects/2e550f6e52054f189462c19f3ea34040 | 1 + .../objects/2e8913e78c8f4675b5d9148d3321cede | 1 + .../objects/2e952fed941546b38e94933c0f37ebf4 | 1 + .../objects/2eb6dd30a130452f89ecbb3011cd7cca | 1 + .../objects/2f0463a4e87d4c328a00adbb41c339b9 | 1 + .../objects/2f1c3d5d6ebe484bbf2e98716adc0d6e | 1 + .../objects/2f20c385b4c74087b8659b4ffc72666c | 1 + .../objects/2f2c90666a5a4ba89ec7ea67ac594361 | 1 + .../objects/2f46df14bc4d4b2f9a77e37caea58eea | 1 + .../objects/2f54f22704064c34ab761432e1e2b740 | 1 + .../objects/2f5bb56f60f84ebb8fc466ba91388e59 | 1 + .../objects/2f6a626140fe42aa917d8a98c85bed8e | 1 + .../objects/2f6df8e873184c64918d8e6d1595172b | 1 + .../objects/2f71ef6226094ae8b1b8fba023c2481a | 1 + .../objects/2fc8dbdbb76e4415bb50144c1d9be622 | 1 + .../objects/2fd3411ffc464625b4988ca01e1a1819 | 1 + .../objects/2fe11c9fcf964352bc53664efc48a73b | 1 + .../objects/2fe41e4dfacc48ff91ae26be7b1254b4 | 1 + .../objects/2fe7c51b5a6a46588039679194e36632 | 1 + .../objects/2ffc85408e644cae820a2e9630438e75 | 1 + .../objects/2ffea8c37e7b46bc936d1e2380350e1b | 1 + .../objects/3006732d1daa4b7f8ccb4fb0b034bd89 | 1 + .../objects/3010740c90264bed8c10a0118d358a68 | 1 + .../objects/3030fea8893f45b5b469a5b9da627791 | 1 + .../objects/3043d5274624473993501407b9d0ef66 | 1 + .../objects/304665a442544859a8199719f7fd44bb | 1 + .../objects/306f819f7a524abdba39f839f952c26b | 1 + .../objects/30922c8784bf46bea8b29181d25a1f31 | 1 + .../objects/30bcf65b36044bd5bfb1234f3bca55e8 | 1 + .../objects/30cccdf5e0e5417a982b5e830aa33127 | 1 + .../objects/30ea609e62ce4a328e3b7058a755223b | 1 + .../objects/311ab37580e64324b25b55013aef1233 | 1 + .../objects/3138ed5129414422b9a86b312179e54f | 1 + .../objects/315eef7105884c64b3e291e12ef7f9b1 | 1 + .../objects/319b259d03c5498e98699520737d8a67 | 1 + .../objects/31a8c95d80334668a44df11d4fdf63e7 | 1 + .../objects/31b4825d9af94f98904b9d818774fcfa | 1 + .../objects/31b4a90980d44876a693fc09bf9c000d | 1 + .../objects/31c02696de3b494aa990b3d072b83745 | 1 + .../objects/31d0e4eb28cc4dfab36531fdce3c97da | 1 + .../objects/31e18d5a927b43ec8e64acea9aaea29e | 1 + .../objects/320e1c099939491eab84a309ec4d16c2 | 1 + .../objects/32106b19895e4c808d6cedc749da0aeb | 1 + .../objects/323e19b02fa34be4b11f1825bdcf6999 | 1 + .../objects/324dac9d083344b9a8a09087321cd342 | 1 + .../objects/3260ddcae44849efa4ce3fa88387f265 | 1 + .../objects/328b39136b8b40739566a4a47d7835b6 | 1 + .../objects/32b594a65569417b8c16472687c8f79c | 1 + .../objects/32c9922e3e374cbfb6bd82c8c93d8b88 | 1 + .../objects/32ec63865a6347b6856f661fde492abd | 1 + .../objects/331897c854ed42f58ef5b715c4832943 | 1 + .../objects/3336a42ff0e14014bfb7eed5b4a83035 | 1 + .../objects/3355aa20f92e471195392a373d5d2200 | 1 + .../objects/33859971440742268686006913964914 | 1 + .../objects/33a3830f717f4d05bda05eee1e262e44 | 1 + .../objects/33b14ddbd26341ccaf9cdd82ef41412e | 1 + .../objects/340ef81813da40728c75905191428fbd | 1 + .../objects/341f4d4d95ec4350be807a6088444cab | 1 + .../objects/34242557cc314c7495e4fe4a9de6b1ce | 1 + .../objects/3437e1822fa648e9ad5969ab40ef1bbc | 1 + .../objects/344e7f9a9e074c1cb2b1560bc96b89d4 | 1 + .../objects/3452694c129a4004b248bc0159160bba | 1 + .../objects/34615851838a4fc2a6735d145c3607b3 | 1 + .../objects/3479e5e51d7447098f145c326a361c7f | 1 + .../objects/347b75a65214484ebb10ed2ec4e68008 | 1 + .../objects/348634fba0984ea69b2fff0ddca60260 | 1 + .../objects/34a922643cc3455a80f6838c9ee947d7 | 1 + .../objects/34b8277237974690aab360f8d7eca2b1 | 1 + .../objects/34c594720caa4b1889e1c15f4184250d | 1 + .../objects/34c883e5de024c6eb4f038f7da7b6225 | 1 + .../objects/34cdae7a0f934864b5bda0ece66a8bb2 | 1 + .../objects/34d14b5678fe4d22a9fe5540c2e0a4be | 1 + .../objects/3528a625028e459eaf21eda16a6ee63d | 1 + .../objects/35765abb90d74f72bc3539676b7f4a33 | 1 + .../objects/359bd54f3e354142b318d4f74b9d0382 | 1 + .../objects/35b202a4fe3c4e06b8e1176d11ec935a | 1 + .../objects/35cbb2f37db445ddbd0bc87644f4b631 | 1 + .../objects/35ef425f7f5743e194589d279069a7eb | 1 + .../objects/36155953bb7b4b43b279987f826d4f80 | 1 + .../objects/362fabea7b0e4536a635117ac0685c8d | 1 + .../objects/3631cf531c8d4680b3e79840158a67e1 | 1 + .../objects/363cd55b8dc24e6a80801be55fa738c0 | 1 + .../objects/365b8f9631ee4800a00774f50eecfb9f | 1 + .../objects/368073ed73b9449991c74bc3030f3953 | 1 + .../objects/36c13426cc29424789a8dcde8ee35b81 | 1 + .../objects/36c68181da644e6fb259c99c4aff0baf | 1 + .../objects/36c77e01bf0645cc9cf96196422ed5e2 | 1 + .../objects/36e08578cbda4fcd9990fa9443e518a2 | 1 + .../objects/370e01343137415fa7c4475d3b4a2a53 | 1 + .../objects/37550c9c6c4840e0b575bb8449d96b0f | 1 + .../objects/37570e27e8454b4c93a3dcf93bdf0ffd | 1 + .../objects/375edc826e214c33a9f6ae4809ae54f1 | 1 + .../objects/3763229693f44aae8e8516d87e968545 | 1 + .../objects/37652606632041ae94dafc574c8a31f9 | 1 + .../objects/378385fc3ac441e590419813ee6b4e1d | 1 + .../objects/3792c7b5893e4c759e461db43b15ede3 | 1 + .../objects/37a7a166c2b54f4bb616e0772942dcd5 | 1 + .../objects/37ab6256ac2d42b1947e297db877bfd6 | 1 + .../objects/37aceccc96fe42c993f9505b8e1ffa8c | 1 + .../objects/37c0cc29ce9446faa205159164e09c77 | 1 + .../objects/37d26144d56d463ea884d28e314bf283 | 1 + .../objects/37e59c4ebd6249c0a43585681d0c47ac | 1 + .../objects/37f2ccdc38684b9da8b2dfd3de44ad82 | 1 + .../objects/3814d9bbd1454cc5af52b07f8766cf34 | 1 + .../objects/383d91819cf94bcebec6628332250256 | 1 + .../objects/383ddd25465445c4ac81ebb5f27470c5 | 1 + .../objects/38449e3bc9e74077a3f03870bc6aef02 | 1 + .../objects/386fdf853ac44574977228bdf6dfd0e8 | 1 + .../objects/38895d699d1740a79e44b1c3bc7f266b | 1 + .../objects/38a5fa7942224c5aa53738e1e0c91978 | 1 + .../objects/38bc4cfd1b2a45ff8bf7dc64c2747f6f | 1 + .../objects/38bf13aa60074d2d90e519de8f35d269 | 1 + .../objects/38ef259638e140628deca5529f9a6883 | 1 + .../objects/391d323bf85a4fb0966ce286a6923a9d | 1 + .../objects/3936ab1b21784256862435fbdbaa5972 | 1 + .../objects/3937958e20b44a3ea6cb9cf456ad8717 | 1 + .../objects/394026f0211c4817ac7ab1e553509e13 | 1 + .../objects/395bc488aff140a6907a585d795d5fe3 | 1 + .../objects/39624fcc12244c7db3d9be976b20f7d0 | 1 + .../objects/39717f7ee3d74dcf9ac215b0ccdcbf3b | 1 + .../objects/398963c394a1425cafe7117a6d2fab34 | 1 + .../objects/399a52b2d49744509aa950241c1af824 | 1 + .../objects/39ba24bde1b04178b526feb917cb2655 | 1 + .../objects/39d30b80ff694dd78a2464e1f5ce97b5 | 1 + .../objects/39d77d4f8f8042ad86d4838554502048 | 1 + .../objects/39d7d5d1791d42d7af216021cef2af42 | 1 + .../objects/3a0958497c68456498e96badc989afc5 | 1 + .../objects/3a1ee22df0fc45e4a4e89711b1c7b4db | 1 + .../objects/3a1fed5fdd3b4777aa03bdef8b39f658 | 1 + .../objects/3a5265b016e94506b8ae76f6e0e4e5d5 | 1 + .../objects/3a7d0f3d2e4d4a84979ae141dd480b0e | 1 + .../objects/3a7edc9b0d7c4641a0e272bbe62a2121 | 1 + .../objects/3a827caec4e345f1a7c64de539aa9093 | 1 + .../objects/3a8c665f1e0c445aa733a8326293edce | 1 + .../objects/3a97775bea824ef4a828e3382698f931 | 1 + .../objects/3a9d2e18235d442d8df87bf7f430bfa1 | 1 + .../objects/3aaff465e6c645beb9819bc4d954b9b0 | 1 + .../objects/3ad20553da7f4defb8efe9f6f7aa56da | 1 + .../objects/3ad7d83445ec4214ba2fe15aec7f825c | 1 + .../objects/3ae143d9ecdd46d08b398a641b1350f1 | 1 + .../objects/3af7bdb1877a4acfba07189ce3c2a948 | 1 + .../objects/3b0f7533a5194905abf879c81d1f92d4 | 1 + .../objects/3b462c4c5c46439ebc3dcf5d91a551e4 | 1 + .../objects/3b70e72b51f943bbb0c0cdce41e5a67b | 1 + .../objects/3b7fc6f907b940608587791a393a3f71 | 1 + .../objects/3ba56946a98b41ed84eb969fbf67c0f1 | 1 + .../objects/3bbdd0e402f84f7f824ba9f445972e06 | 1 + .../objects/3bd4efca11bd4da6ac833207ea6e9d58 | 1 + .../objects/3c1203c79aac44e4ab500ceae51fda18 | 1 + .../objects/3c1dc3d61d664989b1d5d98ccc94a7d4 | 1 + .../objects/3c30acc12df0475d9d25353125117ce9 | 1 + .../objects/3c47e1414d754dd89942b43dbe492a77 | 1 + .../objects/3c9e44ea62fd43fd82012da0b274f532 | 1 + .../objects/3cb088eb44134befa7235d31636ee4ec | 1 + .../objects/3cb3bffe356a450a8af8d9d03bba1cca | 1 + .../objects/3cb9dce9c2884dd89e136d9ac1609c76 | 1 + .../objects/3cc60894ac7d40d58f50016b66f3edf8 | 1 + .../objects/3cd0b0e5feec483393881f93648195e9 | 1 + .../objects/3cd36a5d38d24176bb1c18ac2a9ba2e5 | 1 + .../objects/3ce982b5f31d49b78e2b4908ea5161e4 | 1 + .../objects/3d1ab7cd48b04c5faddfcf2eaa8d54c4 | 1 + .../objects/3d2064fb2ba744a7900e1f21c967c8a9 | 1 + .../objects/3d56d60ccb1048838179c26bb149b118 | 1 + .../objects/3d682db67cfd49f4a56ee84cba1a3aba | 1 + .../objects/3d9475f3277d4f4495b55016989b7ad7 | 1 + .../objects/3d9758e56d804551a67d9c93d7e910f9 | 1 + .../objects/3dbf821cbdf54e119a5a8f19be800be6 | 1 + .../objects/3dc07a8751fa41d18695d28f8bae6f01 | 1 + .../objects/3dcbb7ab9589490aac5a0eafaea6ff3e | 1 + .../objects/3ddf1e96f09140d69dc3898bbab5aeb4 | 1 + .../objects/3de8afce025d4ab78941156954e1fe08 | 1 + .../objects/3df8bd8dd8fe48a7b25ef6f2afbe64cb | 1 + .../objects/3e338be95e914b6d976c25729699c9de | 1 + .../objects/3ee6ad609599482b8290b3502af5baab | 1 + .../objects/3f026d2c9ef1408b9214b0a481c0409c | 1 + .../objects/3f0b7ef6af4843c384636b5c5912b353 | 1 + .../objects/3f11fbff2fce4c138cc89aadda3eae80 | 1 + .../objects/3f2c64d675834b8eb2478b6391280bd3 | 1 + .../objects/3f42d99f527e4832a6e4924e00c39027 | 1 + .../objects/3f47797938af45c9a8d0166091076527 | 1 + .../objects/3f5a5ca8dee6462e9e724134d8bc24ad | 1 + .../objects/3f6aaef6ac7e4b359f06a13de0550ce4 | 1 + .../objects/3f86f19c26fc4bdcad812ae128b98bae | 1 + .../objects/3f8d7c85dab54993b771c71d95ef1914 | 1 + .../objects/3f929f73e48b409db34735840e5ffead | 1 + .../objects/3f9b7f43a3504daabfc5bc3a82a846a4 | 1 + .../objects/3fcb604234304d8981440a47fc4d6eb0 | 1 + .../objects/3fd252d8bdfb444ab817ce29a50840a2 | 1 + .../objects/3fd2de1024624619acd7559e0694e337 | 1 + .../objects/3fe5a3c553f44c2eb84b3f97b53f0dd1 | 1 + .../objects/3ff24a3660114bbb95904c9e5e9fcfca | 1 + .../objects/40163ecd721b4d64994b57ceded1c4c8 | 1 + .../objects/401f1b93586b41ee80dfc209a499c3e0 | 1 + .../objects/403104f26d12466eb8474d767306b0f6 | 1 + .../objects/403433ba01d14a42bbbc0090a681abe1 | 1 + .../objects/407c7fa3461f4afb9cdca21e0a5d839d | 1 + .../objects/40b33a96aed4494b8ed10d3f888f5270 | 1 + .../objects/40d396935c77494fafbb0e491bf7289d | 1 + .../objects/410d6411962b4539b4409bad656890c7 | 1 + .../objects/410ee29e3c28404599dcc6fe91100e9c | 1 + .../objects/41236116e878492ea90082572f06b9d0 | 1 + .../objects/4143516f40fe423fb590cd0482e11f97 | 1 + .../objects/414e5aa31eda49e199a741669f7195ae | 1 + .../objects/4156e9a7ae2f428ebf2e0f0c2a7aee10 | 1 + .../objects/41592021ced9450c8d202f165cc4fa19 | 1 + .../objects/417d40602e3f4383ab08060231c0e832 | 1 + .../objects/417e52a1df454ddb8d2a1861122cfdf5 | 1 + .../objects/41881608284e4a938016cee283d7afa1 | 1 + .../objects/41941cbfd2ae4d9387d4290425ef926d | 1 + .../objects/41d80542c03a4d9cbe46a0930b5285fe | 1 + .../objects/41df6df443e2456c8597ff38e7f313ff | 1 + .../objects/421f8077b6b44cc090f8869440699db8 | 1 + .../objects/4225286bf7c144e58eb15eeaa8e6cedc | 1 + .../objects/422ef93e38b441ebb4df422f233fe0e2 | 1 + .../objects/4236b2009e7245d78521ea6f656a29dc | 1 + .../objects/4238be1b4dc246d995c1d7c1d1272d63 | 1 + .../objects/429bd1edabe04863913ccc47284e8c27 | 1 + .../objects/42a770a19051461eac80b2d01fc3c079 | 1 + .../objects/4322bce65d934f52843f4ec4bd29e16e | 1 + .../objects/436568615ed14c5daceadf25d700c3c0 | 1 + .../objects/43764206920a49c39aee86afdae73241 | 1 + .../objects/4383fc15822e49deac67387b5de4e309 | 1 + .../objects/438ad1746f3d451a9970b13d518db645 | 1 + .../objects/43baa850d304454494e9c7422981ef0f | 1 + .../objects/43bc52426b884509ac23a9beb8d2dd65 | 1 + .../objects/43d0a2526d1e431cb47b4622fdbe2426 | 1 + .../objects/43dd339d1dd24ec0826a684931097d55 | 1 + .../objects/43e45202ab3e43ceb10618cf70b652f9 | 1 + .../objects/43f301cf305d49438654a5676f5ffed5 | 1 + .../objects/43fae22f88a041cd93e1053fa3fa63cb | 1 + .../objects/4425f804fd284b39b5b657e5135f755c | 1 + .../objects/443582f1fe514cbc83c651c02b98ef4a | 1 + .../objects/444950d15a2d4c5fa6880f241a6cf514 | 1 + .../objects/444f53392f364d3bae7d510a73997321 | 1 + .../objects/44974c7857214d8c81ab3cde0f9cc6fc | 1 + .../objects/44b6c38282444725af6aa0a4f31088c0 | 1 + .../objects/44dd127c433546a284f67be4f69b4ce8 | 1 + .../objects/44ed56b9d71145cfa118fd02e3f9a3cf | 1 + .../objects/44f964caff254ca3ae5011536199221c | 1 + .../objects/44fe353cca964b6f854e9b2f27beb731 | 1 + .../objects/450be7b46ac541d4ae9d9161d6e4fb24 | 1 + .../objects/45241695583247c59ee044b9f568292f | 1 + .../objects/45358b04529f4caaa03a2d2cb64ad789 | 1 + .../objects/45384b7e800f4a5383d7fee7269aab1e | 1 + .../objects/458c523f452649ff9aeefdf3c3f57f23 | 1 + .../objects/4595b03ca78c4375a5acf7ac6fd3bd73 | 1 + .../objects/45cb3da065f540189af64567f33bc223 | 1 + .../objects/45eaa9afff1748ce960dc5d67f0c83f9 | 1 + .../objects/45f05b33567f4d1d948f6a8cba52f0fc | 1 + .../objects/45fc9b495ccd4aef88113bc2557e59aa | 1 + .../objects/4632566c8572487cbbbed72c68b9ce18 | 1 + .../objects/46374662098d410bb4ab4e0cba88e037 | 1 + .../objects/464ac0496d9a4d22a79ac17fe81c3086 | 1 + .../objects/464c63fb36524dfc882050c47043977d | 1 + .../objects/4656c33054fd42eab73545864f503950 | 1 + .../objects/46625d8c3f55408f96f8c98c1d6c950b | 1 + .../objects/4678532496c1495aa6d01c06ce375794 | 1 + .../objects/467a156f908f4e88bd7c423f7abbc0a8 | 1 + .../objects/46b97d22a5b04a74985e1990bf49566d | 1 + .../objects/46c5ca92d1214731992de5ec1d2aed9f | 1 + .../objects/46ca050ee3af4652b94cb2706a0d2ba8 | 1 + .../objects/46e1fd5c65494cfaa412d16af20c1f14 | 1 + .../objects/46e4c07cc326470aa5d6050eec74ba56 | 1 + .../objects/46fb91b403ea415bbc9d86eb1fe12bc3 | 1 + .../objects/470552fb2df644469d76171768ad2f6d | 1 + .../objects/4730bdfa3b604e71b68e30d37f060eec | 1 + .../objects/47352a3d8744478aa4514bf6fb875576 | 1 + .../objects/474a3d4ff7e046f483f6eae01d55f36d | 1 + .../objects/4772ca6070bb437695f8bf7c88911b53 | 1 + .../objects/47a50244af4d48f8adc5d1f8e3ce4d8b | 1 + .../objects/47ad1d7bddae45dfbacc4166b14518dc | 1 + .../objects/47de8ac6c8f34090a50af62c6821a8b4 | 1 + .../objects/4803687b289846b3babc3235c0ec026f | 1 + .../objects/48300bdec8c74d978e7e333984de3854 | 1 + .../objects/4841de4761c64dbe937d0be1cfc9b079 | 1 + .../objects/484a6f992146482e8b5d2922568a4573 | 1 + .../objects/48600c6fcb644d408299fd39480fa32f | 1 + .../objects/4888b060196045fe9062c9a87bbf0119 | 1 + .../objects/489ed0b4aaf6455c982f557c9a4478b6 | 1 + .../objects/48beb6cf03e5498a9c3366d61ee613c7 | 1 + .../objects/48c93f4f8f43434c88bb002146d89b7f | 1 + .../objects/48d44164327142fab97beb9550ba2c91 | 1 + .../objects/48e5bd54584c4a63bc0ad4bfe50df212 | 1 + .../objects/48f99b54406a4c15a55d4ae2759266e5 | 1 + .../objects/490fa75ee2534d6e8e201309ae0bd310 | 1 + .../objects/4958f7dab06b4657ac1217ea4baaf8e7 | 1 + .../objects/495e9f28a4b24c4fa43f30a3e7f1f188 | 1 + .../objects/496b41a23d524550b37ad33e48aa4a5f | 1 + .../objects/4970b61d4c4143d4b44b3ca55d4321cd | 1 + .../objects/497b17b805fe40739ab0c13634013260 | 1 + .../objects/497c65450bcf46a98d51fd168b663416 | 1 + .../objects/498ecd00078045ed93aba5d61e531503 | 1 + .../objects/49906d104cd54ecda02a3770d0d48b5d | 1 + .../objects/49b527ac65df4b6fa2ed701d44602a91 | 1 + .../objects/49e0386fe0a5451d946b8ec2c8a3d374 | 1 + .../objects/4a20f87e9a0540a5996e4d43d4c968d6 | 1 + .../objects/4a32944a14c9492d84d25ea53c785d2d | 1 + .../objects/4a3c91e8b4684f98893f5829735ccd88 | 1 + .../objects/4a62095ad31c47149f62cb3c41e35192 | 1 + .../objects/4a78e264f9844d64873e7da973677a2c | 1 + .../objects/4a866a579b4d4c9398104232b173efd7 | 1 + .../objects/4ab7a880686a4b46965e388b49210188 | 1 + .../objects/4ab805816b2e4493a14c14067f6ce793 | 1 + .../objects/4aeb3b7368a14a029c06f7fdfc73543f | 1 + .../objects/4afb1af1746644f08d0fc91b51877942 | 1 + .../objects/4b31fcf9e5c34ad59f59f6ad84f9948c | 1 + .../objects/4b56b6bf0bf542218b5b2c278fdb4267 | 1 + .../objects/4b5ea06eb82544dbb9a6039e5bdc43e9 | 1 + .../objects/4b62a54d74224135aeb893a2e58de0ea | 1 + .../objects/4b6991127dd0435fb99bcd99a65e5881 | 1 + .../objects/4b7044a11ddd4968b42c99eb0228ccb4 | 1 + .../objects/4b84489fac96457c8122bfaeae32b664 | 1 + .../objects/4b9304fe60ee4f27bd78ee8c5b798a09 | 1 + .../objects/4b9f06271c6240e18b053098903f95fd | 1 + .../objects/4bbead2af7064b6ea3823d66a8b462cf | 1 + .../objects/4bd4d494863b46c69ecd5b3789a74cae | 1 + .../objects/4bdb09bcac764deaaba88ec9c49f1a2f | 1 + .../objects/4be61d0252cd44da9bd53721701c7546 | 1 + .../objects/4c374add71034ec1bb37a0b0063f33e1 | 1 + .../objects/4c4701ba1e83431bb842fad29c5e688a | 1 + .../objects/4c849477d454447780e6e33eb9a6b57a | 1 + .../objects/4c989e09ce5a4d618653d166a364573a | 1 + .../objects/4ce70ab514c14bf08a898468298058f3 | 1 + .../objects/4cec25a9d2be4625a59739144b8c0330 | 1 + .../objects/4d1f9ad26ac143a289c3bbbfc1b73866 | 1 + .../objects/4d26ab56ae2e45c2b344d6ae5351b458 | 1 + .../objects/4d31b26106f74123bb3e508b924d3e8d | 1 + .../objects/4d49374d355c4b8caa804782c28489ec | 1 + .../objects/4d512b03ff8340bb8c031a5763a5ebbe | 1 + .../objects/4d79b613f3e641d7b1f92e5a9ba1df39 | 1 + .../objects/4d988c2674834c65ab3b4b67cd6404b8 | 1 + .../objects/4daea454d9764e36a294eb073155be54 | 1 + .../objects/4dbca15da2de4bcd857e4ee8ba60d64b | 1 + .../objects/4dc17edcf8354acf804cbbd3d9fa7f2b | 1 + .../objects/4de48975e65a41efb389bbea26730f54 | 1 + .../objects/4df9624ffcca42b481c9bb5587b43ae5 | 1 + .../objects/4e04d30a852a4550bf1cad92a21215a3 | 1 + .../objects/4e0eb0e4f243447b8811734ae26790f9 | 1 + .../objects/4e5c75f95a0f404f9cf24a59ac3b91f0 | 1 + .../objects/4e6c0a56af124fc8886604356f2fdf7c | 1 + .../objects/4e6d915ea4d74c30b9ea02d076677e18 | 1 + .../objects/4e8244d631e54e95aebda0f3492ebc22 | 1 + .../objects/4e92e6f1b96c411d9d163b9700fc0b96 | 1 + .../objects/4ec5ace427244a74be7f5939101198e9 | 1 + .../objects/4ecb18187cc04b1b8eb1340f7086e76e | 1 + .../objects/4ed63b5935c74db083911de0feb5bb59 | 1 + .../objects/4ef5e5ae63c2403497825dc37d3366b5 | 1 + .../objects/4f196110bdd4452592efc4bdf6bf96db | 1 + .../objects/4f50ab62c80d48f9b820bfc4c6f77f8f | 1 + .../objects/4f67896b977a4b4ab8511f78c0ffb575 | 1 + .../objects/4f792c74ddbe4003bea14449e3fcb4ab | 1 + .../objects/4f9ab4b8ecf545a5b932e93784dc3e61 | 1 + .../objects/4fd217672d9347bcb2a953eb2f048a41 | 1 + .../objects/4fe575af917e43129d19d70d0649b1b1 | 1 + .../objects/4ff33f79848c49638f6021486e0bf989 | 1 + .../objects/4ff991eee9484bf2afe697c8c30484ea | 1 + .../objects/506077209be54545b03c4ff494613acc | 1 + .../objects/50719cf6c26848eabbca4dce6f317cd2 | 1 + .../objects/50cd27cba6674dcea03d0fe4991051cd | 1 + .../objects/50d7323a9aae4512af65aaefaaf06066 | 1 + .../objects/512b0867a8c249a9b5af42032821be06 | 1 + .../objects/5137a9f2e92943029998b34edacf76a8 | 1 + .../objects/51883f17088f4a65b69e227a1dce851f | 1 + .../objects/519781fb31834184aba6f1fce5ac8d37 | 1 + .../objects/519bbcb085144c7f9754cb26a60ae02d | 1 + .../objects/51a6e05ba5ca4b9f92c85b77f013cbee | 1 + .../objects/51e30b35b7e24ee1b0ce79638439f823 | 1 + .../objects/5200942825484e12bf2ed6276c0a7de9 | 1 + .../objects/520cebec035041f1b818bae9ea75a79f | 1 + .../objects/5216fe2bdf454cf99675887794a6c4b2 | 1 + .../objects/521fb2d9ad094cb6aa86db6ea1c38f7f | 1 + .../objects/524bcf87603640b3aada0a2a687b60ec | 1 + .../objects/525233084d474614a1d66e10d2a2029d | 1 + .../objects/525cb0888a4e4099a209c8cb617a0308 | 1 + .../objects/525e336360e34bc88a431d4900126789 | 1 + .../objects/5276d6899e4c439c9ac2d84b20a7a3b1 | 1 + .../objects/5289f01e70b0425eadf21a55e7a6faa7 | 1 + .../objects/528c64adaa934e26a29c98632424e58c | 1 + .../objects/5291e1adec814d9a82c4205b73780a56 | 1 + .../objects/52c66ac75842448cbc50aacd6c600103 | 1 + .../objects/52c93478655f4c3e9c253164d04ad0d7 | 1 + .../objects/5301bb39d2e94b9ab18a6f87d89baf42 | 1 + .../objects/532b3b9693e64d628791a24be5c8f3e5 | 1 + .../objects/5333d41632654e0eb73bdccd34243713 | 1 + .../objects/533f8cd0d2bd4e74b63fc7272cf0177f | 1 + .../objects/5340c159bec243b6b29461e6385e288d | 1 + .../objects/53653a55e7bf4a88b9bd35d75da480bf | 1 + .../objects/53870c159d994e28bc11eea4239ccbea | 1 + .../objects/53abec6cfbf249d88e1f133bced5353c | 1 + .../objects/53bbfde791b0409991d9efc50b9ecdf3 | 1 + .../objects/53f06b3b69944ef78f9601c3caac5162 | 1 + .../objects/54086f03bf124a31a586d8797bb45f7b | 1 + .../objects/54210252060d4e27830d87120962e72a | 1 + .../objects/54275e0444684b458f520241909423f1 | 1 + .../objects/544482fe022846d09a0a1c9007c8b872 | 1 + .../objects/54497a140074425294bc3401babf7690 | 1 + .../objects/544d100d6d9b4740afc48e5e5a9e41d1 | 1 + .../objects/545bf0e5c2f64f14b012ba5441aba358 | 1 + .../objects/5480d046236e44f38fb8e726c2603ddb | 1 + .../objects/549aa65d96a7441b99633a352ae950ba | 1 + .../objects/54a196ebfdca41459dad52e0ed76d43e | 1 + .../objects/54ab8d7e780749ad9d40fc1d32932d77 | 1 + .../objects/54bba7a88e624f3c969ee3970242d5ca | 1 + .../objects/54bf5c44441641bb87a5b4c344587629 | 1 + .../objects/54d8c83f860f4d2db52da64972a8b1d4 | 1 + .../objects/54e0508982824dcaa10ffc309b60dc36 | 1 + .../objects/5503cfde5e4e40669f6ee53d12372d9d | 1 + .../objects/55216c46b69a4868bc3d9bfad1c93e59 | 1 + .../objects/5536400f52ea417eb818108eb352fd19 | 1 + .../objects/5554ec0bb8f740d3977242c824dd1b40 | 1 + .../objects/555a89ab5e8142ed9f514270819a5409 | 1 + .../objects/557245ddc68e4f37a50e412c0e6668a7 | 1 + .../objects/5578ef7811c949bd8ab602e255982c28 | 1 + .../objects/558c690d32ed4e64a7a3ba15d0249eeb | 1 + .../objects/5596ca8c3ee140fc971e3af5409fb19d | 1 + .../objects/55a05d64e10c483bb1c085ecf284ad42 | 1 + .../objects/55accd847baf40df840e1ae8278ae6c4 | 1 + .../objects/55af15e7163d40849337ba2bb8521673 | 1 + .../objects/55b02fd111d944efa45346476dc2b711 | 1 + .../objects/55c97985769c4a9f90e92fea7e83e1a9 | 1 + .../objects/55d73939d3a7498aa7541c9e14f85a7b | 1 + .../objects/56043f9c24814c8b935942c9f8fa161f | 1 + .../objects/5607e0498d6247b5b492f0688493d62d | 1 + .../objects/5623a1097ba64009803111477df05ee1 | 1 + .../objects/5635fa8fd5af406c91fc68df8d54eff3 | 1 + .../objects/5649c60638de4ac9b710942dcbce4837 | 1 + .../objects/56623f08fde8485e92be697bf094054c | 1 + .../objects/5664f8dcff8b4b08932f4321bebb0b76 | 1 + .../objects/566f1bc3130c412394c7d4d3e6ac1a79 | 1 + .../objects/567a3df6e4be4339bc0e0c918cce48f0 | 1 + .../objects/56ab027afa8e45a3837b16b3d096906d | 1 + .../objects/56d2144bf1f64ccfaa6a27bd10cd0a01 | 1 + .../objects/56d87280c6204f04953dc8fba9717928 | 1 + .../objects/572a9b4626f24773aaf42ae042366aef | 1 + .../objects/572c846e7da64ca09f2209e54e484f3d | 1 + .../objects/57533d3ece2f47218a2f301829072a0b | 1 + .../objects/576948ce76c946518abd9619b7cd0ee4 | 1 + .../objects/57913205abb241759ad6c9e6989acabd | 1 + .../objects/57b845b1dc1347e8a8a234cf96f49e89 | 1 + .../objects/57c31bc6919f4f08883ff12ef8f7f8c5 | 1 + .../objects/57fcf7ae48e94160b64eb12345eab576 | 1 + .../objects/58043898555e49278f719deaddebbe15 | 1 + .../objects/5821ce747f0540c39ce487bf9fbb6022 | 1 + .../objects/582dac05b22b48db8c5519603f23e7eb | 1 + .../objects/5887762d30c748c2b920cf5ce4af5a17 | 1 + .../objects/5892ecdbfc15484b983119a164047a05 | 1 + .../objects/589df78fdb564a5a8f32538c82c4f1d6 | 1 + .../objects/58aa0448f5e9475a8106fc6182dc7172 | 1 + .../objects/58b8871fc0dd48d7b47a0fb14bab1eb3 | 1 + .../objects/58dfb146a24741cdbf9d360800cafc50 | 1 + .../objects/58e7fcca81bd4130964aca1ea3255f98 | 1 + .../objects/590b16d7c18f40d79ea70440c5ef8379 | 1 + .../objects/596713d0937b4b798117f09b9824c1a0 | 1 + .../objects/596abfef69eb42459bbd56d75bf5c3da | 1 + .../objects/596bc55751c646278e6230befc24da44 | 1 + .../objects/5980f20bcd854a02ade48f3e07cc9431 | 1 + .../objects/599d97fd26c240ec87fddb46bd7d6de8 | 1 + .../objects/59ada40882a040c5b5ca23d4bbaadf84 | 1 + .../objects/5a20f180bdff4fce918f30088d02ffd0 | 1 + .../objects/5a3ee5c97cd44fe9aeeabadff53cb49e | 1 + .../objects/5a855a0f9b33458e8fa7972b8c76bccd | 1 + .../objects/5aa7967414104cef8f710b26f236c6d0 | 1 + .../objects/5ab19fa76b1f4753bf885f50a5804bb6 | 1 + .../objects/5ad4a09e0cc44ef9aba41ea9641d9dd5 | 1 + .../objects/5b33654e9ca3425ea7e3f7e926ad937a | 1 + .../objects/5b48a32d941e4e5295ed8b2dfac315d4 | 1 + .../objects/5c0a9c4c110f43a1b29251cf65fde479 | 1 + .../objects/5c83f07d75554951b68a72f619a71c1b | 1 + .../objects/5c9149de46624ab98e9e9eed4bcd25a6 | 1 + .../objects/5caa52467466402fb1a7be48b51f2e7b | 1 + .../objects/5cc60ce7bf7a4f9ab8edb4d7c9263273 | 1 + .../objects/5ccf178970074d08acf1c394973ce8ff | 1 + .../objects/5d67d3a56b6546b086ee6622f2f5fb5f | 1 + .../objects/5d6c4a8d2a374b6e981e6c91ef5d2681 | 1 + .../objects/5d7d862ce4214f9fb8903a22f07f261d | 1 + .../objects/5d8ed5afa8ef4daa8a9f214a0856c354 | 1 + .../objects/5df00c71fd284cac8dead24255f16d9d | 1 + .../objects/5e04dd669c2a43de97d4040623e64c42 | 1 + .../objects/5e1890a240374cbd803b75d0d620a022 | 1 + .../objects/5e26a73a6e3947a5adf578e2847cc3fc | 1 + .../objects/5e4cffcb05e449af83482f1346c69eab | 1 + .../objects/5e681a34ba804129aa999098ce23d9ce | 1 + .../objects/5e6de7a2371b4e4abe65e9503b4ad0a9 | 1 + .../objects/5e81d1bfd15e4d07bdcad6cb9793fda5 | 1 + .../objects/5e841e4c14084b39b0ed2166c48ce96e | 1 + .../objects/5e8d48b67d034debb81c5877c6429d9e | 1 + .../objects/5ec7fcb960d34398a34adb2301a20791 | 1 + .../objects/5efba7dd6de54a3b933d8b8547922c3a | 1 + .../objects/5efeccfb87ba42b0bfec62358b2c24c0 | 1 + .../objects/5eff999d858e4f409b0c7c945e51f6a7 | 1 + .../objects/5f0de3470cbb4c5190daf0e2e1a562fb | 1 + .../objects/5f2de1a793074a4cacce96e89e5898b7 | 1 + .../objects/5f3b9c5e600942ff9400d447ab666671 | 1 + .../objects/5f41ac4185cf47b8824272b6b5be0bd8 | 1 + .../objects/5f4204009c1c4613ba06b22b73ff3794 | 1 + .../objects/5f42649c8c5841349bfba948f6078b4a | 1 + .../objects/5f7017105c844539ab113d20e64897a1 | 1 + .../objects/5f7e07ebc0b544c79e7ab63c357b7212 | 1 + .../objects/5f869849251d4e31a1617cefdb561416 | 1 + .../objects/5f8e65125a3c4b8bb35ccb2aa6899039 | 1 + .../objects/5fa4b9b19e3b4f8a9a9c32420c42ff51 | 1 + .../objects/5fb9234220ed428988ec234a7e9e532d | 1 + .../objects/5fc9827232c4435d8c6e2fefcd294972 | 1 + .../objects/5fd83cb95af847aa99b9ecde5b2390dc | 1 + .../objects/5fda83d2016c483497c4fea8a5fa7986 | 1 + .../objects/5fe62b36d3834f3581f6da5086c2ec1a | 1 + .../objects/5fe73079dfd243b4b794a6eed0c813df | 1 + .../objects/5ff0b20a62894118bb9d51ac83ac8709 | 1 + .../objects/5fff650c5474459c8057c443d590d485 | 1 + .../objects/600305d562b64a78909977b14000fd85 | 1 + .../objects/6010b18b2e724458bc8c12903071d359 | 1 + .../objects/60124789b3174b4a86479a70ffcd9e5d | 1 + .../objects/60163c98db684f82bef001a8050d5401 | 1 + .../objects/601cff86fd3245e1afc47393fd705ae7 | 1 + .../objects/608122b4debd421582d570e7b379256f | 1 + .../objects/60a0391ef048454493c47dbc49f94136 | 1 + .../objects/60a1ad1e89114ce1b507c17ad060e58d | 1 + .../objects/60b5b21da70b48f49b581010125cc5ae | 1 + .../objects/60cb89e22d314c3f864e308de2528009 | 1 + .../objects/60d31e180dd842fe8fa747d7b56e0791 | 1 + .../objects/60e9e91222f841d6b560ff7b65297192 | 1 + .../objects/60f43ab965894c4cb1fd75331543095b | 1 + .../objects/610503f40fdf47b2a18ff04c73b3b790 | 1 + .../objects/61450a85d99745bd9f41afe813a70927 | 1 + .../objects/61500c3968db49ab9a17d0270cb7fe09 | 1 + .../objects/617e7454c23141d9ba213dc3b6c5e01a | 1 + .../objects/618202fcd82944eab9ef08e752b0ca0c | 1 + .../objects/619414d8d8ed459d9fc1e933d6d9c181 | 1 + .../objects/61e7f7ad916647488d1710e0643552b0 | 1 + .../objects/6220458ee44c4275af2d6e72ff0b5ca4 | 1 + .../objects/6223bca567af4ab0ab9250f722187d06 | 1 + .../objects/622808b83b424248a754676b10991b46 | 1 + .../objects/622ef5c22f6a44279069e841f033c144 | 1 + .../objects/6244ea7f9131492998c959f1dba0712c | 1 + .../objects/625ae8fd635c4d1ea3bc6fd8510671f9 | 1 + .../objects/626be4468547406d85f89819da9bfaa7 | 1 + .../objects/62783d235c374cd5be77475b4540593b | 1 + .../objects/6293b89643f243f39644d118ee827303 | 1 + .../objects/62ad4ed186fb40a8bae5c791e322113c | 1 + .../objects/62be7b327f844429998e902a53178184 | 1 + .../objects/62ee54649a764f9682b6fdb6428de1b4 | 1 + .../objects/63032e85da4b420db391148d8914f361 | 1 + .../objects/63048b3e62584e6aa212ddf2c754ecdb | 1 + .../objects/630f8611546041068960571a0bf91ff2 | 1 + .../objects/631481b8a2ac430ba102880f7724912a | 1 + .../objects/631af9f4a1e14fa7b7b2f5374c620dfe | 1 + .../objects/631b9d84160d4aff90bebe69bef884d0 | 1 + .../objects/632ae7b39881473996acc13af1640284 | 1 + .../objects/632fe77923e141ea9216bd0a50a92d3c | 1 + .../objects/6330a4d299e445b3ab68642753ccafb5 | 1 + .../objects/6363d9aa33ac4bf1a9a9fc6f4267783a | 1 + .../objects/6379964fb0d24285bbcdfd2980fd3dcf | 1 + .../objects/639bbe41c4c14f79a28751a8860674d8 | 1 + .../objects/63d24ee2918b4dfe8afb6b249b4d29a4 | 1 + .../objects/63eb962e6f054f4dacbe83dd1f6aee44 | 1 + .../objects/63f124a8a32b4af6a6ce3b526ac67723 | 1 + .../objects/640ff6966ebf46549fb34ca4b320f1d9 | 1 + .../objects/641f54697be24b23b19591c8d0099bfd | 1 + .../objects/64273193515c4884b8efbe21c8edf65d | 1 + .../objects/642bcac9ec6842debbd3f10ee75f9778 | 1 + .../objects/646111acf033489a9ab1af70f236a961 | 1 + .../objects/646e046fb3344be9a4ef9a418af7c6db | 1 + .../objects/647ff86681214300910e7c5da1458a9e | 1 + .../objects/648f9023a75e408f98c67e1400494566 | 1 + .../objects/64ad3262c8bf4809aa082f94d7abd780 | 1 + .../objects/64af686b52d64d23b18a54a96f43a17c | 1 + .../objects/64da0522ba2e452b87c39a0ab67fae90 | 1 + .../objects/64fbca29611d4ccfbd202df38e5a2626 | 1 + .../objects/650625d743134e0ab7403a4b58fdc5a5 | 1 + .../objects/650823fc48014b76900d29e580a57c91 | 1 + .../objects/6512a347c3be4befa18ebca98ca3e9ed | 1 + .../objects/65183bb726bf4d898d7e03787769b1fe | 1 + .../objects/6526baa197cd4f7f9772f5de744196e4 | 1 + .../objects/652cec49edf94e1b9c55b02bb6627b57 | 1 + .../objects/654094679e59454aa581e4385092fdb8 | 1 + .../objects/65560d533ee04402b3a5577bc8a3bee7 | 1 + .../objects/65585bba9f0545149c4b07c0dcde6ac0 | 1 + .../objects/65691cd68dbc4339b8b0a3cbf9fea1de | 1 + .../objects/656b308ea1c543f7b2bc420357086535 | 1 + .../objects/656cccfb8272463dbfafae76cc57a379 | 1 + .../objects/658d2a4064be41e5ad6b10c14546517a | 1 + .../objects/65da09b9b9854cd3a91a8862a6de9bab | 1 + .../objects/65e2486e3e52463d96a863bec9747ac1 | 1 + .../objects/65e8ae7e62534e62a57585cc2e7d3698 | 1 + .../objects/65fbe1f6772a44b89b8c3b47c0da6606 | 1 + .../objects/65fd46ce1ebf451e82dca106212bb832 | 1 + .../objects/65fd79fe0f41454c863473721aa162f9 | 1 + .../objects/66019596efc94cb7b3667275c92a01d9 | 1 + .../objects/662ebcf2ea6a454187c9f2eee81bb92d | 1 + .../objects/663933c7522243e38b7089877e99cc88 | 1 + .../objects/663ee6690f8146f0bb1b25c833ef778d | 1 + .../objects/664cb08f49d64555a8e65a3ce0ee000b | 1 + .../objects/6654cec949074ec0942415c8fb2e0f84 | 1 + .../objects/6666c409630c4564b820ad989d59acde | 1 + .../objects/669f46adfd1b47ac8370e010007f17fe | 1 + .../objects/66c4749e0838413a9356bc6fca88aa36 | 1 + .../objects/670abc1a38dd463b94d4f04fd21091dc | 1 + .../objects/671f3f3c11b5494a920f949be36c35b9 | 1 + .../objects/67395106aa4c4ca0aa8271b6821d5667 | 1 + .../objects/675d088f16cb4815afce0afc90735b27 | 1 + .../objects/6768694873b3466e98f209d3aa3fc1fa | 1 + .../objects/676c6d5c16934ba2a31c5a1479c5016e | 1 + .../objects/679cd2e17dd1470192c80f58e9846df4 | 1 + .../objects/679f148ae5dd41e09f56a72aa0f6f8e6 | 1 + .../objects/67e62319c3704b27b6ae19c37616ab50 | 1 + .../objects/67e6b6802cdb44f78c239959683f1a1b | 1 + .../objects/67eabf0d622a4dab809eede3af6d7658 | 1 + .../objects/680044d79bf646bb8fd4314c26cb32a2 | 1 + .../objects/6802047d7adc4dbb9f327dcd5c2bc690 | 1 + .../objects/681a2c39559148d39a2f69431c5c3b06 | 1 + .../objects/681b4af48a494c1289c6f5368c77e444 | 1 + .../objects/682012f7adc34dbca497951690266373 | 1 + .../objects/684555f077b74e58a91c58265e5309ec | 1 + .../objects/685f970a24524aeaa7b8f0deb0312bb0 | 1 + .../objects/688cce1838e842be9c14b40df1efb669 | 1 + .../objects/68c10d1123894523b060eb86bc3bace6 | 1 + .../objects/68e7e96ece4f4ff7915226a682f399ed | 1 + .../objects/692d6606263d4b6182bdbd9e098dfef6 | 1 + .../objects/69312a38c22f4a68b3d9dbbf5f4bed87 | 1 + .../objects/693c2dcd4b0142e18254849b94d78051 | 1 + .../objects/694d6790f9b54985805d00cd87df76db | 1 + .../objects/695ae46daae34f70af22fcf50b63843d | 1 + .../objects/695bddb8fb3d4a878b0da3ebf73788d7 | 1 + .../objects/697c6981ed6a4d11ae2283df732ca904 | 1 + .../objects/69933850fdb84ef1a93d4c7974a8ac0f | 1 + .../objects/69960d5ccefb4e06b8ea8a3969142778 | 1 + .../objects/69b4ca64b7364e93a7f3a8bacc41d245 | 1 + .../objects/69b669d31400425aa1b97135959b24bf | 1 + .../objects/69bc3ff874ba4717b3bf84022d74c301 | 1 + .../objects/69ffe48117d248728436ee4eff34a0c3 | 1 + .../objects/6a184ebca2fb4dcaa66540d68220de4b | 1 + .../objects/6a2cae22100a4ac898ee957348a5b977 | 1 + .../objects/6a718a7237b24579bd2d7558194ad050 | 1 + .../objects/6ab418128c494e78bd6bf9fb942fb9b9 | 1 + .../objects/6ab60904dbc043d085e174bc36a5ed67 | 1 + .../objects/6abfcdf52b5a4e37a2d6fef85d834732 | 1 + .../objects/6aea7f814fe2474bb558801e4711211c | 1 + .../objects/6af7b8571d7b429db892cb08a1f71453 | 1 + .../objects/6b06bd8e7dcc4105bc426fc74cd10cd5 | 1 + .../objects/6b146293d84b42a99547eefb2c470fdb | 1 + .../objects/6b27b437107941ac85dc2bb59345d1f7 | 1 + .../objects/6b39e1f0890a4375807f69b0e51256a0 | 1 + .../objects/6b903de0fea3421eab6357c80449f5db | 1 + .../objects/6b925d523e5441ffba1e30ce3d0c72d6 | 1 + .../objects/6b932826f5294c65956a594e677e8228 | 1 + .../objects/6b9d1f2a372348f488b7c6b6286989b2 | 1 + .../objects/6ba8c45c1e8b4433a0a7ae9e1311f1d9 | 1 + .../objects/6ba97782160f454baa3bc726a0dc5a97 | 1 + .../objects/6bbbe8c913634841a32b8cf5ba0ca09c | 1 + .../objects/6bd2f75697b04573abdacd1c0171c209 | 1 + .../objects/6bd9e4c9b2d747e3852ae4966c3a611f | 1 + .../objects/6beb31f97de349a3a8882c7457775567 | 1 + .../objects/6beed339542c48f595c7d66e2b188bbe | 1 + .../objects/6c049b94f84e45a696f89f645a36b80f | 1 + .../objects/6c06fbd35ab94a2dad1dad4297616b3f | 1 + .../objects/6c6f10468da940dc93bf6b556154e163 | 1 + .../objects/6c86e6a1f5b643379ba6c59591029fc7 | 1 + .../objects/6c9b73243e614adc9e7b260a5cad13be | 1 + .../objects/6cb956f237fa405d8c9a22062d0f208f | 1 + .../objects/6cbf51ce6fa04310b040dc869d1c5ab2 | 1 + .../objects/6cd168ed2b6b49d29ae45d1147d825f8 | 1 + .../objects/6cd3abf79bff4ce1884862a8b8d10132 | 1 + .../objects/6d0ccf9def554e87b14c47b6aa1a2460 | 1 + .../objects/6d0e4191d2c043dba43a24caf7a08e21 | 1 + .../objects/6d285074d14743d8a8078f63c05924fe | 1 + .../objects/6d5f5a3944ed4ea6a0c05c5a516d0fa4 | 1 + .../objects/6d7b2d4a154a407fa9873eb865c1bd71 | 1 + .../objects/6d7fd78c83ad42bfb32a2dd4ba5fb7be | 1 + .../objects/6d9c74c9535c4973bee0cc25a87313e1 | 1 + .../objects/6dbbaed25c5b4f9db0c250c6fcaf802d | 1 + .../objects/6dcbfce8fc1241088ab913fae8d07093 | 1 + .../objects/6ddd139d3bec411797356ef741fdcb62 | 1 + .../objects/6de5517a3860490391522853c1e501c9 | 1 + .../objects/6df590ab51c348d79303c42eed25903f | 1 + .../objects/6dfea77b7849430593ea7fa68c7bb47b | 1 + .../objects/6e0bc80405d245e18ae4c0aaa30f0268 | 1 + .../objects/6e0e18fd234c42e2906bda3ee2551bdd | 1 + .../objects/6e2669da701c4cdaac2535abf10ced58 | 1 + .../objects/6e4892d976d148d7a6e1b4ae32d81f95 | 1 + .../objects/6e4d358800b346b8b6fe572ae9ff1e86 | 1 + .../objects/6e572fcc67f54f61a1ffb1431e77384b | 1 + .../objects/6e68b85735de4df9a28eb098b54b9161 | 1 + .../objects/6ea835e0f0cc4d2a908fb198137ff6a8 | 1 + .../objects/6eb2895772224e88b6621ad2d0a0ec16 | 1 + .../objects/6ee862eb49944eb3a93d859e3ab082d5 | 1 + .../objects/6effe3b0d53b442cafd038e699d4d823 | 1 + .../objects/6f123f920f1447809ec852307eff86a8 | 1 + .../objects/6f128f95ce8e4a99b394b139483299fc | 1 + .../objects/6f33a79c9b38409cba4218743051cac4 | 1 + .../objects/6f4055f8127a4c88bed3f7dba4a2cb32 | 1 + .../objects/6f469d57b6ee4fdb92e7ea1f460c9df7 | 1 + .../objects/6f4f521ec6ec4eecb1c7fa6ecc3eed37 | 1 + .../objects/6f710f17872948bfb451288b96243142 | 1 + .../objects/6f99a31bae344cf0904c5f2c393c31f0 | 1 + .../objects/6fb381ab22434d599f443c09959ad452 | 1 + .../objects/6fde1cba9325463ba9df9074b1e130da | 1 + .../objects/6ff30e8d88bd487a90d22b15df591142 | 1 + .../objects/70320995d7af4e21adad10c73be0c5d1 | 1 + .../objects/707ea28f53984125871a21b9cea93406 | 1 + .../objects/70959c32c004436eb1510e04540b4213 | 1 + .../objects/70b5eff0ac914114b9d94e4739103e62 | 1 + .../objects/70d121065f284c648c2657571161dfcc | 1 + .../objects/70fa2b8a360240a083008a89c26e4d32 | 1 + .../objects/7104a6d8a42a4b6aa765c2e7e0c090b7 | 1 + .../objects/710b3c7a41aa49198a117b679d70348b | 1 + .../objects/710dbff7027d434aa8991e6420dc3bab | 1 + .../objects/7117d41281ef4b3c915400a9512f98eb | 1 + .../objects/7126a339af904cef976014c35a03a37e | 1 + .../objects/712d1b68df024dca9237c70ecb967e76 | 1 + .../objects/7142bf2fc4c24416b49f3e3ebaa6f769 | 1 + .../objects/7146d8588bb9414fac5afd0c990d3d74 | 1 + .../objects/714d76f3a45a4b3fb8ee983db9091c86 | 1 + .../objects/715a5fb977754e44b21b23c9cf1d5f05 | 1 + .../objects/71692739831346d7ac8bf6fd3b3cac19 | 1 + .../objects/717cf2dc64fb478aaaf4883c998e8142 | 1 + .../objects/718928cfce814f9a8eb02ce7fdd5683a | 1 + .../objects/71d1b8589b5d472ba2ac1f2403ce8aae | 1 + .../objects/71ece8f641de474b963b8cc1d2f1c226 | 1 + .../objects/71ffd3a54b454b8e9a97c51bf1c319e1 | 1 + .../objects/7226b9e9e3d14b118352ffc68b2ab947 | 1 + .../objects/7257f5087910405a9a2270536062287e | 1 + .../objects/726574e995894a5abe3cc706dea02da8 | 1 + .../objects/72750707a9f54ca48d890f217e04dfcc | 1 + .../objects/72909afc7fb34b0eba9496aaf9b3d5d0 | 1 + .../objects/729d3e6b6960473995a5b6fe7730eebe | 1 + .../objects/729d801acba34db69e8ab7a80bea19f3 | 1 + .../objects/72acf3d2259242ac9231990738cb300d | 1 + .../objects/72b142124db74b53a772c8d4de2fe431 | 1 + .../objects/72b49d83c8634751bb672a938e8300f9 | 1 + .../objects/72c0750911ab4b5293b4d58aa8fecf24 | 1 + .../objects/72d38bd49434410ca42175abde0a8e4e | 1 + .../objects/730190bda64949389b1c3b237151cc5f | 1 + .../objects/7345c5d2a90b40919011c43c6692cb92 | 1 + .../objects/73583f0562634158b62201c1aafceec9 | 1 + .../objects/736a294f2a3240f9bc8d7412d64f4009 | 1 + .../objects/736c30bb94e948f7a457772199c044b9 | 1 + .../objects/736fc2be457840b9adcaac5326eeb6a7 | 1 + .../objects/73a88a8bc944428a854e5520acbba245 | 1 + .../objects/73aad37a7a7a40f59fb86017d84e8383 | 1 + .../objects/73b7ed209be842c5999a38263fe8b6d2 | 1 + .../objects/7403af72d9994e88a472e3d4749fee88 | 1 + .../objects/74052bff968541d2b70a27296a8f690b | 1 + .../objects/740fae541b3f45fbac65194e7815fcfe | 1 + .../objects/745c06d8b2ac44afa3aecacd3648cf31 | 1 + .../objects/7465da87e4f840638907efab562c3cf4 | 1 + .../objects/74a7bef6e1e4400a809a4034e9c40a0f | 1 + .../objects/74c6abd5d43d483d8a4a595a6d650b29 | 1 + .../objects/74d5d751b455441eb05dce938f5c842d | 1 + .../objects/74e3a09c6b6f4026be823be2f7d57b02 | 1 + .../objects/74eb9ff5d0994e3c894f3f885261ffe6 | 1 + .../objects/750a48c361944c1e9441a8da98a39469 | 1 + .../objects/752e22d353964da5b536c65188a08a56 | 1 + .../objects/7532d78ab9724dfa8ec756d2fcda9b7f | 1 + .../objects/75358b261ac043ef81f1e8e1722579db | 1 + .../objects/753d5d43602445d68df9cba63d5c1de2 | 1 + .../objects/75696cf1d06f4d838bc56ca2068250d5 | 1 + .../objects/7570f447bf034d6783f01c59976bf9ed | 1 + .../objects/75798b43d3884624baafa4ab043abb21 | 1 + .../objects/758259820cad439ab86ecbd7b471e654 | 1 + .../objects/758279ae88b247b790ea1beb79ff061f | 1 + .../objects/75979197c8fe41b4866e60f9dc060589 | 1 + .../objects/75a3328653e84555bcdb852f66a1e212 | 1 + .../objects/75b51cc232f74448b05be6cfb2b6ca0d | 1 + .../objects/75c161a16dd64e4194a91a8a25dd11d6 | 1 + .../objects/75ccc50d1e5f4144b0153432022121d2 | 1 + .../objects/75e6fe4b2a3b4d2a90922f2a0e1a2840 | 1 + .../objects/75e93121764f45ed8dcc8387681c3041 | 1 + .../objects/760b53107c9e459e813c644f3dcb6196 | 1 + .../objects/76220d1c44ba417d8e7fa73d3db267e7 | 1 + .../objects/76867beade174c0aab4be5db7eaf39de | 1 + .../objects/76976fdcc8594a5db25b0c3c8e2656a9 | 1 + .../objects/76adcd6ec6d143628afbe57459a83f2a | 1 + .../objects/76b0153c3baf4799a37144d707f60ec5 | 1 + .../objects/76b6ef399b4447a3b109fed68762ef8b | 1 + .../objects/76d0fdb8a7ae44f88dcb4eace3e2442a | 1 + .../objects/76f41121b3094228b0f787a8f6c28a86 | 1 + .../objects/7790801d2d20435fbb2331c1eb2d268b | 1 + .../objects/77d2820abdc447cdb3b5628cd83b5499 | 1 + .../objects/7821c71af29649adba3b051875bb1b78 | 1 + .../objects/782bf1258de848ca9a4d8605c37680bd | 1 + .../objects/782fd09376f6460cad7e24c9ea163826 | 1 + .../objects/783419db53764c53a59e08cb70e12e17 | 1 + .../objects/784c65085e2c406a8e3c821f1161e5a1 | 1 + .../objects/7857bb034176433286cbd4a362ed3a55 | 1 + .../objects/786c9150092a4a41b08c99effa0a400b | 1 + .../objects/78981033428b41b880a7d0f7ae6ffc33 | 1 + .../objects/78ae4f7138ea4f63ab799dec39a64753 | 1 + .../objects/78b25e7e3b92464c85dfd8635ff4e066 | 1 + .../objects/78bcc9e313054914854c957b15a817d7 | 1 + .../objects/78cbd65e1c48472b9ad72ea1826be4ca | 1 + .../objects/78cd9ad5c3e3422e92600f9a470b8f07 | 1 + .../objects/78d32b6cb7ac419eb0739639545e935d | 1 + .../objects/78f624eaf6a147a1abc8d931c663c49b | 1 + .../objects/790b6c2c844547bfa216934d65f77136 | 1 + .../objects/79156436b9e946438a66a2623a17010c | 1 + .../objects/7917464b2fdf454bb9610c963d86d2b9 | 1 + .../objects/791c08042927413abebc75afd39effd9 | 1 + .../objects/792bb059481e485ab0a5e15203efed02 | 1 + .../objects/797683898d6a46f78cb3908d900a203e | 1 + .../objects/797bb4abc8d441b9b46262af0a7bcd8f | 1 + .../objects/79a4a7cec614470fb2f6e24281ee9c41 | 1 + .../objects/79c45a2e9cc84b3a83d080fa67b66df6 | 1 + .../objects/79ccbe7c506e4c4e8f8f129511178efc | 1 + .../objects/79cd19650d7142d4b19551a98842b6f2 | 1 + .../objects/7a1445b2df994ce59b9e7a1802d9d338 | 1 + .../objects/7a1b7f64ab1a476a987ff76e051504b5 | 1 + .../objects/7a3a54f7515e4934aa2edaafb97dda3e | 1 + .../objects/7a57574a4e444ee08461ce9c3d2553d4 | 1 + .../objects/7a959aa46e1f4a06b54ab10f5e4dd531 | 1 + .../objects/7ab4625889ff4982a2dc4ac7041fc707 | 1 + .../objects/7b16048e6d7640c1bb17c56187f02d08 | 1 + .../objects/7b18129b97f1458d8c5b2e761d7436ac | 1 + .../objects/7b309bca61b249e0a9f7c131cfc09203 | 1 + .../objects/7b6317afa63e41d9932bbb7f3f1933d3 | 1 + .../objects/7b8c18f7d88347a6920f0ddf16ee9280 | 1 + .../objects/7b8fcdf580614e7cbb6a7d3136d7cff9 | 1 + .../objects/7ba8ad9d238e46c6b3be6370901004f3 | 1 + .../objects/7bb3af59cf3f430984dca8f0c9be0310 | 1 + .../objects/7bcbcd88d4ab467d98082f80d1289e7d | 1 + .../objects/7c028fb4e65d4151a6f8f661ec017990 | 1 + .../objects/7c256e1f11d6493781b2f373055df4a8 | 1 + .../objects/7c36ddd5607148c5a8aa2ae8b9a431cc | 1 + .../objects/7c855466a7e34be9b518903045c216b1 | 1 + .../objects/7ca11c4a069a45339341ad160dc784ba | 1 + .../objects/7cb80d0129f54b568c1e8bca2fbef61f | 1 + .../objects/7cdb66b5a6194b9195c1de0f3bb09c2d | 1 + .../objects/7ce6e1abb39449339d93354c8e2f1563 | 1 + .../objects/7cf0168d66f54a63a12a1b889c615a52 | 1 + .../objects/7d03662682394d20ae646db09bbf4c23 | 1 + .../objects/7d1a023c5c934ef694b255ffd8e65595 | 1 + .../objects/7d2ec399c82041a4b1a2c2e5dad2a5f8 | 1 + .../objects/7d4b37a308374a02a3ad10e8f7c0813f | 1 + .../objects/7d5796169ee34329963e8a78b1922714 | 1 + .../objects/7daa1c7a709844978ec7978554352e84 | 1 + .../objects/7db5f14a7cb94e6c9f5d855752629cab | 1 + .../objects/7dd2cd67d8e8475ab4b2e949715509fe | 1 + .../objects/7de2526b23034b6e8635db8bd600bd1f | 1 + .../objects/7de32e15a4444ba48d70ebb3f823d90e | 1 + .../objects/7e0b2b04f14743c89bd998e86b7cd4ee | 1 + .../objects/7e3009ab8d3147578a699ab449f2ed79 | 1 + .../objects/7e308de0d96d4fb58ebbd3e33b2af4bb | 1 + .../objects/7e488f0358d444248c8f8678a3bb0aea | 1 + .../objects/7e5289f2ad1b4491827594201584a94f | 1 + .../objects/7e7302cc35394a2b98f2f8261e144f3a | 1 + .../objects/7e827d0a7d514ff6861282a005b3df88 | 1 + .../objects/7ec7c67fe74d4e4dba20d77e61f8ff03 | 1 + .../objects/7ed04be99570489d830aa6617ede0948 | 1 + .../objects/7eeb7513915b46b9bf3355adef5b89b9 | 1 + .../objects/7f00870c44f449ae9278ffb25abde73f | 1 + .../objects/7f016e21c0484b61ba7ce056bdc3f033 | 1 + .../objects/7f2711e6da1e43f59d6581e56098978b | 1 + .../objects/7f3f0acd8f5f4b539eebc07bb1ed692e | 1 + .../objects/7f46251c5d254dd3a3a2caff3aa8d881 | 1 + .../objects/7f47088b914f429f81db5d84535c6f2b | 1 + .../objects/7f53cde7b99742deaa3d64cf8f7d4a91 | 1 + .../objects/7f66235571ad44578e3b0d6186fe07f4 | 1 + .../objects/7f7c07f8bbad4352b4874bb6577a1a9c | 1 + .../objects/7f91d9b2123a4c028c41a3c170ca5678 | 1 + .../objects/7f96e8a544994af0b366208c1564e269 | 1 + .../objects/7fc12994c57546d8b110ed0b68c72671 | 1 + .../objects/7fd7772dffae4130b9b87633bf7134a0 | 1 + .../objects/7fe347046711409482e30cd9d126d232 | 1 + .../objects/7ffea282f51a4258a55236636cb1831d | 1 + .../objects/800107572e9640388cf6a38fc1fd5e7e | 1 + .../objects/800a3c412fb74f10a876673e9db26d34 | 1 + .../objects/80131fba47514d048f8eccf2635246c6 | 1 + .../objects/803fd410cffe40f5b2d2385551d55f57 | 1 + .../objects/8067f34679344626b49ee8cf35c3dd59 | 1 + .../objects/80773e7bf4214d7ebec5a18a7e4773e0 | 1 + .../objects/80b1759b43ad4a23ac3d74d68693d8dd | 1 + .../objects/80e87efe10fb42c597771db38a46a1f0 | 1 + .../objects/8120da9999f14a609ac238aa8b99aed9 | 1 + .../objects/81387226c3494553a6b4a2b388045923 | 1 + .../objects/813c5f1be4944db49bc470d92257f7d4 | 1 + .../objects/814a743b3298454eac360e23edb44644 | 1 + .../objects/814b0ec21ec04452957c787aab98526f | 1 + .../objects/814ee98e76a54c3890b86d4b5de08e87 | 1 + .../objects/8160f2ffdd5145b39e818bc5bd3248ae | 1 + .../objects/819426878d10463dbf0962e1d853c143 | 1 + .../objects/81ac6909b4784a4c8876eed50d9a8345 | 1 + .../objects/820e58b92cff4509a9cf6ae0486a5d7f | 1 + .../objects/8214503ae11542d18cd6268f76c9be35 | 1 + .../objects/8217c1a0385a41089023a1fcdb5b4fcb | 1 + .../objects/8218ac879591436aabc679d0391182a4 | 1 + .../objects/821a93b501b94c28b42ae091b1128cba | 1 + .../objects/8246e44a9a9845959aad7d1d1b7c7673 | 1 + .../objects/827d1aab2cb34cc4af6573e111968471 | 1 + .../objects/8293be1f8723438db8e7268bf0171522 | 1 + .../objects/8293d99fc9684e05bed5f548d2aba77b | 1 + .../objects/82b7faf9c34b4faca781490570648262 | 1 + .../objects/82c392c88c3148e1acdb7401494d7cb9 | 1 + .../objects/82c394e6ba8a407cbd0592850ec7cb61 | 1 + .../objects/82e17aea2d4c43de9dea62d103ca770d | 1 + .../objects/82ff833f79994516b65c310df2a9deda | 1 + .../objects/83043963512845e381b2ecf7ad1b7c4d | 1 + .../objects/83119ec686e04272a3e9cc96207ae479 | 1 + .../objects/831a437fe5454e9a9acfe053407d7f7c | 1 + .../objects/8327ffc099bb418d8dc457bf336078ab | 1 + .../objects/8338ee0b302c4f96be4918ef757cf23e | 1 + .../objects/834e903cf3a243999781274a792e7f53 | 1 + .../objects/8370194a042146bfa768540afe8d166f | 1 + .../objects/8376175c21aa4dab923854799d9b5f8b | 1 + .../objects/83763a52d327496ebf74be309f419d78 | 1 + .../objects/8379c96ccc21471aaa8e09a7c01e77d7 | 1 + .../objects/83815a231d5947ee99d46b5ce11aa178 | 1 + .../objects/8387ae2e3cd14b0fa2ce8f1768d48d8b | 1 + .../objects/838a8de17a15491f9fa1fe6630cbd011 | 1 + .../objects/8399e7e4c8b04a2a897f3ca186f18858 | 1 + .../objects/839e20c1be794b3cbc3bb099b2c97c2d | 1 + .../objects/83c3b6cdb5cc40efbc519f1c646dc547 | 1 + .../objects/83c973c5d4b04f00969e20f029c5ec00 | 1 + .../objects/83e90f1ae918451cb99165571d05691a | 1 + .../objects/8409cf85a58c4f93b273525e23e211b3 | 1 + .../objects/8410f95d9cad47f3acd5fef632d1b666 | 1 + .../objects/84355a64b10d455c9a5a6c7f9c236fe1 | 1 + .../objects/8437607f8fa14397b438b0277ddb1c11 | 1 + .../objects/84395643e7ba475d93e36916cdb6f35b | 1 + .../objects/84509e83a1b94335b24cbd6e4e3ae19d | 1 + .../objects/847d052b56f342b8918e91edca003cad | 1 + .../objects/8496747900cb4eb5a21dec29c75290f6 | 1 + .../objects/84ff4d09fe1047e59a3d1704e118facb | 1 + .../objects/8508ada520774e22ad884f00e2850cf8 | 1 + .../objects/850b75ad10d54677a03563c597bcb6c0 | 1 + .../objects/8529a77e303147b4be15f7c15543a754 | 1 + .../objects/852b22277cc54d5d820f5dd8bfd1e302 | 1 + .../objects/8531e0f7df1245c19209b923e16ed56e | 1 + .../objects/854a1060e31c40c8ab5e9a17247f891c | 1 + .../objects/85579455dcc7430f92d374bce5a77ca9 | 1 + .../objects/85a71336958d45fcb70485608b67221f | 1 + .../objects/85b3d42ab95d493eac824ddb6a42b3fc | 1 + .../objects/85c54bcb83b44aef9d5747fe44473a43 | 1 + .../objects/85e8f45063d34468888bfcad2b0d9127 | 1 + .../objects/85e96065717341ef8bfb24b0f75dc5f7 | 1 + .../objects/8604a6edd48b4ea4bb99cf6ee4b337b5 | 1 + .../objects/861a16dd2ead4c5d87414c71c3817f88 | 1 + .../objects/86570a773cec4230bee456c02555263b | 1 + .../objects/8672a0ce18374733ac221dab44dce721 | 1 + .../objects/8685af79713448f3977caeef1bb7f5cf | 1 + .../objects/86887528379c48ccbbfcc03f9fcdaed2 | 1 + .../objects/8688bb77c87d48ae847bc1dafa8ff729 | 1 + .../objects/8693d876cb5e47b4b3bc2ac6681997ae | 1 + .../objects/86a42b116f6047318307d31574fd0f37 | 1 + .../objects/86a64a1885154004b6f915fbef1de2e8 | 1 + .../objects/86c68c23b66e4284a5c9ecdfb857d713 | 1 + .../objects/86cc0b7dc9c1464fae294a784b7f6a53 | 1 + .../objects/86f7008b55f546afb8da63e0ea5b73c4 | 1 + .../objects/86f836f4479a49879496168556ae2707 | 1 + .../objects/87058553ece14233a62142a304f15d87 | 1 + .../objects/872ecace8eb547b488b8949e8d933ead | 1 + .../objects/87431f1c030545deb558cc087d1695f1 | 1 + .../objects/874ffdeed88d47a2aebf445c6ad81591 | 1 + .../objects/875e1f175aff410297c4388a9e347326 | 1 + .../objects/8762d46c788f493a9c52966224087279 | 1 + .../objects/8776166549804f2f83d12263237373c4 | 1 + .../objects/87882dbe70ec4ae18af88a1c5e40a57c | 1 + .../objects/878ad31004784b0da6eb7fb9d11430b9 | 1 + .../objects/879cd97b4ba849dea26035fad57a7703 | 1 + .../objects/87c386705e004a21b4f3122d1a709cbe | 1 + .../objects/87f97cdb8e5b456e846a690576122407 | 1 + .../objects/884ac99a372a49498352dfe6e4057eab | 1 + .../objects/88910d44a5d34295be953c3c7efb2586 | 1 + .../objects/88affc1f19f04f2caddacb1120cfce81 | 1 + .../objects/88c0b65641364b1589dbaa504967fda6 | 1 + .../objects/88c0f0fee64f4b86bacec8c6f6868398 | 1 + .../objects/88d3b46acc884858a376eb3e22b3995f | 1 + .../objects/88e658ff4e2946398be51495fbc7ebea | 1 + .../objects/88ef2f3908264c1abee2cba3d3c74e20 | 1 + .../objects/88f25886d3fa42dba0307898227a28ca | 1 + .../objects/88ffaaf417b54fc8b44dc90cbca39754 | 1 + .../objects/8908ff956244483f9b5b13cea2a9a8cc | 1 + .../objects/890b3d6ed5854ab68202c619fbee306b | 1 + .../objects/8920f7581cef44c184e09adcb973e511 | 1 + .../objects/8925b7e7f8264c3ca5b5f558b8f98a79 | 1 + .../objects/89a4d2ac057e489caec4590f3ba548f3 | 1 + .../objects/89d849d864c740ada54b45a4f05847c6 | 1 + .../objects/89e2eed16ef54db2a35b28f01a720396 | 1 + .../objects/8a013b4fe12d46d8a4a824d26411fe59 | 1 + .../objects/8a1ca4ae12e54e9bb48ac2a8f4281943 | 1 + .../objects/8a24e8d8f7244307896e0883770ef433 | 1 + .../objects/8a281f64a9e443e590479e5b4769b6b1 | 1 + .../objects/8a2d1a2d0b8147b283ee5d05837bd217 | 1 + .../objects/8a63d2ee687347f08cc1926c94d5a9c8 | 1 + .../objects/8a6c69e16b444dd18f4ca36e12de0a13 | 1 + .../objects/8a7aae9fe98648ccb82bf06d07ebe234 | 1 + .../objects/8a810e6dfec94fdeb21465aa9efc47fa | 1 + .../objects/8af852665e3042ff948bf888418e8cd6 | 1 + .../objects/8b500cc479bc4ac2997a78ff6a992d58 | 1 + .../objects/8b5f822f67b34849848672481d5535cc | 1 + .../objects/8b7902ee408747d2a81eb4b6178f20e9 | 1 + .../objects/8b9c801eafca4517a2cfaa3f19d98be6 | 1 + .../objects/8bcf49ff536c47dbb97161edf4521099 | 1 + .../objects/8bd4fa2d05fa47149ee00c09f1bb6d5c | 1 + .../objects/8c1bfc7e3fb642c2955d591b1c4456d4 | 1 + .../objects/8c2727c29b044a6fbf9148d642a88874 | 1 + .../objects/8c93865f10c5400a8cfe61db9e34bdda | 1 + .../objects/8c99beff888e4d989795b93bca5fce94 | 1 + .../objects/8ca1a7cb48764ede8e65d6e2891132e9 | 1 + .../objects/8ca311f4638545ab9ff36c4d7e8b6a31 | 1 + .../objects/8ccbe42ffc2944fc83fea9e42ee6ffa7 | 1 + .../objects/8ce2ded2936d454f995af2f4f3edd76b | 1 + .../objects/8cfe36c62d944fc4936e4d8188c30b41 | 1 + .../objects/8d15a60673244ea280c7886a379400e4 | 1 + .../objects/8d2580b13e944bedb488435fbc537367 | 1 + .../objects/8d4f11c333ce4cf48a77cfc5f1cb7131 | 1 + .../objects/8d69b02e7cfb44eab28312f9e0c72ed8 | 1 + .../objects/8d97ca504f934797879b0c86ff112a8f | 1 + .../objects/8da1c2d8d45d403f993e965e980a58af | 1 + .../objects/8db24c52fd1f4352825e0f996c76b880 | 1 + .../objects/8dc48fb81a7642ada768085a44a638c0 | 1 + .../objects/8dc5d56dabde46a78d0990d0c6b59491 | 1 + .../objects/8dd9b8ea053d4bfaab462638d71833d0 | 1 + .../objects/8df6c108109a4b0d8b8b4da6aa7be429 | 1 + .../objects/8e1c0b8f982f438185ab1c3e98128634 | 1 + .../objects/8e22375a4ef04cc0b5b6c7e4c8fffe27 | 1 + .../objects/8e2510b919e149c6a810cb583de10529 | 1 + .../objects/8e94bd228aee469cbf113f9beae82068 | 1 + .../objects/8ea04eace90c4e8196cc8ab9b5917c83 | 1 + .../objects/8eab1138d4f040e58341d708c313ef48 | 1 + .../objects/8eb36d5b1bc74374ae0c629bef7973c9 | 1 + .../objects/8eba85bc25fd496cbf4f6a45930dead2 | 1 + .../objects/8ebfe1dae9c14035b13fc4b6b55a038d | 1 + .../objects/8ed31e41d5534e3696f9646b7f675a48 | 1 + .../objects/8ed7e50550b34ded97b1139ad702bfba | 1 + .../objects/8ee4a4c8587f4595a075e00edbce812c | 1 + .../objects/8ef10862dbd04b03ac5f71684c397582 | 1 + .../objects/8f089d51e75c4780888e3d2e9fb3ea70 | 1 + .../objects/8f12036701c54ed5b7ecc72598af512d | 1 + .../objects/8f66ffc1f36541128cb26e7304e04bb2 | 1 + .../objects/8f7c9e43311a43f7a2d7e373d9f05a10 | 1 + .../objects/8fcaa3343afb4780ada253dcc34c8b27 | 1 + .../objects/9010bfd73aa145d3b566a54c9a05bca3 | 1 + .../objects/905ac7f0c4d04b3896e55af205431786 | 1 + .../objects/906188cd690c496ca951d01db21e3e2a | 1 + .../objects/907a8519a3c14b0b94e135307e8a9ac3 | 1 + .../objects/90bab5a388fc44f69275880118bd5ff4 | 1 + .../objects/90d03a9df74644e5af68ccf1d957476f | 1 + .../objects/90f3f677a13a4a30a50f34022c6b91b8 | 1 + .../objects/910bfd92342e42fd97078bf24bf280f0 | 1 + .../objects/912461c3d2cf4c99946d7684dd6e355d | 1 + .../objects/912d22a8d5654118a2387bc0a12c63d1 | 1 + .../objects/91418ee2443a4da188f19fe497b83cab | 1 + .../objects/91529b069ca84c4b87cdeba3fa6b9253 | 1 + .../objects/915f79c6f1c24fc3acce02af291c8a7d | 1 + .../objects/91a91816c70a4c9bb1f1d49706fe24f0 | 1 + .../objects/91b4810b3e9a47e682053ab3e0bdf544 | 1 + .../objects/91cdfc35f7f242aea4d5c78e389df308 | 1 + .../objects/91f0e28ad97443f09f81ecd3873e3540 | 1 + .../objects/9206b2b1e350492a9b22a55783d42a98 | 1 + .../objects/920c3a86aa4046d7a7193dc32ba6f0dd | 1 + .../objects/9224ba30e9084ebdb14381ae7c9086f7 | 1 + .../objects/92273445ffd049d8a05e5003a52639bf | 1 + .../objects/92277308c5cf4b25aac3763d7bc27f8a | 1 + .../objects/9242c788b166401a81ac7d44c13c338b | 1 + .../objects/92694d8ffc6b44e38b039476b69a6b90 | 1 + .../objects/928378feed8c4acc9bfcdf6ca247d65f | 1 + .../objects/9283f534f9a64fce809f57ff9544474d | 1 + .../objects/92a9f713d11747ddb4dbe30c08e951a1 | 1 + .../objects/92aea49cfffe4d84ab4e01174ba245e2 | 1 + .../objects/92bbab8ed89541a4a57f032ac9418ef6 | 1 + .../objects/92d7b02f08c345fda0b9fcb973014656 | 1 + .../objects/92e23c57c13a45ef83a40dcce45d11f8 | 1 + .../objects/92e9be072fe44c6d922ed56406363b44 | 1 + .../objects/92ed836ebb644526b2e652732c7150ea | 1 + .../objects/9309c148dfbe4dccb5f01a5e96cd1004 | 1 + .../objects/931752cfd4224090884c1ec989a9e7eb | 1 + .../objects/932adc7f211a43f5a02a81f0a9819a05 | 1 + .../objects/9330c68da0a649daa4ff6d2df3eb6ed2 | 1 + .../objects/933221fb62134c7ab44afe66efbcb14e | 1 + .../objects/93506f023c554ac9a4525c8a7d469b90 | 1 + .../objects/936526c36e7248e8aacdb459107e19b5 | 1 + .../objects/93f8df1161724e96a61e0dbf3fd97554 | 1 + .../objects/9425b03fb942417c96d80a130fe3bca5 | 1 + .../objects/943290f9ceb84c868409c8c495a0b435 | 1 + .../objects/9437cb662dce4aae932416b21e61848e | 1 + .../objects/94394bc517c64a45bcd4b211f279cd67 | 1 + .../objects/9440b02419b1412a925f84ab9c24cdf2 | 1 + .../objects/945fba05b61049428c6505511620f81d | 1 + .../objects/9460754fc4dc4ff2965b9a9bba186643 | 1 + .../objects/9464728b616b421ea8b6f49b4992161d | 1 + .../objects/9471ac05ed464109b50860754d372025 | 1 + .../objects/94745372b81f4c49872cf8678fca6145 | 1 + .../objects/9487e87a077442d6bfb97916149e4a49 | 1 + .../objects/94dd0effab194b9dbce948eba662f72f | 1 + .../objects/94e4211f7f8948908810ecbdf96fd725 | 1 + .../objects/94e6ee5cb2df4dcb9e3ded21cb003d7a | 1 + .../objects/94ec3a2b676d4e3bb9a8b7c29a683fe8 | 1 + .../objects/94ee0fe364854da9b43417a829c20fd5 | 1 + .../objects/94f111e449be4783869236d4db5b34e8 | 1 + .../objects/94f68bc21a5d448291a97346f3ac9208 | 1 + .../objects/9506a13fcc774ced81b4b1bcaf916d73 | 1 + .../objects/9511afed5b4f4e79b97d88f9ffee49b4 | 1 + .../objects/955370f773d9408cb1c43bd8a357b585 | 1 + .../objects/95588dc0fe244e3a876659cbff3b30e3 | 1 + .../objects/958e398450b343479aaf9aabda873948 | 1 + .../objects/958fba736e6f47d4af172720be80282e | 1 + .../objects/95929a7e62e143989439c1e19b2e7897 | 1 + .../objects/95b57665cb584da4ab51174b0ba4b89b | 1 + .../objects/96029ebecfa64b90b7032f3ac3322d83 | 1 + .../objects/960c6153febe4139bec712c60a4238e7 | 1 + .../objects/961628f5707f4bdfae521a358ad71367 | 1 + .../objects/962232d84f94428c80c68431af857123 | 1 + .../objects/9629773d69064832a749d243da2538dc | 1 + .../objects/962ef33a9358400384f7e2cd1d54d708 | 1 + .../objects/963c2871c1ee4235a3f58f1fa723fec5 | 1 + .../objects/964c1e114b52446bb382b666c327806d | 1 + .../objects/9689af20849a4831ac52bc09c95ae01a | 1 + .../objects/96a87923da1e4069bb7f33d8d2780eb0 | 1 + .../objects/9706b4784e9341ff9b1b62c67d7ba124 | 1 + .../objects/970d6c4b3d974e249b69c3a5be6c152a | 1 + .../objects/9760336ad68940869032b6c647d2b65f | 1 + .../objects/97654b57abdb4fc58f8a9d5a17046784 | 1 + .../objects/979bbf1c9ece4aafa79deeecb33840b1 | 1 + .../objects/97a397f70dfb4eb49eab4db87a71ecd3 | 1 + .../objects/97bc1febeac240a3b4b6b6eeb36b5be2 | 1 + .../objects/97c141866a5d4402bd17e68d6bd28b13 | 1 + .../objects/97c77548f21044999d8b6510ca303f60 | 1 + .../objects/97e2a08caeaa4ce28d4546f7de353325 | 1 + .../objects/98073a8e474f4173b64a2fb5c03d344e | 1 + .../objects/98671c27eac548618e74ef6bd5d2222d | 1 + .../objects/986f9b27accc4d089eb5caa927e87495 | 1 + .../objects/9884c6b3ce1847cd906fef148784f7c0 | 1 + .../objects/9896198fa8b04cb19361c5bb5fa5d8bc | 1 + .../objects/98a8397d1fcf46b38a3b8913d73d3332 | 1 + .../objects/98d15f5f4e674eb383548b7bb2cf3ffe | 1 + .../objects/9918e6535a51401fa77a1c2dcfcef848 | 1 + .../objects/991d700336234057883c646b1ff60585 | 1 + .../objects/9921016848764d01bac10b77c4a4f47f | 1 + .../objects/99495e68b9de4a1c8736399e42cc9732 | 1 + .../objects/9950183de16349d1b262ce3acc93a052 | 1 + .../objects/9952d640cc1249feace5e55b3cd1a5cd | 1 + .../objects/9976ff0ae8194a05beb978a2e5833f0f | 1 + .../objects/998cdecd345440999fea5ba5a2e3e26e | 1 + .../objects/99bb66da4f954ca7baf786a6c07cc0a7 | 1 + .../objects/99ea153b1dc74f148342a76c8546cf31 | 1 + .../objects/99f95d4e111b4ae38ee150cfb1a14dfa | 1 + .../objects/9a00bcad4ff64875bce5120f5860a0ca | 1 + .../objects/9a3576bd5da743b4b508146da74fe941 | 1 + .../objects/9a361a76003b4eee94e1e8397eea295e | 1 + .../objects/9a44e341e7cb4ed7b45baf4ca30108e8 | 1 + .../objects/9a5b6da3588e49ab89be8aa5adeca322 | 1 + .../objects/9a97af86002f49a5a5d5cc922906163e | 1 + .../objects/9ad93761e8134fe596b223791d128ae5 | 1 + .../objects/9b3af019fd2748d0bb628afb03465993 | 1 + .../objects/9b582ee3b87e44e9802e58ee89dfe7ed | 1 + .../objects/9b7dbbda782e41268597a03e0e63ecea | 1 + .../objects/9b8e06b6b0c9409a821c047c2e2e5589 | 1 + .../objects/9b985e90835d4598ac92614a6db952b0 | 1 + .../objects/9b9e6ab1da1c4f5b9ae1141d10d63fae | 1 + .../objects/9bae9703b3094aa3887721282d02714c | 1 + .../objects/9bceea10e2f14541b298e2983009e6ae | 1 + .../objects/9bd010255a044e789f14b4b900495091 | 1 + .../objects/9bd4bb799cd54b2a8a9374e827c332ab | 1 + .../objects/9bdc685d7033427f8ef076b6c9d6d498 | 1 + .../objects/9c2232d2e7cd47c0a11f3c116cab1301 | 1 + .../objects/9c24f49bb2d840cdae2f941235d020ec | 1 + .../objects/9c3e7637495744439d706fd71c948160 | 1 + .../objects/9c51379a7d4e444e91e169f8897a845e | 1 + .../objects/9c5e4676739d4fbd92c63800bd162d41 | 1 + .../objects/9c66d3096ec142efb54bb6540843b67d | 1 + .../objects/9c9150ca1b3346feb298d280fa47867b | 1 + .../objects/9c920d7e390c480688ff6a54fa6eeca0 | 1 + .../objects/9c96ff924687416e81da393168d06ae6 | 1 + .../objects/9cb8384ec5d84cb1838309109c5ec767 | 1 + .../objects/9ccf79a2eec24ce290cab84ea9b5b1ca | 1 + .../objects/9cd099774993487cb44c86fd8bb35149 | 1 + .../objects/9cd33344e8b945f8835ec40fc023c3d9 | 1 + .../objects/9cea0c8592a64d978236ab41b95335cd | 1 + .../objects/9d00096525bc458eab92d9926bfcc6b0 | 1 + .../objects/9d222156001246f19823905202becc15 | 1 + .../objects/9d235fae307d429eba0d437d37eea6cf | 1 + .../objects/9d4361adbb714369b8a7974391651016 | 1 + .../objects/9d562d4d1d134f31930840e0f0acbf67 | 1 + .../objects/9d58ce3445bf477bab02d3380eb57fb3 | 1 + .../objects/9d9dd8eef6b24876b64222dcfcef79f6 | 1 + .../objects/9d9f2a3632184a448b8115c3f55dae73 | 1 + .../objects/9dc8c5d5d0e04800a3480f2b5447bed7 | 1 + .../objects/9ddbe60fd3b144fa962e7bce69a916c2 | 1 + .../objects/9dec89c9590f4f5a9697af5937f82da3 | 1 + .../objects/9df7c3dbe56a41579aac3a85814eeb75 | 1 + .../objects/9dff1ae08f184cf2a2bb8c1c0967ffee | 1 + .../objects/9e064e80c0894af79da9270479804b84 | 1 + .../objects/9e1423d0ce2849ada91c52c340ba8c32 | 1 + .../objects/9e1c0a7e47604e7382014e72ee7711db | 1 + .../objects/9e6fadeed1e4423c8c10f39b376262d8 | 1 + .../objects/9e784345a2de4236ad216f0e7bbf9d3d | 1 + .../objects/9e7c80cd900a4301ab3be60192c7f7fc | 1 + .../objects/9e84e032ea7548538c386751f227f978 | 1 + .../objects/9e8fef40e93a4fbea9fe76bcdf8f2510 | 1 + .../objects/9ebe876797c14fe08f0c879c199e5bcd | 1 + .../objects/9edb56bb87ff4059bf45ef35a444d41a | 1 + .../objects/9ee4505b2be74d2783a4c696e035ec2f | 1 + .../objects/9f3915037a0b449e9537d0fde9d5e4d4 | 1 + .../objects/9f721181aef9444a9f0bcf304170f35a | 1 + .../objects/9fa87637eae949e3af68cb3a42bb91b8 | 1 + .../objects/9fb66d3bbfd0426ba1abfa2f0363a10c | 1 + .../objects/9ff0962dd668449ab26dc1fc9e86c4c8 | 1 + .../objects/a0073f6f98e946c4a2c1a54db7902e87 | 1 + .../objects/a00aca749d1b440bac7dfd1160eba3bd | 1 + .../objects/a00bb589e9c645f39710c5f3ddbf56fb | 1 + .../objects/a016a930dc3745748494ed251b53794f | 1 + .../objects/a031c68e16394d21a54420557ae8c24f | 1 + .../objects/a03353724bab49f9b327e05cdb7da316 | 1 + .../objects/a06309706001426180ccce56e72ac7f9 | 1 + .../objects/a06f7f05ed4d4558a4cfcfa81931ce86 | 1 + .../objects/a0865e3bbdbf47a2804a026d36d6bd13 | 1 + .../objects/a09ed5d072494ced896e5b7f304d2587 | 1 + .../objects/a0b4ce1c6b7f400bbeb37cf1ea2460fa | 1 + .../objects/a0ec6c3e1f3c40fc8dac669a89d23e7e | 1 + .../objects/a0f40f67cd22459e9a009756ce7876b6 | 1 + .../objects/a139b8373eb44cfa9b2f2c9f84986e10 | 1 + .../objects/a13c2dfca6cb4274a4dd1da8508dced6 | 1 + .../objects/a13d743d91d44619bd9b1073f47b28e8 | 1 + .../objects/a1448a95c6774a359bb892b29279cb3f | 1 + .../objects/a163593c4ea54dfdb7062e3e46ecbbc2 | 1 + .../objects/a166d6a9483f4aeeb25b8bd05613f951 | 1 + .../objects/a16710f9d3e74dc187207b3b41c1d70b | 1 + .../objects/a1818a487bae438f91d08c14255a2410 | 1 + .../objects/a19b3386f52345c5a7a7e7d778eeb5e1 | 1 + .../objects/a1d69183893d41d4a1f129a7ab4e9801 | 1 + .../objects/a1dae934439e4b68bf2a2321ab84789a | 1 + .../objects/a1e521e7b4ad449b8a0fbc3633ee36c4 | 1 + .../objects/a1ed893414ef4a33ba9a9687dc41962d | 1 + .../objects/a2121214108848958725c44cf5e5e882 | 1 + .../objects/a251fd054c34468486dd014a777e6f52 | 1 + .../objects/a25a10585aaa4421adbea23180a00e0e | 1 + .../objects/a27113d23dd64d0cbb6f8fd1258819a2 | 1 + .../objects/a283c45878564f9caa7c943ffe67407b | 1 + .../objects/a29c03ddc41b46eb88691d60c979160f | 1 + .../objects/a2b67b04531947a9bacab98ef5fedd76 | 1 + .../objects/a2f76877fb724e11995a3111124408fa | 1 + .../objects/a3191e0aaca3460191fead814b71162d | 1 + .../objects/a323d64a8d954b488748e15548eac1dd | 1 + .../objects/a35e55adf65c45529d1c2a0e34957a6a | 1 + .../objects/a362962b40ab4ff38bcdc73eeb285b28 | 1 + .../objects/a394243f89bc4f9387896ef462b0686d | 1 + .../objects/a39797f0ef0b4c7d89b6ae40a4563f80 | 1 + .../objects/a39c543a1cbe4be39ec78a4791ab230d | 1 + .../objects/a3bdea9e92514cd7b178c0e835acb9fe | 1 + .../objects/a3cc039a0cb34558bbee32e1f44bbc02 | 1 + .../objects/a426a09e9476448a93f9f899bbc3d145 | 1 + .../objects/a443edf3f8d64dbf872c7cb1c404e8d9 | 1 + .../objects/a45186e5f3a549d785ee31bb45e61cc9 | 1 + .../objects/a45eb8b538fb486ca90468420282c878 | 1 + .../objects/a468ee7471124a5aa6b70e86ee35667f | 1 + .../objects/a48468b7e0c344ec8fd972a255b7b708 | 1 + .../objects/a48752f4ce424bad9520f54c1a3aa39c | 1 + .../objects/a49e157f173343cd86a0eeb63b3eee7a | 1 + .../objects/a4bf122f33c94742a167951ff968562f | 1 + .../objects/a4e1996a30fb4699811ec82acbb1ac26 | 1 + .../objects/a5390fa0a0d04584ba6e1cc049d07821 | 1 + .../objects/a58ade8265ca4be883ec4ce34c5fe188 | 1 + .../objects/a58c0d3c18314d81bc8a6f0c41fd12c9 | 1 + .../objects/a59e66a829804f9e8a1f05b215d607a8 | 1 + .../objects/a5b0a514b8944693864d330384c2c9b7 | 1 + .../objects/a5c09c08afb24cc192551b0652b1de7e | 1 + .../objects/a5cb48bcf6604724962d4cc7b0908ece | 1 + .../objects/a60b7d059a214013a007a776b01c0e2e | 1 + .../objects/a60e2214942c41b9887a2a0421fdff18 | 1 + .../objects/a617630f0d6e493b839b679aae38d68f | 1 + .../objects/a61e285edb9444daad2b54faf81ebb1d | 1 + .../objects/a6373938a6884f438943aba0f1d07ccf | 1 + .../objects/a6622bf53cb24c3fa5c935ec9970a3a9 | 1 + .../objects/a673d921b2754b8a9559f3ad13b1b314 | 1 + .../objects/a6afcc567384465884a207521fe30a23 | 1 + .../objects/a6c1e54daf5c40acb44f850f4235764b | 1 + .../objects/a6d672637d7142bbb5831388747231ff | 1 + .../objects/a6df81ca573f4fa896bfabcad274efce | 1 + .../objects/a6f6993377324c84bd57d5866aa987d2 | 1 + .../objects/a6f7181b01c24828aac045175c3544f1 | 1 + .../objects/a72b1167f597406d8aa75dbbd06da99c | 1 + .../objects/a738d17119244353ab320efbf88847cf | 1 + .../objects/a73b0d91010d4cb985614079a6b82f3f | 1 + .../objects/a73d29b1acb44372babe3ad0d445019c | 1 + .../objects/a74397fdfb6247169edd1d4f67b4133f | 1 + .../objects/a79b63e7795944b18fe40129d75b960f | 1 + .../objects/a79b8709492c4b97ace306a16d55037d | 1 + .../objects/a7bdfa0cb8284c50b0c76586814e9a13 | 1 + .../objects/a7cf0f9633924604ad6a995655e96cbd | 1 + .../objects/a7d637097c424dc4a6a2d1bf2492b7ae | 1 + .../objects/a7e6e8bd1f6849b98b58ed7909c4bde8 | 1 + .../objects/a7f0234328a0468999bd5b268993726a | 1 + .../objects/a841e9e0de17448fadf906b14c7df9b0 | 1 + .../objects/a898b91498cf420e9f46678e8af3b4d4 | 1 + .../objects/a899713b85b14df0a16cee05105205c1 | 1 + .../objects/a89f514808ef4b39b1ce8579343dc05b | 1 + .../objects/a8c4af2faccc462ba2d221c97d19a6cb | 1 + .../objects/a8d065dccba3424eb8691b190d3f3ec3 | 1 + .../objects/a8d7aa07f9a04c7aa34401ae54a4a1bf | 1 + .../objects/a8ee5f00897747d385ff8412d49a42b5 | 1 + .../objects/a8fb01fb1ffd42799e210c74ac96333a | 1 + .../objects/a908fb4d0ee14d41af5f7f6121c6a812 | 1 + .../objects/a964cf4aeb4142b8a5cb80011d6df1c4 | 1 + .../objects/a989706a9d0b4c708ca81a43dc84ed11 | 1 + .../objects/a9c1f9aff6ab49da907b5481b38205b2 | 1 + .../objects/a9d8bd0e5b534567982ff2daabd94be5 | 1 + .../objects/a9d9c871e3504e419915faab5fcde44a | 1 + .../objects/a9dbf44a249446de92c9b1b788982a12 | 1 + .../objects/aa0a4b6d57ff4b6d8055f627f61031f9 | 1 + .../objects/aa167e5c54c74127b52538ff96ede90b | 1 + .../objects/aa2b786a0fcd41ebac3f801d4ab88cbf | 1 + .../objects/aa443e62da5042c4816a80ff2ff2ac46 | 1 + .../objects/aa461ba2a7ae4871abcfcad58d7f4950 | 1 + .../objects/aa568f0a1b3641c2991a72e7c65df0af | 1 + .../objects/aa857fd9638348d89ec9410cf1f6634a | 1 + .../objects/aaadc24dad9948a2a40dacb38402542c | 1 + .../objects/aac815b7c20149729ec8521832558100 | 1 + .../objects/aad086a38b384800ade313c208a0b35d | 1 + .../objects/aaf2b51d8def4daca591f360ba8f76bd | 1 + .../objects/ab29c9330b8e4f6b9bf3971d07551df4 | 1 + .../objects/ab2b1b4e71e9467e9f976966c1c6c67d | 1 + .../objects/ab5436a5af3244fc8e0a826e65c51339 | 1 + .../objects/ab5e9f6b8b2a421cae206f19482b72b6 | 1 + .../objects/ab65cf21d3a147cba92da36dc4c6f99b | 1 + .../objects/ab81e30424bb47009f6d3191c2b29a98 | 1 + .../objects/abcf1d16001a45b0b91325005c340c0c | 1 + .../objects/abd13ecb9840423dadd520901eeeaccb | 1 + .../objects/abd64899d63649ec89af70b823e7af22 | 1 + .../objects/abdd70db46514c78840832e005c9eb8f | 1 + .../objects/abdfde4091294164a1fe8bc853824c50 | 1 + .../objects/ac12a828a93d4b0cb0be1b0a3636ad40 | 1 + .../objects/ac1ea9034d42431b8a8aa93d9c5904f4 | 1 + .../objects/ac4e8b4f38e54746a1444739a04b8c9b | 1 + .../objects/ac59cebefc794b9994b8a7cfc8e292ba | 1 + .../objects/ac5bbae7b0f14ca5bc6c4ff90d10db6c | 1 + .../objects/acb0f71f44fe4d539efb8837d0716410 | 1 + .../objects/acbb499df7124056a787767ba694ccb1 | 1 + .../objects/ace173456eb74868aea0b0276b0741c1 | 1 + .../objects/acf29fb2822642acb0c734358081ee44 | 1 + .../objects/acfc88d48c904f62af480478ab711849 | 1 + .../objects/ad28003945a541ccabfcf0b56f831e04 | 1 + .../objects/ad4e8f866d4d41258cc702530332b9a8 | 1 + .../objects/ad6d338c9c3e41bdac8db44bfd3294a8 | 1 + .../objects/ad6d489d84f144348289371377fcb82c | 1 + .../objects/ada0c440ca434944a9d740a556aced6b | 1 + .../objects/ada4b07f4db94e408323b09d5dcf4ebb | 1 + .../objects/adb11c34295041e4bec370bf5c043246 | 1 + .../objects/adc1edb5c5c941f5a3e52c8e1a2253f0 | 1 + .../objects/ade2de4bb3c1475088f9eaf4aa72f7dd | 1 + .../objects/adf63080462e419b9d475a0630b6f2af | 1 + .../objects/ae1f24d454cb47628e59dae9cb9674dc | 1 + .../objects/ae258e623bee44648504e9f6118634ce | 1 + .../objects/ae34bf5fd86143ecb8000a18f705a15e | 1 + .../objects/ae49c42252264b9daffe6d67fbd223a6 | 1 + .../objects/ae79acb4fdf54fdea2fba01dda1b9f0a | 1 + .../objects/aeed3ea3cce84e609ea6529f63cdb281 | 1 + .../objects/aeff913cae364d7aaca1e2b1ee4f428d | 1 + .../objects/af1d5a35313e46eab358896db4b9ee09 | 1 + .../objects/af71403a946a45f28b75d7372f28cd15 | 1 + .../objects/af8436e30c544726aa17abacf84d6dce | 1 + .../objects/af91bb740f92407ea0d70eb05fac83cd | 1 + .../objects/af932c100b58442eb553713ad4271c36 | 1 + .../objects/afe06c2421c048c4b86b813eca9614bb | 1 + .../objects/afee6e1001574ea88f98119d0eb57d3c | 1 + .../objects/affd3a4ccf1044288a6d177841fde339 | 1 + .../objects/b00117d4abef4cc481e73f5d68f58b16 | 1 + .../objects/b01f8d69d7f94706b0b01fc2c20fa56a | 1 + .../objects/b0221a1dace742d39271ab9e2f62ed06 | 1 + .../objects/b03c7607e9c9451f91f1a1f070798bf2 | 1 + .../objects/b0426b442e8f45a6baec7915c91af712 | 1 + .../objects/b0696d8b62ea429b894166a6bd8e74bd | 1 + .../objects/b0ac67d77a174da18bb73cc7e59bc36d | 1 + .../objects/b0d0f5336598438196d0d5d97e2da0de | 1 + .../objects/b0e706497f0046b5962069e16a09f019 | 1 + .../objects/b0f83434798143429e47a6399b1134ba | 1 + .../objects/b1064892630544e3be8a65f672ddb1c6 | 1 + .../objects/b10b1a4c84f04a55aadd2d38ba59c1ea | 1 + .../objects/b13fc4151f4f47f4b21d835243b6a497 | 1 + .../objects/b152143b4ffe48a2bb70f1046d4494f1 | 1 + .../objects/b1543b5574a746a2a5a4300a6144fdc2 | 1 + .../objects/b17997ecfa584bfc94fb76b3640c7026 | 1 + .../objects/b17e82e65f3c477b80b0a78e222fdd91 | 1 + .../objects/b1825a710c564510a25fe9cb3fd9c792 | 1 + .../objects/b1a27411fad3401a865bde872adb09b4 | 1 + .../objects/b1b65a9420c149bcb95bfc8b8220be0a | 1 + .../objects/b214020dba8b42909160a212b6e01005 | 1 + .../objects/b2181c907c6947999a2011af2f539c88 | 1 + .../objects/b24c9c4fff544636807f4073c3bdf6ed | 1 + .../objects/b273589eb5074033b8813b9b6f740db1 | 1 + .../objects/b280c29013f541059f035626e842e967 | 1 + .../objects/b283cd0fa6874306b7119af6edf51771 | 1 + .../objects/b285259f30bb4094b1b4e7a681d199cf | 1 + .../objects/b28ac42ab82242f899d1bdcaca668c08 | 1 + .../objects/b2b0be512afe459c85af6d6f4b09413f | 1 + .../objects/b2b469ffd80045469b1b37b4636dd658 | 1 + .../objects/b2f4aacbe7b04d8cad98ea2db2bb94db | 1 + .../objects/b2fa1215dddb4aa4b73bb09392f071c4 | 1 + .../objects/b2ffd322f5de4576983de86cdc5fa8e6 | 1 + .../objects/b31462149f7b4e258ea720750ff86b10 | 1 + .../objects/b3a77d782d224c6497ac02db5b1d85bc | 1 + .../objects/b3a967803c37498cbf3eb6e2723b356e | 1 + .../objects/b3b7addade1c44e3950791016b56be2b | 1 + .../objects/b3b83ae9572048868d0ef63ac90d0906 | 1 + .../objects/b3c181050e134a5293949ac4437ccb12 | 1 + .../objects/b3e1bcd0956e46cf952831d0a51255c4 | 1 + .../objects/b3f3b4a869b04634b2a1853dd432619c | 1 + .../objects/b3f8628c7f4747379525db251c4a5177 | 1 + .../objects/b3fd086910d049159e866a41617908d5 | 1 + .../objects/b417bbb4fc8d4071a06a345b21327cb8 | 1 + .../objects/b4211e7983814177a2b59e79c1dc3510 | 1 + .../objects/b444d63e96fa488197d2553db5c47a33 | 1 + .../objects/b46221c3f5074f43b7b9fcf0ab1d5f33 | 1 + .../objects/b464d0b8cdd24064839978d4b0dff195 | 1 + .../objects/b46f02d2d20e44b29fd182a385a4f04d | 1 + .../objects/b49712ba4ab442a5a68afb536c396c4c | 1 + .../objects/b497e499728d40efa87b0c37891176c2 | 1 + .../objects/b4bd6fe7a42a4c0ba98fef566860eed0 | 1 + .../objects/b4dc208de9864eebb01417bcc6823cdd | 1 + .../objects/b560ab179963487baecbc93bbfb540ad | 1 + .../objects/b5af1b787dfb42abb103988c31760c9f | 1 + .../objects/b5b4470f0c6e45659c1c90db504cdc30 | 1 + .../objects/b5ce857eb00447e28e956a2f43f4d872 | 1 + .../objects/b5cf4eb67cd64d369e4669dafd36b53e | 1 + .../objects/b5d35053afe942ac900e27058d2d02ac | 1 + .../objects/b5ec07fd6ac74e04b91ea0835bca36f5 | 1 + .../objects/b5fcc8cfdafc4ccc8de211e6e5322ef3 | 1 + .../objects/b614ee65a7ff42f9883dc556e5e9a788 | 1 + .../objects/b615f2e83dbb4053856a9a0fadd3aba8 | 1 + .../objects/b616b951fb1d41ad84fad4be3b83b9a5 | 1 + .../objects/b6201a739e1d4b94b9c6338d54d47f42 | 1 + .../objects/b63b41861554467f9309ac7f70b26be5 | 1 + .../objects/b647914f837d4caaa1ae9db03b76982a | 1 + .../objects/b66fc4bf691e44c28c35a1bf48d9211e | 1 + .../objects/b670445f6c6e4c46a94a3d54ddf053ca | 1 + .../objects/b6731c151de14a70b6e126514611f121 | 1 + .../objects/b6b10b47875845f483621ff864360b3e | 1 + .../objects/b6b8e24316c84ac09f294221717969c5 | 1 + .../objects/b6bb206c9e3e4f9bbc94fe06e4b56ffc | 1 + .../objects/b6d4bc429677467bb66a6a09da2d83ba | 1 + .../objects/b6e1d4c904eb4d6bb290a1321d8521b1 | 1 + .../objects/b704bdf46d564e1b97999b71461e7ea8 | 1 + .../objects/b70792f0f7484ec3a75c22f4f04d76d6 | 1 + .../objects/b7097d6b30544999a0fb41face4263c6 | 1 + .../objects/b71da72b746241c09cfcfca6acbf4389 | 1 + .../objects/b72bd8b2781041c6a2e28129ba7aac1b | 1 + .../objects/b7b78dbd3b95456c93975b7c1a569b1c | 1 + .../objects/b7bf746b5d644f0594505dd5c04cd2f2 | 1 + .../objects/b7dcdcd3f45448c3b842c952af1f2baa | 1 + .../objects/b7f31823fd9f4615baffbc2a6427224c | 1 + .../objects/b83cac91f881436aa0956c070cbd0332 | 1 + .../objects/b84052d5db0942f69f154d3d03e72c25 | 1 + .../objects/b84352d5cc744278b84bcc6dde11afb8 | 1 + .../objects/b851d3119d11497b9683daf23906dd08 | 1 + .../objects/b85580ae0ba94fa285a8127df38a2655 | 1 + .../objects/b8672fec17fa4a08a7a8c66588a5f4fd | 1 + .../objects/b86c28182db24e60858c4f54aa92919e | 1 + .../objects/b872696f51194c6c8fb358cb30fab17b | 1 + .../objects/b89ee0719ce84fb9abe0dda56d2398a7 | 1 + .../objects/b8a9cd40a32d46b39283276f126de3af | 1 + .../objects/b8c85d202e294f4bb36ed02f6eaa3ae4 | 1 + .../objects/b8e03ddca73349c791838959ac006409 | 1 + .../objects/b8e2c09b09e742778fbe1af56f61261e | 1 + .../objects/b92e39bbaadf4628b75dacbcd0bdf8f0 | 1 + .../objects/b957fd9ac80e4b2883f8438f1c474a1d | 1 + .../objects/b9784c0b2b774f03bac37da8bed7536b | 1 + .../objects/b99a2d90b109467a9cb1c571ead1ea30 | 1 + .../objects/b9b09215cab44d5aaf9efd852b054b54 | 1 + .../objects/b9d622416174454593b6adb2e0619333 | 1 + .../objects/b9f442f5709b439e82f031d871d2e0e9 | 1 + .../objects/b9f8c2b9548445488bef75682350b571 | 1 + .../objects/ba17456c06d34f1fb0227757cb6c983b | 1 + .../objects/ba1d56f9f30a4bfcbdeab0ebfc8c0bb2 | 1 + .../objects/ba369c9042a046f78fa60a9b5c75ff1d | 1 + .../objects/ba5e7f7fc6534cfd86c6efc99cf7a381 | 1 + .../objects/ba64663a359b4c9dba8ea223c0c62d87 | 1 + .../objects/ba688834b5d342bbb8f9d930d70bb549 | 1 + .../objects/ba73e02af9434a519177134915e81614 | 1 + .../objects/ba795e99b35448ecb586e5c94073a909 | 1 + .../objects/ba862eb4214b410980fd068980d50bf7 | 1 + .../objects/baab3c5fbca9488ea4aac97dbb58592f | 1 + .../objects/bad5a8a812f54f5e8bf7865770fb2660 | 1 + .../objects/baf9b5d048a34ab9bc76610fa6ea9614 | 1 + .../objects/bb1cdfd43904483eac8013ea3f8371bc | 1 + .../objects/bb56bb13c99a4aa6b1a8bdb81e2a85e9 | 1 + .../objects/bb6e1f28ef144a51bdb7bf2324a5fa31 | 1 + .../objects/bb928b3a4f094827ab3e9417975955de | 1 + .../objects/bb9517e3414d4503a542fac41d585190 | 1 + .../objects/bbeb3a44a7fc4e9ca6e72d1de0f312d1 | 1 + .../objects/bbf5043600414341b213bb1b8b4a029b | 1 + .../objects/bbfada755c5f432bbcb0737a477437ea | 1 + .../objects/bbfd6ac73bb944969b57726c54ba70bb | 1 + .../objects/bc05891c746249cca51b33b0293b0801 | 1 + .../objects/bc23d6193b774293a7fa47ff9621bf4c | 1 + .../objects/bc4eae5ea0364387b640a82aa48f2106 | 1 + .../objects/bc6c718881b2417498ed11d9d33f7e08 | 1 + .../objects/bc77c762f2534ee0bb23d2a7587c94f2 | 1 + .../objects/bc788fd454cd46c9956877a25157bd4f | 1 + .../objects/bc871989802340ada0bc088c59b65cf6 | 1 + .../objects/bca35c968c754186a8bca97bf4b8837b | 1 + .../objects/bcb55607230246d0a66502c081b158bb | 1 + .../objects/bcca32d8eb7748e2b5ae6cbc21504f39 | 1 + .../objects/bcea0bdcea8541e3910627746fc04283 | 1 + .../objects/bcfc732fabd94e0e9bd61f3c73ea6815 | 1 + .../objects/bd09e651b8424d44862df446e9f6f98d | 1 + .../objects/bd1ffaab781a4324b78670270293206f | 1 + .../objects/bd3c003d1c6244d98ae14c2aadfcc871 | 1 + .../objects/bd50ab3cf8614a5fa113eb13e9a0c5ad | 1 + .../objects/bd5d66940c3947c5a3648b31b9c7b9ed | 1 + .../objects/bd73a89368bc40acb80f61c94ad8a4ce | 1 + .../objects/bd7bf73c046046b48d0beddde8e23973 | 1 + .../objects/bd901b077fae49a29bc5fe8597302164 | 1 + .../objects/bdb628859c9e49ffae7b8e8e45bd83ba | 1 + .../objects/bdd31c7c4b1a418e95b04e6df9595933 | 1 + .../objects/be4ec7f2f8124986a51db97ffc17d1b7 | 1 + .../objects/be89f9fc06c4461d8c5c61aabf59fcca | 1 + .../objects/be9c4d19477646d1aa70c6633b7a8f41 | 1 + .../objects/be9e96b9567d47af9148da89fbc403d6 | 1 + .../objects/bebfb0aee2ec4be1891fed906cdaa83f | 1 + .../objects/bec3884cb88d46409d2906c652075d74 | 1 + .../objects/bedd061aaf7a425d8304325a770ac9ab | 1 + .../objects/bf0965b28953485aa273404e4cbe4254 | 1 + .../objects/bf15902d537a462c96bea44e76d6ba11 | 1 + .../objects/bf2103025ec447209b56acc691dccb32 | 1 + .../objects/bf2297ec7e7e4c73bead3efd180ccaab | 1 + .../objects/bf58f12963bb42b489ebe92364961cdf | 1 + .../objects/bf688d4bfc3e421d96dd50e3ed4a4b81 | 1 + .../objects/bf70c66a6fee410b914e203190e5248d | 1 + .../objects/bf898c5922f7450e88d345c8b6405442 | 1 + .../objects/bf965ccca9474580a06a70afd80fc21e | 1 + .../objects/bf9e2b56847b430b8a9f69c53f3a94f2 | 1 + .../objects/bfcd95dcd700458ea64a5a84555b8624 | 1 + .../objects/c05cf6f7d03b47e3bbb7b1c8b22a724f | 1 + .../objects/c073169bf3e447e5b09c12393aa45c9b | 1 + .../objects/c08232ee0c7b479e93a769b604bb8639 | 1 + .../objects/c08bbe3a6c304bf4b4dc21d0e4ae1503 | 1 + .../objects/c0954d5cb786478cb98b3af64c2ee8b6 | 1 + .../objects/c0afd804ef6240afa9186a9053887d5c | 1 + .../objects/c0b9f6da74db478c83a862b8e239be62 | 1 + .../objects/c0c13c31fc8241c490e55536c8aa5177 | 1 + .../objects/c0cefec590d2466ebd487490f353e814 | 1 + .../objects/c0e5cc24e03b46698e1e8983365fd580 | 1 + .../objects/c0ebab229cb54451917d46a5030257e0 | 1 + .../objects/c0f0940f7134405a96fd72cfdd8e0eda | 1 + .../objects/c10d08f1a34c4f05a5b56382e383b699 | 1 + .../objects/c14a348d3e544751a42d7b08e53ca89b | 1 + .../objects/c169cbf92460431fb8af4864560000a1 | 1 + .../objects/c16ccfd4b88045aba3029c790c08fb40 | 1 + .../objects/c19f5afc670a4dd6a1a082e2d3c15033 | 1 + .../objects/c1a1201912fc47888ef68b38a5edd4d8 | 1 + .../objects/c1a5ba9ae09242afbfd5db170bd94306 | 1 + .../objects/c1af4d1efcbc4cf599238c85de30d780 | 1 + .../objects/c1da20c055884857a822395cf5c2a38f | 1 + .../objects/c1da216311d24bd88b926e557db34f86 | 1 + .../objects/c1e6228e6bb84810855f05c58e2d94d2 | 1 + .../objects/c2809bdacadc4cecaa76eb872393f1e7 | 1 + .../objects/c2a5bd2bfb2c47e99bd7de962e25e695 | 1 + .../objects/c2b685bcbe62421aba5140b8086d2437 | 1 + .../objects/c2cb4c8e2d73498a897264c98dffa1d2 | 1 + .../objects/c2ce3757269f4e6fa18307a98d84a67d | 1 + .../objects/c2d42f6410474b6d9fe7140d1900a7f9 | 1 + .../objects/c33717447c87456b9777aa64e1c8981e | 1 + .../objects/c338868801d04503861e51de6c442d87 | 1 + .../objects/c33e500db3644df9845d2a1975e6a9f1 | 1 + .../objects/c386b775a7784060ab56f9dcc0af0743 | 1 + .../objects/c39387426a6546fb81d413e1494182d1 | 1 + .../objects/c3a0af09c31a4806b6397565d9b5d71b | 1 + .../objects/c3b09784c4ee42eeaae7a964a31990b3 | 1 + .../objects/c3cb16b1e3174d48a53c2810890510f7 | 1 + .../objects/c3ccfd73254c4bad954de1596abfed82 | 1 + .../objects/c3d09e6ab6874aca8cb08a45845f31dd | 1 + .../objects/c40e81cce99d4661b0475e650a18990b | 1 + .../objects/c4429da1846349789bf8161fa075de40 | 1 + .../objects/c4440e4468de489aa246f76f4eb4ecf7 | 1 + .../objects/c45d59bb83a64fbc9164810edf43c00b | 1 + .../objects/c474e4861ed04be98ba64371d341edf8 | 1 + .../objects/c4892ee10e0c42919c0a39824fbda934 | 1 + .../objects/c49078b23b794014b7740a16330bbc3c | 1 + .../objects/c4c93493b1bf446bac8c0d041436d418 | 1 + .../objects/c4e7e9429980437dad2dd59291d85572 | 1 + .../objects/c4f55f963ca34c9a90f1d08c3cc02677 | 1 + .../objects/c4fa564ffde04b0cb3545c1454cc6bbb | 1 + .../objects/c559aa8b296f43fd8dd638788c1de428 | 1 + .../objects/c55e2567211545ae82b5795bc5e76336 | 1 + .../objects/c5721361ba93452b8163943bce2ed241 | 1 + .../objects/c5843a83bede44829a0e08d75665617a | 1 + .../objects/c5c611af1bf64b9cac7fd0187f879814 | 1 + .../objects/c5cd06c534ac4959a79f9069fb960cd9 | 1 + .../objects/c5d6a897d5cc44a6a63ebfc40ad90a76 | 1 + .../objects/c5defc8a4ae24824bd1abc72076d51e6 | 1 + .../objects/c633024771014016ad11924f96d8015d | 1 + .../objects/c635917e488c419ebb3d6e4d3a20d236 | 1 + .../objects/c6393b476a014dc0822151ac0cb10ddd | 1 + .../objects/c63e190ff42e4353a735e99724f70de1 | 1 + .../objects/c652c5c64c9e428bbf22f7eef54476e9 | 1 + .../objects/c660b27b20394967a9315eb46a9b073f | 1 + .../objects/c666fb2dfcd04291b2cfc5a57a50b390 | 1 + .../objects/c6a67da681fa4d17a5c321cef9ad2c24 | 1 + .../objects/c6a6b97eb39b4935938699efd3b6b0ac | 1 + .../objects/c6a795cffa424286821c26dac92c80cf | 1 + .../objects/c6c23f333ce449b9ae048f44c87ccc17 | 1 + .../objects/c6c6e129f76f4a06842844d21f39ac9c | 1 + .../objects/c6c6fcb625974cb38790c1a1ddd68d0a | 1 + .../objects/c6d11706790244cf9169a6d6c8f2986f | 1 + .../objects/c6d1659e4ec645368ef3a6a58113338e | 1 + .../objects/c6d45beeb5774df1bc823e3792989d36 | 1 + .../objects/c6dccbaef3e94287a16cd14900d56099 | 1 + .../objects/c6f4f61d9dde4d439b6eb43522328e00 | 1 + .../objects/c6f869d61c2b4c038dfb239525df013b | 1 + .../objects/c73ad75f935f4427a4447872b98792f4 | 1 + .../objects/c73b8641562b414482e344c80f069c2a | 1 + .../objects/c75a7b6708f346a7b4c59ddea3fd38b4 | 1 + .../objects/c76c4a9eb81c49d58071916e5b57efc5 | 1 + .../objects/c7ca5c85232348d8a7fc38b09bb3b60c | 1 + .../objects/c7d65f5313f847c89b95e80e887e69aa | 1 + .../objects/c7f07e58ff37486a83b772dcc5d1752c | 1 + .../objects/c7f504a8083c43ea9a28357706893341 | 1 + .../objects/c8161a7047624179ae8d3df58272f6e2 | 1 + .../objects/c87ade8cd6d94e44a670e88027773531 | 1 + .../objects/c87e0684ecda4f84ab47a109b2d2776f | 1 + .../objects/c88ef5b6b2764d3ebd3b33890fd62dfc | 1 + .../objects/c89298c1a28840df8bc2464b97a8dc6e | 1 + .../objects/c89f8f72e1c84dc9b6b475345d51de7d | 1 + .../objects/c8a82731824846fca6c2b90399509bfa | 1 + .../objects/c8b547abf0ed49469f001db9dc1476ab | 1 + .../objects/c8c3b404971847e4a153058a3d05924f | 1 + .../objects/c8caf5c78efe471ba0db16716742afa0 | 1 + .../objects/c90cd9ebfddc4556a7ffe133434bfe55 | 1 + .../objects/c920d64f163342d29198fc59948f87a6 | 1 + .../objects/c9289dfb4657463987319ad7fa25fb2e | 1 + .../objects/c93e98f676a84b9983bb069e25e0a321 | 1 + .../objects/c94abbd9fb7e47c58a8b44f70dd59a1d | 1 + .../objects/c972bd5e5f964ba5b7636ab722fa8572 | 1 + .../objects/c981e62add8142f78df140d9bc41d1ff | 1 + .../objects/c9921a72098a4a56a31b83d0b4bd8c89 | 1 + .../objects/c9a552874b8e4462b203befb991a2211 | 1 + .../objects/c9bf7004fb0447efadead02011de4b10 | 1 + .../objects/c9c09158085949f6836cb73e4e02e5cf | 1 + .../objects/c9c5f92c447341fea4fdb0f820751c7e | 1 + .../objects/c9eef62e56e6404f82abb8944400721e | 1 + .../objects/ca35593042ac4c18b3d364478e491256 | 1 + .../objects/ca3c2df9281a4c50b01a1bbf880d4acd | 1 + .../objects/ca6788c2609b4c2b98b81c0c4778565f | 1 + .../objects/caacd364720c40e6834bbe71c65f7928 | 1 + .../objects/cac07b874f8e471b97e3ac5beedc47b1 | 1 + .../objects/cac69d623f8b44cdac253a28f1d7aa21 | 1 + .../objects/cad6a076a8af44d8a43c0136f5bf7c86 | 1 + .../objects/caf7dc7948ff4d6c9c77895be32e09f2 | 1 + .../objects/cb20699287474e0fb53ad28391095fe8 | 1 + .../objects/cb29151a036c460db4f9ebff51aab1e9 | 1 + .../objects/cb4a64deeeb44ea89c0367ace022d530 | 1 + .../objects/cb7a3c33653f4d3194ecc24202221617 | 1 + .../objects/cb7aa6913ae94bc8b0e99ddb6c1e2f75 | 1 + .../objects/cba06b130af847a8bc657fb427392924 | 1 + .../objects/cbac802919674bd0924fc1d9433c73fd | 1 + .../objects/cbb41684adc64cfbb0d3fa292b08ebd3 | 1 + .../objects/cbba7ca7d35c43e4928ba27842e77a0f | 1 + .../objects/cbdcc0bccb4a45f4954a1063c95c3d98 | 1 + .../objects/cbe894e2015f41b9bad3c5776407e38b | 1 + .../objects/cbef6cbc86864af58a598babd8a7fc52 | 1 + .../objects/cc193a33a8c34c9f8fd3569eed8ba1fb | 1 + .../objects/cca2ca3721c34cb9bb0e1e0b19c4ba92 | 1 + .../objects/ccb3f1ddddfa430f93b4958dddba4391 | 1 + .../objects/ccd9f9de761c4a1888fc1cbafbc2066d | 1 + .../objects/ccddf0001a2a43ccb50c6a14286e271f | 1 + .../objects/cce1fc7c69064c60a4d01b150038cbd7 | 1 + .../objects/cce42394bd224db89793ff25ee7d3eee | 1 + .../objects/cd3912f44c0549fb8df3acb79fa21e08 | 1 + .../objects/cd4eafa319464748a69e2b81e5d3dd76 | 1 + .../objects/cd5870fec1934fbebd7f83803fd0e5b2 | 1 + .../objects/cd6bfeaa6c754b3d92325fdd4cf3137a | 1 + .../objects/cd993c218b5d47b38a0a05638458ed16 | 1 + .../objects/cd9febf2c6244bc982952cd135099f3d | 1 + .../objects/cda20e8bd8a24c1d9e2fbea43ad9d9eb | 1 + .../objects/cdb33583a6e6460ab909c576afa4fae1 | 1 + .../objects/cde37839904c45b6ae85810c31fe9a9a | 1 + .../objects/cde8e8ac8f6d4a4c8a2d63a08fefea6b | 1 + .../objects/ce0370f808544c0d8ea48d77ae0a62a1 | 1 + .../objects/ce0998f1a4f049968c072e49f824e0d4 | 1 + .../objects/ce11675458544479900177f00bade113 | 1 + .../objects/ce30864d4ae54532a079a97c5bc555a7 | 1 + .../objects/ce4100f7001d4a3498dea64cb527acfb | 1 + .../objects/ce4a2c381fa3403f966cb509f67ce434 | 1 + .../objects/ce59eeaf0cf44526ba339013ee7a71c0 | 1 + .../objects/ce5d1048ccd24e3fbc0ecee6083b4697 | 1 + .../objects/ce80d371deac4189b550973f85cfa88e | 1 + .../objects/ce98b4a506ec49a69f3239f4877f6d8a | 1 + .../objects/cee64beb861142faa80b7f0d83388cd4 | 1 + .../objects/cf0f4e8145b7401092abeff69f402ab7 | 1 + .../objects/cf2b13429b844658806a06237cb335f6 | 1 + .../objects/cf37c618ae544253b25d4e14079ebfc8 | 1 + .../objects/cf443f9b79fa49fc8cfc05940ac30969 | 1 + .../objects/cf4d1ba5f0cc47edbc48f8b1573d7a9e | 1 + .../objects/cf4fb5436cf445a097fdebfb57e2f3a8 | 1 + .../objects/cf6bf87a472b488aa82a104d8aada99e | 1 + .../objects/cf6fd8a8df5a42e4a1af6a870163a84a | 1 + .../objects/cf746866f53b4ce58950455040daf0d4 | 1 + .../objects/cf936faae10b402d8aaa2a5eccf43502 | 1 + .../objects/cf98f4d62c6d4d65a913524ef0d41e2c | 1 + .../objects/cfa660bd3a7a43c993fa8457eb5f4936 | 1 + .../objects/cfabcd65dd7347499d6f4ca891cfec39 | 1 + .../objects/cfcff95d60e2488a8575362a3dac90b8 | 1 + .../objects/cfe5b963dce14080b9439db6f7506094 | 1 + .../objects/cff36672487c4e1a83fe56614a2a03e9 | 1 + .../objects/cff5a36196354f8da5fd39c30d732602 | 1 + .../objects/cffa2d8e42644f7a9afe9cace51f370d | 1 + .../objects/d012d541721a40d69116abdbcf0e91e9 | 1 + .../objects/d0156f1e5cdc49219fa9d1ae257a1abe | 1 + .../objects/d017ee5d5b70470c9e4039d655476f80 | 1 + .../objects/d022168acb96426ba94e5bed7d5873bf | 1 + .../objects/d0245d16d71c4d7e9d23359e7191b148 | 1 + .../objects/d0325314024440888bbded5a772bd07e | 1 + .../objects/d03960bd8c0a46798f6a0787a1ef4de7 | 1 + .../objects/d040eb74ed0f49078d3ecb2c8809b33b | 1 + .../objects/d053ade073134cc49e0307b5b345f5b6 | 1 + .../objects/d079dec2a5794977a6f5b458862698e9 | 1 + .../objects/d07c4f355c0743ab947e56d26f83c43d | 1 + .../objects/d08ac24f185546e09b616e3b6dd941df | 1 + .../objects/d09789500e6143e3bb70365c5f23b1ff | 1 + .../objects/d0980c477300458d8e812bfae7c97408 | 1 + .../objects/d0c30b394a9e417ab3d64b5b33e4d05d | 1 + .../objects/d0dcd772d84d4dd6b23b96b06e2aee7a | 1 + .../objects/d0e993208df3469faa8205fa951d2a90 | 1 + .../objects/d0f86fc7045d415fadda72b1c1223389 | 1 + .../objects/d10b238d3dc343a8af1c3db4f76e5e78 | 1 + .../objects/d10c9263f51f488bb9739b3eeb93cfa2 | 1 + .../objects/d11041eb29024003839ea81931a0430b | 1 + .../objects/d120a637038e4cf59e645927da0f7465 | 1 + .../objects/d135e9d9af2a4c42b22968663f2087e9 | 1 + .../objects/d14963d65b3f4ae2b37012623634e3d8 | 1 + .../objects/d156caf689cf443caba9562288b5f3be | 1 + .../objects/d17b1930fe5d4d6e93bd4da956cbe44b | 1 + .../objects/d1cf1e879ebf40b69ddc039df3f9eb37 | 1 + .../objects/d1d51e6cbaf64853a7c1623954ecabb2 | 1 + .../objects/d1f75239d9034fc1a2cc28141d4f6f13 | 1 + .../objects/d20ba42db4c24dde99ba79ebdef2f0db | 1 + .../objects/d20e510099f047df9e0ccb5a70105ff0 | 1 + .../objects/d237c0c740854ce6b6e57609f58a4982 | 1 + .../objects/d258fd6916a14dae90da41aa3f32a1fa | 1 + .../objects/d26659b3308848238a8d82d67c6339cb | 1 + .../objects/d2a63c33a8b0479ba0802529a94a6282 | 1 + .../objects/d2a7c0dbfe6f49d18ba400119024657b | 1 + .../objects/d2bb9d8ab47048f194274f733e8591c4 | 1 + .../objects/d2cf31b801304663b27c83f715094a73 | 1 + .../objects/d2edc97f25c84c778502c58ecff1eb9e | 1 + .../objects/d2ff9d7d7d94470291930099a0b32fe9 | 1 + .../objects/d31025cab88b44ae915efad77c77ea08 | 1 + .../objects/d32f6b68c8d946efae62ae600c4c7e12 | 1 + .../objects/d35f05c613f84fe9b5f4c6d012424e31 | 1 + .../objects/d364601532c0496ca6038affaef63753 | 1 + .../objects/d36ef04003a84d14a7ebf59766d4d2dd | 1 + .../objects/d3773ae2f72c445ea33e78cc6ba23b1d | 1 + .../objects/d38c6366a52047a1aaf364b32be99376 | 1 + .../objects/d3c26c8d872d46468455f48d3ada222e | 1 + .../objects/d4149eebcb0b474480530d0a44dff496 | 1 + .../objects/d44b9be823cd4179a5381ec3e5425d4d | 1 + .../objects/d45694f55e3040848b2022d25812b7b2 | 1 + .../objects/d4695cf2ac2b41c9a4db027947107e14 | 1 + .../objects/d47cee45c61c4e259dc6075b5962d5d5 | 1 + .../objects/d48c28e55c454e8cb265bf471fd23796 | 1 + .../objects/d49cc32a195e4cc096730cc783fc98a5 | 1 + .../objects/d4aea1357eee4f8d90ff8f7cc15f8232 | 1 + .../objects/d4bacd5d4b084316a4b157d2af8e78fa | 1 + .../objects/d4beb8dc8e974e0d88366b4a238dc4e8 | 1 + .../objects/d4c96f1462c94b0a875e796b48c70b20 | 1 + .../objects/d4f270d50ec9417cb5e0dc05dadd4390 | 1 + .../objects/d5135c4a31854e8c8125c5208d44f447 | 1 + .../objects/d520b9be60714aaa9824768f097c103a | 1 + .../objects/d566ff9ca9614e1eafee4e6c6d1fda95 | 1 + .../objects/d56de29f1c4648828b5c35a7322c8afa | 1 + .../objects/d5bd1fb592fa4c5fbd59b387564c23a5 | 1 + .../objects/d5c302a293c2464eb2fd70c8f738fd32 | 1 + .../objects/d5ea8580482d47c69eda30ccb98521a2 | 1 + .../objects/d5f2df42af92445baf4568781990d0f9 | 1 + .../objects/d5f50016a8ad4de9bcce833e0b8c83a0 | 1 + .../objects/d6458214e4c8484ebf91ed9f7e3c516f | 1 + .../objects/d645b611ef504054b89558920ed6932d | 1 + .../objects/d652ae5f3b994dc99d68fca42e4e9a91 | 1 + .../objects/d67d08827f924cf6a8abc9677eff4d64 | 1 + .../objects/d694fd9c52de453bab1bc080ce10bdab | 1 + .../objects/d6953598816e47df91890862f4aa0f2e | 1 + .../objects/d69b8e1261704144b2ca3f8acb600da1 | 1 + .../objects/d6e94dd280a04be380d4bae2076fc0b2 | 1 + .../objects/d722a131b1e9490381e08fb7e33e7b20 | 1 + .../objects/d74a6d935bd9418293c2b9694d781d00 | 1 + .../objects/d75013923b334250886eac914e3a969d | 1 + .../objects/d752e48f242545358f303ee8b99d8b71 | 1 + .../objects/d75533dfbd69477c86214b6d4d27f569 | 1 + .../objects/d75ff3fc98414e038bcf68be255761d6 | 1 + .../objects/d760b214e4da4116b0ef80219b21d5eb | 1 + .../objects/d76d404e86854e32887b067a7daa2a05 | 1 + .../objects/d77117fb8b79439db44349ceb03134a7 | 1 + .../objects/d77acd26b5b04dbc93ed16864943fdd4 | 1 + .../objects/d7c75bd2fdc94053865172ffd47b77a0 | 1 + .../objects/d7d24d9bb0ad475d8515f7c69bad2d67 | 1 + .../objects/d7f62d1192f94c59a5fe7aaedaca26c2 | 1 + .../objects/d820a97b1c514dc18bdad48c80dba84c | 1 + .../objects/d82ec6e2c3b444a7b1d36b9031d35341 | 1 + .../objects/d85b570bb2414276be21c7b9144f98d8 | 1 + .../objects/d861c8ddc36d42ddbb07ce6a6be86f7e | 1 + .../objects/d874ae892c3848fe959c1a14b6029de2 | 1 + .../objects/d89fb5d4814b4d23ba815e331944b4f0 | 1 + .../objects/d8a9e8dee46749ad99992351fa23c6ac | 1 + .../objects/d8b4ee456c4642dd97c1b9761054b905 | 1 + .../objects/d8c04f218e6f43deb1b26e2d0d07e3b9 | 1 + .../objects/d8c256385f43438fa05b2cc8ee9cbd92 | 1 + .../objects/d8caac38a62d49b0a481a59dbf22f210 | 1 + .../objects/d8db8a6f7b31482da18c4a5a2f47f3b5 | 1 + .../objects/d8f51283186349ee9a279f692ccf57d2 | 1 + .../objects/d95be542f6dd451da70991bb6671d754 | 1 + .../objects/d960eded9a5a4ae2ac3fd2be43b31b79 | 1 + .../objects/d97158f11eb24df4bddaebe15be8cde6 | 1 + .../objects/d9c5452fbcfb48f9a9efff7893f6f97c | 1 + .../objects/d9c689f09e6443adbfa1316ceff95388 | 1 + .../objects/d9db15c93b3844a9b36a009dde2dde8a | 1 + .../objects/d9ecf75171994befae6699e6de9ca62e | 1 + .../objects/da0ca755f87a435f9e7e2f8efd633f00 | 1 + .../objects/da236c6ac5204847af5147778eebac0e | 1 + .../objects/da2f85687fc5411da33a6deb37212bd2 | 1 + .../objects/da4ada1c4ea043109b9f852b7a4d571e | 1 + .../objects/da53532bb8504136972f87cdc3f04855 | 1 + .../objects/da62b97602884e9baef8f57be7960340 | 1 + .../objects/da98e9bafb7a4033ad7a3e49d2cee4d8 | 1 + .../objects/da9f4f50d8004a1597b6813638c95bb4 | 1 + .../objects/dad5e1c27b10498ea0a1e28f6c172888 | 1 + .../objects/db0368240b55454f9a8d2f5ffe81a874 | 1 + .../objects/db16d9dfec914626acf5657468624a66 | 1 + .../objects/db20ce6748fc4bdfad60a007507b41c4 | 1 + .../objects/db4ef7ba68604ec5acb16b22735c9d48 | 1 + .../objects/db79ab585ef44c49a462fd776bc6809b | 1 + .../objects/db7ff5aba3724fc699f3deafc6d9d71b | 1 + .../objects/db99877de11546079f28a920c46fa96c | 1 + .../objects/dba562771076449c859542109a3a89f4 | 1 + .../objects/dbb50592c95a4751acb3642050265741 | 1 + .../objects/dbb5d5c1e2db4a318238ded1e24c3030 | 1 + .../objects/dbba277dcd164a32bc140d859efb74eb | 1 + .../objects/dbe5360713fa48b192f16df5e6186ad6 | 1 + .../objects/dbefb553378143d2bbfa080fe79c358a | 1 + .../objects/dc006d676660468aa8aa10852319df8e | 1 + .../objects/dc514ee605e046148047af77df149d8d | 1 + .../objects/dc638acdcc25499c9ebecb198d991814 | 1 + .../objects/dc85e56c06694939a0f7a5cd29a8cf4b | 1 + .../objects/dcaaea62b25240c9ae68aeff281eb496 | 1 + .../objects/dcc0852c13c74efcb29d5441ccc4a732 | 1 + .../objects/dcd5971285cf447b84e5f10fe8fe3e50 | 1 + .../objects/dd1a9f3ec48b44ccb0ef6fa4176575ac | 1 + .../objects/dd1ceadf15f249b18d89f54aa8569027 | 1 + .../objects/dd1efa34a3624f7db8d2379f2bf71b8e | 1 + .../objects/dd30765ab5b84e7aac488d05b2d62613 | 1 + .../objects/dd543c89ebb14b9d92bc507caa98cdb7 | 1 + .../objects/dd7870d4d09246a682e802c8bfa40d97 | 1 + .../objects/dd7eb8f6d87140bc94fc80a5f6195008 | 1 + .../objects/dd909a69626040f3b9cb83163a7918b6 | 1 + .../objects/dd9b0722acf2413a9f21a15e613e6f77 | 1 + .../objects/ddad6409180e43caa8acf26104fe2394 | 1 + .../objects/ddcaf6362e1a45ab9a22b7b0ff79c072 | 1 + .../objects/ddcc40723f304cd988959ea3151fb3f2 | 1 + .../objects/ddd19a87237f4acf84d5522aa460a144 | 1 + .../objects/ddddece2170641728c9dfdd49105d351 | 1 + .../objects/ddf8eb57d9874f6cab80c25104036ef6 | 1 + .../objects/de300fac9acb43f38cf3b4dfdb11ab1d | 1 + .../objects/de4441cc63a9480aa999c634e80be2dd | 1 + .../objects/de9ea941c3df43389fd5526f84a766ce | 1 + .../objects/deb5009a07584fb6858522cc1a4702f3 | 1 + .../objects/defc79571a0f42809933ecd16ba9e6ba | 1 + .../objects/df0d28ff915d47969735248329805f61 | 1 + .../objects/df167cb0447745adb7ea8180d479de96 | 1 + .../objects/df1a9cf57bea4390b6a7396389e84969 | 1 + .../objects/df2feca9563148d78305df1b5d6d96bd | 1 + .../objects/df6178a95c3b4ae2aa7762340d605d7c | 1 + .../objects/df886110723b4873aa3e08a540867490 | 1 + .../objects/df8b8375ad7c492e9db73b228410ad3a | 1 + .../objects/df8c3ea403ba40e097bbeefa151072af | 1 + .../objects/dfc7e47cdc8e402fb48a6c3c7d208b53 | 1 + .../objects/dfccbe711cba40e9ba111b448210aae8 | 1 + .../objects/e034318dc544487baaf5fd021326c710 | 1 + .../objects/e035916d1e5e4d33a9f0a3d694efc473 | 1 + .../objects/e060a31b4c174a57a4fe5f47ca7b815b | 1 + .../objects/e06b9bd564584251b56bddf34e646d53 | 1 + .../objects/e071638267f64ed5a076992fb10efea6 | 1 + .../objects/e09d0a93242649e3a39a282b036a85f9 | 1 + .../objects/e0ed39f1d971442b8f159fb5c50a613a | 1 + .../objects/e110bff3ad1646a18a6f056aa77873cd | 1 + .../objects/e119bc78b832401ba99a86ed5006199b | 1 + .../objects/e1200cb943d54e5f86800f1a480e74e9 | 1 + .../objects/e12aef2ba57c44b0ba19d39d0a92ce32 | 1 + .../objects/e134cf492f2e4d7081f36317505e0435 | 1 + .../objects/e14304cfef2b4e3881cf7dca5d0c57e2 | 1 + .../objects/e165f9ff42634ba89d9600d17c17b214 | 1 + .../objects/e16e8946718f4e13878654b42a1e6df8 | 1 + .../objects/e1839c0b16174727a6cdd55819bd46fa | 1 + .../objects/e18b42344fcf4ca38dfa1d9f9e1ba5c2 | 1 + .../objects/e1c4ef2bb0f04c5486afa9f41ec745ee | 1 + .../objects/e1d685b02ddd4e17a0a39ff3ef26bf16 | 1 + .../objects/e1ddaac37b5e4e2f92a6fde98593d89d | 1 + .../objects/e1f428d2bc334e8787e3adcc02378ca9 | 1 + .../objects/e25b9d6c6db64b698c20ec8fb1643402 | 1 + .../objects/e264de774070417caac9196f8725046e | 1 + .../objects/e28414ea5a5b4d70b3f04427e05e9080 | 1 + .../objects/e2a0da1b1b8c4eedb1742339057b9278 | 1 + .../objects/e2ac698917654288a2d152b22a679ec7 | 1 + .../objects/e2b938ad534040a5b4b8dd948d5d63fd | 1 + .../objects/e2eddd6f0ab643ea9cce1bdf88b600d3 | 1 + .../objects/e365cf2c0660404a9727341c375228c8 | 1 + .../objects/e3765490fce1406085e491e60fcc8f92 | 1 + .../objects/e3912da2c4334a3da5c91a32b6c423cf | 1 + .../objects/e3bb21a3e74b4d6a9daa9575e6be2267 | 1 + .../objects/e3e7acce38a540319eb82aa30a9dd482 | 1 + .../objects/e413c7ced26a44af985a9b7aad865cee | 1 + .../objects/e44775b86a064196a2ca397740991b53 | 1 + .../objects/e4699d0584484af1962ac254d80d7e65 | 1 + .../objects/e480714321ea458d9dd43ff808460334 | 1 + .../objects/e4b81d3c8fcd48dba738023ed6fe0928 | 1 + .../objects/e4dc576a5c6148cbb4cb23ee2b7c509b | 1 + .../objects/e4f60a1783354b2689a52b421df80263 | 1 + .../objects/e51483023f2a452a961a109719806aa2 | 1 + .../objects/e58a7e5bcefd4e1ab9d08d6d676bfc5e | 1 + .../objects/e5cec2ad2b16456b847bc3dc7358d08f | 1 + .../objects/e5d4385291f948c39698f9d7b328afce | 1 + .../objects/e639ceba5a6b4b9dafa38fc2955ed2f0 | 1 + .../objects/e648078d050d4ee791c194e70682f3ef | 1 + .../objects/e65b58f22d7d4a66a3ad3959a371e9b5 | 1 + .../objects/e66dcf40a1e74c05a54132cf4054d767 | 1 + .../objects/e677632c42814f04ad0bd1c8852bc9c1 | 1 + .../objects/e68f40d53fdb4d82a1d6ca2edcb83024 | 1 + .../objects/e6cc14f51b534b1d8355b421ca41754d | 1 + .../objects/e6d01cad3d544c94acd7d6f682182675 | 1 + .../objects/e6e5032b83bb44d394af0be44e8f2ff0 | 1 + .../objects/e70cc7b5d3a84b91997a51d334434297 | 1 + .../objects/e72421cc90014540ae711057994676d6 | 1 + .../objects/e78e8ed23c4845f4a413879d64ddafb6 | 1 + .../objects/e79e9db79cdd4d77a3dfd8cf26eb95da | 1 + .../objects/e7a75886270148b6801a74f99db6bcc5 | 1 + .../objects/e7b16d5e37a04be9970dbbeb531831b3 | 1 + .../objects/e7b6c2e790154654bcfd567809bb2126 | 1 + .../objects/e7cd02e088ec47f48b656d81b94c48aa | 1 + .../objects/e822ab42d0c74278b4acf3b6ba9ebd3b | 1 + .../objects/e84608f5ebb140a4a795d6dfc155519d | 1 + .../objects/e85402e38020448f8cd655e4e8aa038d | 1 + .../objects/e8569cc75e834351b2bd644d7a726b75 | 1 + .../objects/e85e81ef4dd1474c9c0fe5e36fbef11a | 1 + .../objects/e87d3a13f5704e3a9817cc2af01bfe07 | 1 + .../objects/e89e16c9f39344a2b6af222e2cd4a957 | 1 + .../objects/e8a9854a509b43d5af051cd57ef00ee9 | 1 + .../objects/e8c6ffdec1224ccc9bcd568a14c79d80 | 1 + .../objects/e8d12031cd19490f828143c34dae3ab3 | 1 + .../objects/e8ddd2026c7647e68072b2cecf576224 | 1 + .../objects/e938411c203d4c9fbc94da544a7e37e0 | 1 + .../objects/e99171b5187f4c63b58a77a1d79f4b4b | 1 + .../objects/e9ab844542144466a188902485fa6698 | 1 + .../objects/e9b14206c76a49598cbf986294f6c45e | 1 + .../objects/e9f7adb555c1429c8ca222061da54864 | 1 + .../objects/e9f830ba548d465a895e8a6e165fcbee | 1 + .../objects/ea15a4e7051044f98361e4f29d1ad23d | 1 + .../objects/ea496daa435a4a44abb106c95e86aba5 | 1 + .../objects/ea5b8393a0d1444f8ab741f1f9717d93 | 1 + .../objects/ea5d8607a3484e5894860a77b5927d0e | 1 + .../objects/ea6a86ee1e87410990206e2559b66539 | 1 + .../objects/ea92dfbba36f4d768b5429630b53bfa3 | 1 + .../objects/ea9f0c4987724d4295705798d34f4063 | 1 + .../objects/eafe32ef33eb4aee9d1b273aff2bd533 | 1 + .../objects/eb28e1dae62348ce9febecdc8ba9c94b | 1 + .../objects/eb2e64e88e07440fa887054a4be8ddb8 | 1 + .../objects/eb34841ef1174ce888c795ee0c688f06 | 1 + .../objects/eb36ce05b8ad4dd3bf7c4a03d8c511f8 | 1 + .../objects/eb420594c778451ba279046760054049 | 1 + .../objects/eb4726613b39496892ad298bc0a555c7 | 1 + .../objects/eb542d1562ae41a79d4d9d7a08ac5e67 | 1 + .../objects/eb87c79fb7d34d64b7123adce48b10a1 | 1 + .../objects/eb8edb45315b46deb99dd6db1018cd9c | 1 + .../objects/eba280afc3fd4b928fcb8c4d3a58c838 | 1 + .../objects/eba54ca07ce64063a976c30e53df647c | 1 + .../objects/ebbae898121b4b6790833f598b8d5442 | 1 + .../objects/ec09c8b2f3064d28adcbd1e05777bf48 | 1 + .../objects/ec0b034357994cc2b06bca043938877d | 1 + .../objects/ec4a4ee35234416bac71e4fc8da016a4 | 1 + .../objects/ec6cbb7ec7b84b7c8b87f71ab1079dd8 | 1 + .../objects/ec7b51a0302d4efa85a55e06c4ce043f | 1 + .../objects/ec991771dcb2445081fe6aa091036fe3 | 1 + .../objects/ecb2c3eef88d4d2495d5049eb4251e83 | 1 + .../objects/ecba76821ac84108bc158d1b7fd81814 | 1 + .../objects/eccb6c09a6894d608cbc6c99b747d1bf | 1 + .../objects/ecce85d43fea4273ba94f2ae0e066ea6 | 1 + .../objects/ecd90c7589f044f3bc016177b44bcbbb | 1 + .../objects/ecfea76d47274ae183d37186b8a370c6 | 1 + .../objects/ed0a6b891c2f44df81520634e5dfcf32 | 1 + .../objects/ed3ce1d19af64d5b958725b71e01b8a8 | 1 + .../objects/ed46adf356284041a0fc023e0238acbb | 1 + .../objects/ed4a6276cdc44f03bfcb9e63c02b5a3b | 1 + .../objects/ed6879adf7254da0ac3d0689b32632fa | 1 + .../objects/ed8ad0c09cfd41209ef22656863ca870 | 1 + .../objects/ed9a16d83d204865a76b27336e58a78d | 1 + .../objects/ed9bcf6a210d4352976aabc97a7503e6 | 1 + .../objects/edab2f15f2cc469aada3aaf15e5770a0 | 1 + .../objects/edaccfe1662a410cb1d8099cf619f17c | 1 + .../objects/edb5cd56daad4c59bf4ac4e3a266e0be | 1 + .../objects/edcb30dbd9f44153a7ab9ea1f28a662f | 1 + .../objects/edd6c594dd494f9b99a34d8551902f51 | 1 + .../objects/ee57b1a54bf14a23b0197e4c281c62be | 1 + .../objects/ee677397bb2c47268e80bf3504a8e4ed | 1 + .../objects/ee6b8c1601794a0b9bd244204b701be9 | 1 + .../objects/ee6e51ae4a81444b83734ce8e84850d5 | 1 + .../objects/ee7a9aa4b3e94d88a89e7d94b7f8552b | 1 + .../objects/eeae7251a25349f8aae175f931ad22e8 | 1 + .../objects/eecd63ecdb054ad48290103c5784e012 | 1 + .../objects/eef1f6187c2a4f36bb86777581e996a0 | 1 + .../objects/ef052509f61e498b9c6974db8cd4fde6 | 1 + .../objects/ef4584e24d724267aa62c9db21931574 | 1 + .../objects/efc1f2dbf1e345ba863189ef54e1c6a6 | 1 + .../objects/efc8557b2edc4e418f9fa9364ba0ea4b | 1 + .../objects/f04cd1a26ae84001a79d2e35cabe2270 | 1 + .../objects/f05aef91cc6e4c0aba8f49da7a77668e | 1 + .../objects/f05e374411f44fa7be0ec6a137a97b2e | 1 + .../objects/f073354cbb4049f99ef0e700a97a6e39 | 1 + .../objects/f080f26c802341a0986123c7c0a1b662 | 1 + .../objects/f09d8cb734844be1b854b5e33e397a86 | 1 + .../objects/f0a6835787044a709f989262eec78159 | 1 + .../objects/f0d93ad3810b4b41a9a7f678227c4fc7 | 1 + .../objects/f0eba872ad4d4748a00b409aa6672822 | 1 + .../objects/f106415d5af44645b85c271f7e43e8cc | 1 + .../objects/f1180824934b40c49003c4706cb96d91 | 1 + .../objects/f13d029db128456c82505ec7f271b143 | 1 + .../objects/f166b376ddb445b2bffcc88e7a96b427 | 1 + .../objects/f1858c3d371148eab33e010136b58c27 | 1 + .../objects/f19e154839c04cf1974081a09dab0ae8 | 1 + .../objects/f1a359fba43b479b9f759bcc016e966d | 1 + .../objects/f1c0676e017847619cbdce2935e3475f | 1 + .../objects/f1cda069b424421f9a326ea8f92111de | 1 + .../objects/f1e81826b3a54448a99c3b70f9971281 | 1 + .../objects/f1fc132503724287b415af81b3e5f724 | 1 + .../objects/f21127e919af4705925c4417e6398fd8 | 1 + .../objects/f227796b21844ce2b3eee475c14c270e | 1 + .../objects/f255eac093664548aefaed3a79f4e96b | 1 + .../objects/f27c8606e9c14c1a914c77ea47eaca43 | 1 + .../objects/f282368d4f0f46438c975f12def95111 | 1 + .../objects/f289062e72f347bf98ec254d02779d83 | 1 + .../objects/f295014901734e34ba8f8dd8e9bdff80 | 1 + .../objects/f29533c7cbcd4721b7b665cd60d98322 | 1 + .../objects/f2dfcae75c6e41108e9f85ed3259b562 | 1 + .../objects/f2e9eea7c1b74c049b64c27a4135e18d | 1 + .../objects/f30478d924e345c8bbb30084b058c6b8 | 1 + .../objects/f30de1c9f9844e1abbc006ac96d09792 | 1 + .../objects/f330a0c6a955409984747644c83ef2b2 | 1 + .../objects/f36f229dd14e490c8d1ecc190f6fa55d | 1 + .../objects/f39140e161b04774980f98ee3b12488d | 1 + .../objects/f391601121cc40c2b3219498cf193875 | 1 + .../objects/f3ba6e606e50464eb0455e7072d2c86c | 1 + .../objects/f3c92fff8d264332b9c5a93f9051fc56 | 1 + .../objects/f3d402f52f3648749f1c752bbfcc3c61 | 1 + .../objects/f3d7e16af4064bbe934314060c234cce | 1 + .../objects/f3e9f0482f88489ab0aaf6d83c2bb02f | 1 + .../objects/f401ab0e17a349df9836c936dbd41629 | 1 + .../objects/f45a84219f794712afe92299acaae6dd | 1 + .../objects/f4667a963a544b198c050d1c581b3367 | 1 + .../objects/f46bc1980b444ccbbd2ab887a3e8a571 | 1 + .../objects/f472c130ef2842bcb30080f1f9ade83d | 1 + .../objects/f4836083dc484e9692250824a7d9f2f1 | 1 + .../objects/f48e4398458947e29478789e9c0ceda1 | 1 + .../objects/f4ec6ec175f547ebb4cea81c68fe037b | 1 + .../objects/f4ee16e24d0c4406afa3ac7627c551b1 | 1 + .../objects/f4f3c2d8054e432d813adfbd5535b935 | 1 + .../objects/f4fbac1901504a0a93bee0e149a6f2e7 | 1 + .../objects/f4fd222b8a624ef2be3dab67f1153146 | 1 + .../objects/f5318290b8f644e0a4fc5b1154e4318a | 1 + .../objects/f539c0e39f8747e483a993ada4b1355b | 1 + .../objects/f54306190a854b338378f92d14322d7f | 1 + .../objects/f5515505be1641a0b39383ec80a7c329 | 1 + .../objects/f551f2fb26ce45a991cfb1a9a3c013be | 1 + .../objects/f569d22811054cfeaa4edf075affe5ba | 1 + .../objects/f57e58e0ad5a4bb095d1ea6bbf8ce644 | 1 + .../objects/f57f7919c689452a96f3a42f44eae182 | 1 + .../objects/f58b1fc2d48440619a3ead210678b2df | 1 + .../objects/f5a7f7afbdf14e719ba7fe4bd3a84486 | 1 + .../objects/f5b43ac207f349ac83e44790d8f3db08 | 1 + .../objects/f5c19f04188549c6a3b61317908dcbb0 | 1 + .../objects/f5e58520dac14f689ad05ceb5e7c809c | 1 + .../objects/f5e5f32313d842ee86aae31d3cf0b698 | 1 + .../objects/f5eefddd2a024cef985e785b19d7607d | 1 + .../objects/f5f79df9fabf4e9fbf2d20dfb42ba85e | 1 + .../objects/f60ffe2362344c199ae5d462e769b8ce | 1 + .../objects/f613db790a184e6f8829964a6b07a8d8 | 1 + .../objects/f64f3317a42b4eddb7b4e5503d101f62 | 1 + .../objects/f668e1295e5f4a96b4a8cc4bbba969e4 | 1 + .../objects/f671a21777174c94b0f5dcd2479b8ef1 | 1 + .../objects/f67b0dc0cef44987b6f0d4ddbe95f667 | 1 + .../objects/f689035ebadb4610a57ce0a0dbea8a4c | 1 + .../objects/f6bc171560f64a40813be1bdf7f52165 | 1 + .../objects/f6c8d0c73f164c24893e4b1b324b2d70 | 1 + .../objects/f6d24dc936204b679c4a03f49bf3095d | 1 + .../objects/f6d679c65c3c4abc8d81a6e5eda22db6 | 1 + .../objects/f70e03272e8d42b08b12d191fc81b863 | 1 + .../objects/f73f3b7b01074a4f86064bb42dab1539 | 1 + .../objects/f7472138d3f64fcaa8c8384417e71aa4 | 1 + .../objects/f748a1d31f34426f97cda5ae9cd70df9 | 1 + .../objects/f75b3763d1614a408dd11742dc8f6b3b | 1 + .../objects/f76de825e6174b8dacf379c2ea6a3a8e | 1 + .../objects/f76eb7b55328437aaa6d6c8c3669d0ff | 1 + .../objects/f77cdd745178480ea6df9be43f63f3b9 | 1 + .../objects/f789730b9a0e438d8062cda663144ace | 1 + .../objects/f78fda47350f41a48692ced12e62d829 | 1 + .../objects/f7989f60fde4439794b6d606289cdb3b | 1 + .../objects/f79a9d3ac4ab4ac097dc020d038b83dd | 1 + .../objects/f7a4660dee0d4d35850e4d01b185210b | 1 + .../objects/f7c8ee17261447c0bf676e1f5b394c81 | 1 + .../objects/f7dabfe9b5e640be9109ecb2ed214bc5 | 1 + .../objects/f7f5ae34078c42569825debabb052a41 | 1 + .../objects/f8044fb814da4e6b8cefbfdb6cec2f1f | 1 + .../objects/f83aa9ce6c5c47fb929e4c256b441673 | 1 + .../objects/f8557abe1d944adc921dc80b4abfef57 | 1 + .../objects/f859bdb26732444f81420a170da6baf3 | 1 + .../objects/f8d27f85052043ae8988c4574248701a | 1 + .../objects/f8e6ba45b21a450998751ca6604d7145 | 1 + .../objects/f918493989014b06b9edc8e6f00888f2 | 1 + .../objects/f9465cc9601045af81536c0c961fb8f4 | 1 + .../objects/f9911eca289345b7810bec446f4674f9 | 1 + .../objects/f993d646cd9349b49722cbaa8b6248fd | 1 + .../objects/f9a3d80379634b358ef09df07ede3c5d | 1 + .../objects/f9ad589cd68f4f758f98162ff6514b37 | 1 + .../objects/f9e0577ba2644b9f825bc794b812ab90 | 1 + .../objects/f9f37b57d6f14df5b53f9488c9917330 | 1 + .../objects/fa15804db6fc4f80a0368adac57e1349 | 1 + .../objects/fa17a799713e438bb5b98598baccd814 | 1 + .../objects/fa25a4ae5ad54d7ebe31d04ddd97d554 | 1 + .../objects/fa2668f8d6c241e18531115109e44eb6 | 1 + .../objects/fa3314aea77c404e8c82c90868c4fad2 | 1 + .../objects/fa347a3d48064e49a1a5ca2bd917e879 | 1 + .../objects/fa8370e0b961451f975d4679a4468943 | 1 + .../objects/fa92855ab3be4727958056e2c0f94584 | 1 + .../objects/fa93a2bd9e8e49a8894bdbff3619821a | 1 + .../objects/fa9b8e0dff4a437099a95b1b9be952f0 | 1 + .../objects/faad565a97f44ef08d318c6de22d74fc | 1 + .../objects/fac8a0c92688497fa84e8f61b9614260 | 1 + .../objects/fad521e4207043dfb79226f011e51cdd | 1 + .../objects/fae79ef437eb434e8d2c07cdba7afe4c | 1 + .../objects/faea2aa5901c45c3b8dc1dfdcd0b6c58 | 1 + .../objects/fafd8a8f6a974c74bfda25a188308f9c | 1 + .../objects/fb3f6a6a6aef4da6aa4c1087a017efaa | 1 + .../objects/fb49c9ce07f5444cbfbb20d949135b06 | 1 + .../objects/fb67217b821041ea8651e2053e7d229f | 1 + .../objects/fb6d5f14eace420784ae70399ec6ab9f | 1 + .../objects/fb7b2e2102e84dc3b31c2b46d3ff2422 | 1 + .../objects/fb823023b5534fdba52db4380040ac56 | 1 + .../objects/fba40144c85a494aba107db75feb8d8c | 1 + .../objects/fbaf5a5f938c4d35afa3491d09220b26 | 1 + .../objects/fbb6956717cc42af9d2688d967f59e0d | 1 + .../objects/fbdf76a9ecf04d9c9bd6c7e4de38d548 | 1 + .../objects/fbfd1dd4fa6c40159f1ab60a7d8c62e6 | 1 + .../objects/fc01a35301604d24aead60eae937c05b | 1 + .../objects/fc06177f3a0343ceba34b71d5b523472 | 1 + .../objects/fc0d0932d6374c5299988c4f10cdfad2 | 1 + .../objects/fc0f655d39e84d6d9fb6073855c6c73d | 1 + .../objects/fc1432cc3b084f2bb8684d08ef3b5a0b | 1 + .../objects/fc24416949a34ecca88ee65e7c374fd3 | 1 + .../objects/fc6c7d5eec864261ab0b6ffc4ff8a7bb | 1 + .../objects/fc716cac59fe424d827b47faadde8d62 | 1 + .../objects/fc862cee8e6a4b4888126e895e290140 | 1 + .../objects/fc90994ad78b40c7beaf842974de1c6a | 1 + .../objects/fca0189672974ae186a2e3e1f4ffa39d | 1 + .../objects/fca265af82564bb48ef33ff91de4a617 | 1 + .../objects/fcc651d135d44dd7b480873a1fad8cf6 | 1 + .../objects/fce19a80e49f4fc89dd700029edf1e0c | 1 + .../objects/fce3a9f973964e039cf71168bc05adf2 | 1 + .../objects/fce41a11f02b4260a01c34c61866be3f | 1 + .../objects/fce6ce0e96ea4bb481566cba6a7b5d00 | 1 + .../objects/fd290642719d4247a679bfd3125388e6 | 1 + .../objects/fd367c3d48c94c60b0d19e4b53bb293f | 1 + .../objects/fd4204d8724a4022955bd89cf91ea242 | 1 + .../objects/fd8cf00ab1b541f69f8c5cfbbcc7fe2b | 1 + .../objects/fd8f283ae5ac4d79bcb1ffcbd31116e7 | 1 + .../objects/fd939c7bcaf04aea8129a472066dc98c | 1 + .../objects/fd96d650d7344a5480a01b11dc70b375 | 1 + .../objects/fda25189eaec4e6199d9af97b2dd33d6 | 1 + .../objects/fdb9ecd3090749f3972cef3d293321d9 | 1 + .../objects/fdc4303b5b1445dd8b052084d0589d97 | 1 + .../objects/fdcc80f38e73462898ec0f82cba9799c | 1 + .../objects/fe280e1272254cad82660657f4614175 | 1 + .../objects/fe6e24138a4e4b52ab10ad160a410409 | 1 + .../objects/fe6f84c5c5024eae8e64412868f33f45 | 1 + .../objects/fe75831a49384664808a8c3a3329e809 | 1 + .../objects/fe7fc30328af448a822ff060f4dbf5d5 | 1 + .../objects/fea85f62952a46ef9c2219b887029e87 | 1 + .../objects/feaa6d32a8b845469e37516470f60bb4 | 1 + .../objects/feb08449bcb7480aa785aadbdd7cd88c | 1 + .../objects/feba68a2a37042d3b943326f9f8b014e | 1 + .../objects/fecce3b96ebf443285c67a787ee0a4c0 | 1 + .../objects/fed3ef112e0f4492bb1729d223aad0a5 | 1 + .../objects/fed78d33caf2436288ef8ce47c29af8e | 1 + .../objects/fee19067728b4ceea0769f57c6767151 | 1 + .../objects/fee5f6f60d6e4b678498976168917a01 | 1 + .../objects/fef0d32c08be4c04ae0f793a268d6341 | 1 + .../objects/fef330d9efeb44b6a7150ad12484aa39 | 1 + .../objects/fefaf834003242d59510ca393110c130 | 1 + .../objects/ff2485aa359442b3baca2a6311c337c9 | 1 + .../objects/ff5a070d939d485691af90624b51e701 | 1 + .../objects/ff71ac1f6f724a03939e4899d03158f9 | 1 + .../objects/ff71f4e299244ce998b2608dd5b1cadd | 1 + .../objects/ff7999b8dafb428caed30e3193f76b94 | 1 + 2667 files changed, 2666 insertions(+) create mode 100644 geo-cache/config.json create mode 100644 geo-cache/geoassign/indexes/d15c07cca25f456db849dd578d35dd21/all_keys_with_undefined create mode 100644 geo-cache/geoassign/objects/002c4c37869a4564a9eb67aebe70dd3f create mode 100644 geo-cache/geoassign/objects/002d5bbbebd94270bcb52797eaf8a2d4 create mode 100644 geo-cache/geoassign/objects/00367af712f746e8bd133605867afae9 create mode 100644 geo-cache/geoassign/objects/00566dee72f149cd893e944f65ecf8d4 create mode 100644 geo-cache/geoassign/objects/005b87a42bde4ff08602db3afbcd5780 create mode 100644 geo-cache/geoassign/objects/005e69619a134c9a8502981be8dd6194 create mode 100644 geo-cache/geoassign/objects/0068f7d7df0c4a4fb9f8d3ea10814942 create mode 100644 geo-cache/geoassign/objects/00899a6166114099afd4d76ef2214f7f create mode 100644 geo-cache/geoassign/objects/008a6b6969f2488f8c47920dca862274 create mode 100644 geo-cache/geoassign/objects/0091b47814314f6cb67b3311ad7a78b1 create mode 100644 geo-cache/geoassign/objects/00cae3a17bab497cb611758a255b64fd create mode 100644 geo-cache/geoassign/objects/00d3bf269c924023b136c18e74b02165 create mode 100644 geo-cache/geoassign/objects/00d4418b5bcc4aeb89d414a4b9220b54 create mode 100644 geo-cache/geoassign/objects/0113788ac63a4c6481a779429de9c615 create mode 100644 geo-cache/geoassign/objects/0120c5c1b2114a09aafec4bf8dfdcdc9 create mode 100644 geo-cache/geoassign/objects/012f4226ab754ffe9c6baefa1459ff15 create mode 100644 geo-cache/geoassign/objects/013f57ef6f4b477b962f4379ea5e9eea create mode 100644 geo-cache/geoassign/objects/016520f656fc496c9ac4f4c5f623729d create mode 100644 geo-cache/geoassign/objects/019208a8339049ddb409311d56363dcc create mode 100644 geo-cache/geoassign/objects/01a3490ba3d4447fabd9ebe242a4f432 create mode 100644 geo-cache/geoassign/objects/01ac36f793a24a1a88c9d806750bd765 create mode 100644 geo-cache/geoassign/objects/01bbb58706564c8b8c87f8b128e25f6c create mode 100644 geo-cache/geoassign/objects/01d2c03b486042da86b06c2b193a54e6 create mode 100644 geo-cache/geoassign/objects/01e4339abc204e75a14096a8ae678df5 create mode 100644 geo-cache/geoassign/objects/02071769630a4711a6447af8a20e2570 create mode 100644 geo-cache/geoassign/objects/020a710962f245029825d539df497e05 create mode 100644 geo-cache/geoassign/objects/021b548d645c41ba8e3110ca9a739aff create mode 100644 geo-cache/geoassign/objects/022e044c969740ef82c9835b68eb425f create mode 100644 geo-cache/geoassign/objects/0230ef43466e4d37bd88a1de6c9682b2 create mode 100644 geo-cache/geoassign/objects/023a211e00d74d798e568acfa9a4779d create mode 100644 geo-cache/geoassign/objects/024ddf804cf34d4ab42326def7b101f9 create mode 100644 geo-cache/geoassign/objects/02509b4d50954ce3a1556bbb64a1cff4 create mode 100644 geo-cache/geoassign/objects/02802c1dd0964cf6b983503269f22b26 create mode 100644 geo-cache/geoassign/objects/02b024af36794190860cda09c2b2b550 create mode 100644 geo-cache/geoassign/objects/02b2186bae1241848ccd2ee7ddcf86e2 create mode 100644 geo-cache/geoassign/objects/02d0ea6e9ece4899b744374436a43efb create mode 100644 geo-cache/geoassign/objects/02e6823a5ca44a568ffc42ae9388039c create mode 100644 geo-cache/geoassign/objects/02ece3271d744c32a217d7929d68a67a create mode 100644 geo-cache/geoassign/objects/02f20c9e25184872936328e192bfdf14 create mode 100644 geo-cache/geoassign/objects/02f3642e4a2e4b12a6ae5b7b4d781dce create mode 100644 geo-cache/geoassign/objects/02f999bd791248bbbe3f088864660f7d create mode 100644 geo-cache/geoassign/objects/032df21ebc5c4a229e72ef995bb8d986 create mode 100644 geo-cache/geoassign/objects/033e8d854de44ef1909b627dc347667f create mode 100644 geo-cache/geoassign/objects/035ba112014e42c285fb952ce8e24f05 create mode 100644 geo-cache/geoassign/objects/035e534d04b641019addc893ac4e34cf create mode 100644 geo-cache/geoassign/objects/0360e63ce7214aaaaa0788eaa33402a7 create mode 100644 geo-cache/geoassign/objects/037458da20c740528749d0b657edcf4e create mode 100644 geo-cache/geoassign/objects/037f48fd35fe430abb0a4c21bd60e065 create mode 100644 geo-cache/geoassign/objects/0388547e1d5f49ccba2d8ea006e6c60b create mode 100644 geo-cache/geoassign/objects/0388773c667e4bac91ffccdaa92e99ac create mode 100644 geo-cache/geoassign/objects/0390ea3861b84789ae33d86b19379f19 create mode 100644 geo-cache/geoassign/objects/03a3257e143f47c3ae9a37a0ed75e3f6 create mode 100644 geo-cache/geoassign/objects/03ee881258a443e4bb9ded8ed3b87db9 create mode 100644 geo-cache/geoassign/objects/03fe62ff9d7a4cc9a598015c23d24ded create mode 100644 geo-cache/geoassign/objects/040b077474524674b3fb8dd224bfde67 create mode 100644 geo-cache/geoassign/objects/04119d5e735944649443636c5fb7196b create mode 100644 geo-cache/geoassign/objects/042629c37879489486a31e1d1a49b3ee create mode 100644 geo-cache/geoassign/objects/045d8ebe7fb04d319b7b07fe5d16765c create mode 100644 geo-cache/geoassign/objects/04967fc6b68640769b24a74b1308dc19 create mode 100644 geo-cache/geoassign/objects/04a00fefb8a540109a14366bd3eab4ca create mode 100644 geo-cache/geoassign/objects/04c670a4def54865a3d51d0c821adba6 create mode 100644 geo-cache/geoassign/objects/04d7d9c7ca4540809478a72ad5d635b5 create mode 100644 geo-cache/geoassign/objects/0546fa7853f54d6b9349640ee55d590f create mode 100644 geo-cache/geoassign/objects/054f7fc6c97247159ed750e0e3b6628a create mode 100644 geo-cache/geoassign/objects/056afff4d3db4378bca5a91729a3209d create mode 100644 geo-cache/geoassign/objects/058edfaf6a4943d1a709d4a71a371633 create mode 100644 geo-cache/geoassign/objects/0590119a9581413395afff18b1725f8b create mode 100644 geo-cache/geoassign/objects/05adccfba0d2434d8e5067426bdef4b0 create mode 100644 geo-cache/geoassign/objects/05b479d1c84441228417f267fef89f57 create mode 100644 geo-cache/geoassign/objects/06157060162e40b3a4d327629c3fcd68 create mode 100644 geo-cache/geoassign/objects/0615d7e1ab864e91ba8cfd1ee59c4ed3 create mode 100644 geo-cache/geoassign/objects/0646342dfade4e2da62815541793e6ba create mode 100644 geo-cache/geoassign/objects/0671d3dcc2404c89a2b71e09fe5346f4 create mode 100644 geo-cache/geoassign/objects/06b4c9753bbd434b8d2407edb5e8cb10 create mode 100644 geo-cache/geoassign/objects/06eab519737b448d92f00dfad57542a7 create mode 100644 geo-cache/geoassign/objects/06fae20ce8494681974e5fa154377632 create mode 100644 geo-cache/geoassign/objects/073216b38d49496e99e8e8a44866333a create mode 100644 geo-cache/geoassign/objects/0742cdcb58ca4d53b8f7002445f3b7e0 create mode 100644 geo-cache/geoassign/objects/0771fc0be562499486d5ca5042616988 create mode 100644 geo-cache/geoassign/objects/07abb209020747bda71223fd2ec9e369 create mode 100644 geo-cache/geoassign/objects/07c0ec6dcdb34322a316cd2e3d29c4b4 create mode 100644 geo-cache/geoassign/objects/07c2d3bc656044a381b02a76448001d8 create mode 100644 geo-cache/geoassign/objects/07c36c4982054914a2e3a611e2afbb88 create mode 100644 geo-cache/geoassign/objects/07e8bb778d4f4d6d93aacc6ce00737f7 create mode 100644 geo-cache/geoassign/objects/07ec0c8deb284e86962a1aca4998a35a create mode 100644 geo-cache/geoassign/objects/082049290f1447e6bb665ad06c805d17 create mode 100644 geo-cache/geoassign/objects/0828b0b669b94689a8ceebc333f01131 create mode 100644 geo-cache/geoassign/objects/0834ed708dce452eac69f0d04d6bf036 create mode 100644 geo-cache/geoassign/objects/08377d2b0ddf4764b666e14fd6323f99 create mode 100644 geo-cache/geoassign/objects/084dc7b4f4c9485084531b09450ee5c9 create mode 100644 geo-cache/geoassign/objects/0853270775f74a65aaa2c5c3d20474b1 create mode 100644 geo-cache/geoassign/objects/087866468e634ee89893d0aa4ced0bec create mode 100644 geo-cache/geoassign/objects/088fc40718db41bfaa5e3b63e5e7f244 create mode 100644 geo-cache/geoassign/objects/08c761c92fe2490a8efeda8a8eaf5ad6 create mode 100644 geo-cache/geoassign/objects/0907540ea8d74a128baffbbe9e2853a7 create mode 100644 geo-cache/geoassign/objects/0921b5691afd4d7ea08a3ed74d6b53ab create mode 100644 geo-cache/geoassign/objects/094736fc93964bea9c636277ae074aa0 create mode 100644 geo-cache/geoassign/objects/099df00f05344746943b319da2800fd9 create mode 100644 geo-cache/geoassign/objects/09a5bfe77e85421fa2f6f2f4f02f3ece create mode 100644 geo-cache/geoassign/objects/09d2829962e64ab58873e6f0c85a737e create mode 100644 geo-cache/geoassign/objects/09ee7138673f424db45310ef6f858f76 create mode 100644 geo-cache/geoassign/objects/09f56c6dadd54f3aaeac77c75658ed50 create mode 100644 geo-cache/geoassign/objects/0a066bca458c44fbbbab2b6185370eb0 create mode 100644 geo-cache/geoassign/objects/0a0a9932a88646da8b70b67a6aa21928 create mode 100644 geo-cache/geoassign/objects/0a1de49e5cbd4bd6a4820c0452ddb81e create mode 100644 geo-cache/geoassign/objects/0a3202f1d1574f8287be43b1d64d35ab create mode 100644 geo-cache/geoassign/objects/0a6f8489505d40df9162dd05cf269e3e create mode 100644 geo-cache/geoassign/objects/0a75e7abef3048c3981238c4dfa94a2a create mode 100644 geo-cache/geoassign/objects/0ac872df1ebc44b8950f6a499201b337 create mode 100644 geo-cache/geoassign/objects/0b09264a978c4e7b92009d20b05b0a6c create mode 100644 geo-cache/geoassign/objects/0b139f3126f145daa618b42fe33163a8 create mode 100644 geo-cache/geoassign/objects/0b25bf37ff8c4136a2f4aa672d5597ce create mode 100644 geo-cache/geoassign/objects/0b29cc38c00d49fe9322326d38257450 create mode 100644 geo-cache/geoassign/objects/0b6346916c4c4ad9835d1ec46df8fba5 create mode 100644 geo-cache/geoassign/objects/0b8e3d7fb41e4ca49eb3e342afb9ec55 create mode 100644 geo-cache/geoassign/objects/0baa5c7b054a42a4a0a0cac0eb17cd5e create mode 100644 geo-cache/geoassign/objects/0bb4d070d4b24891ad6f43b02dbc0a1d create mode 100644 geo-cache/geoassign/objects/0bc6980fb43743e59f453b9a410ce655 create mode 100644 geo-cache/geoassign/objects/0c02f8271b874202b2d45e67469a2d4d create mode 100644 geo-cache/geoassign/objects/0c0414612d354a0f8bb1c33597fcc974 create mode 100644 geo-cache/geoassign/objects/0c0ae245224d4bc5b14c030070f2a01b create mode 100644 geo-cache/geoassign/objects/0c3d528bcc294cb49ebfe3eb3d072765 create mode 100644 geo-cache/geoassign/objects/0ca41c731e84439c90f4e1f26ab193b1 create mode 100644 geo-cache/geoassign/objects/0cc1d2861f964d37a10641f642b77802 create mode 100644 geo-cache/geoassign/objects/0cc7f5440f4b48e296e36848ced37edd create mode 100644 geo-cache/geoassign/objects/0ce8f70c6bf54f90939137456a7e6f76 create mode 100644 geo-cache/geoassign/objects/0d4a8ba756ae4d60902e6b7d4d7a24f8 create mode 100644 geo-cache/geoassign/objects/0d634b6387cd43cba45bf8dbb37425c2 create mode 100644 geo-cache/geoassign/objects/0d74b88bce7246d19fdc4710e242a128 create mode 100644 geo-cache/geoassign/objects/0dbbf0789be844639562e33e3d2ab978 create mode 100644 geo-cache/geoassign/objects/0dc5ae8199db4d13959d405965f17d0f create mode 100644 geo-cache/geoassign/objects/0dca4b69dfc741f08ee4828af5227efa create mode 100644 geo-cache/geoassign/objects/0de50880ed054379a8c6eab7c746d4da create mode 100644 geo-cache/geoassign/objects/0de6da6e25e744a7986d97a853836138 create mode 100644 geo-cache/geoassign/objects/0e0f3b934eb948cb8a4004240f7463fd create mode 100644 geo-cache/geoassign/objects/0e12c902c5d44551822a64b65d832137 create mode 100644 geo-cache/geoassign/objects/0e13ffd7e56940d9b992dc0a4f0d3e61 create mode 100644 geo-cache/geoassign/objects/0e16cb1f6f2d4f219c80a343ad9011e6 create mode 100644 geo-cache/geoassign/objects/0e2e6a4338cb4966a81fbc9a4d5a24c0 create mode 100644 geo-cache/geoassign/objects/0e5b6e3dd7fc4bb081451edd08bb1a5f create mode 100644 geo-cache/geoassign/objects/0e7632eb6f2d43bba0b8e811b04fdb97 create mode 100644 geo-cache/geoassign/objects/0e7ff2ad03a24c2094e7ff32e791ccb5 create mode 100644 geo-cache/geoassign/objects/0ea32c268eaa4889af79b22965f78dd0 create mode 100644 geo-cache/geoassign/objects/0f143d0772c34cf2a20856aeb1e71356 create mode 100644 geo-cache/geoassign/objects/0f16b40412ae480fbb89cad60b8a12e1 create mode 100644 geo-cache/geoassign/objects/0f1809887e484e668cd736a704904c6e create mode 100644 geo-cache/geoassign/objects/0f35270056da4c17a7a9900976af848c create mode 100644 geo-cache/geoassign/objects/0f3d1909853e47f1a8e4c45d0ea51bf9 create mode 100644 geo-cache/geoassign/objects/0f4024e4db874503a38c52467dc0f1da create mode 100644 geo-cache/geoassign/objects/0f5d3675f44c4187b18e416df3a9af33 create mode 100644 geo-cache/geoassign/objects/0f65088e3dc94a6f87eade854063e946 create mode 100644 geo-cache/geoassign/objects/0f870a02ea2f45aa99299d22a23dc990 create mode 100644 geo-cache/geoassign/objects/0f8e32419b5245b9840cc3599b2a8269 create mode 100644 geo-cache/geoassign/objects/0fc7a3ef4ef9423cb702dc7a2e2d909a create mode 100644 geo-cache/geoassign/objects/0fd3f35664db4b53bb68f38b03729e60 create mode 100644 geo-cache/geoassign/objects/1043bec2b9c14856880eb739e3188ec7 create mode 100644 geo-cache/geoassign/objects/104e4920dd7f4345b35cfee5bea977d6 create mode 100644 geo-cache/geoassign/objects/108788d747cd4de7ae672fec1ecd088e create mode 100644 geo-cache/geoassign/objects/108b662ea6f244428c8c01ab0e2e35dd create mode 100644 geo-cache/geoassign/objects/10c52c7ceb9f4548a4cb278fefc1b9e7 create mode 100644 geo-cache/geoassign/objects/10c704f0ce1a4471a7d0cbd42080079d create mode 100644 geo-cache/geoassign/objects/10e31e5b8f144885bbad3b7b639848cb create mode 100644 geo-cache/geoassign/objects/10ff0593a81344c1b483cb5c789c904a create mode 100644 geo-cache/geoassign/objects/10ff7113b0ef4f1a80fc8089146643a4 create mode 100644 geo-cache/geoassign/objects/11036bdbaeaf41adb8efe69f76267d7a create mode 100644 geo-cache/geoassign/objects/1143b68f5ce84211858af6806d335790 create mode 100644 geo-cache/geoassign/objects/11451fdbb919475a92d9117365007968 create mode 100644 geo-cache/geoassign/objects/1162ff547eb344459f1eee1b08853886 create mode 100644 geo-cache/geoassign/objects/116e7f43d8f34e6f8b1a3dbccafd9af4 create mode 100644 geo-cache/geoassign/objects/11addeb3c1c64113999be40a73220608 create mode 100644 geo-cache/geoassign/objects/11b83ef02e994c519298874ab7ff6b45 create mode 100644 geo-cache/geoassign/objects/11ba17b84b964d438b2cc908266ccbbc create mode 100644 geo-cache/geoassign/objects/11c859a463f44e05a804b0f4304111c0 create mode 100644 geo-cache/geoassign/objects/11dd02a0c046469e92f8f7c71561e805 create mode 100644 geo-cache/geoassign/objects/122825c615344bf1bad2660526f78847 create mode 100644 geo-cache/geoassign/objects/123ed61a2f5b4c75a800136c38a2634d create mode 100644 geo-cache/geoassign/objects/12459def082946d6b0cc76c01c29a6cf create mode 100644 geo-cache/geoassign/objects/1247a08f6bd44aac9118ee5aac3c86bd create mode 100644 geo-cache/geoassign/objects/1248cb89f0a04d4b969a252fefe9d9e5 create mode 100644 geo-cache/geoassign/objects/12508a78e92b49a18f39a52bef2460c1 create mode 100644 geo-cache/geoassign/objects/125ec62740154327b4c6161b2c0a8ba0 create mode 100644 geo-cache/geoassign/objects/12645a67fbf243828157864635ae7222 create mode 100644 geo-cache/geoassign/objects/12676a6de3634318aa9250af4ea9a698 create mode 100644 geo-cache/geoassign/objects/127c105ec13d4fbba2060a6d3fcbacf4 create mode 100644 geo-cache/geoassign/objects/12ac60d59d874914b792c949eee9e25f create mode 100644 geo-cache/geoassign/objects/12bf88f1784a4d12a27b2e6b6fd48139 create mode 100644 geo-cache/geoassign/objects/12bf9e44cbb548499f868dcf40e5a83e create mode 100644 geo-cache/geoassign/objects/12c762cc6e4f42b48974a1477db59371 create mode 100644 geo-cache/geoassign/objects/12eee91c2aeb4fb2bb8ca8f57a1aa1cb create mode 100644 geo-cache/geoassign/objects/12f83b512e9343dbb83625ee46507555 create mode 100644 geo-cache/geoassign/objects/1326d0571a5d445c941493c8a374113b create mode 100644 geo-cache/geoassign/objects/13414ef48a3b49feaffba62b98a9043b create mode 100644 geo-cache/geoassign/objects/134cfb2fc2f64b5ba17fac08b2f81604 create mode 100644 geo-cache/geoassign/objects/1355efa054b54f3f9d7f2bdd616095c1 create mode 100644 geo-cache/geoassign/objects/136e1e0793794be9a9656137d2fb6c23 create mode 100644 geo-cache/geoassign/objects/13718cd8b1be44b5a61b785841d40221 create mode 100644 geo-cache/geoassign/objects/13b03ad74d564429a4d31b733a30fade create mode 100644 geo-cache/geoassign/objects/13c38a8267a14106a866c7bb3ed59522 create mode 100644 geo-cache/geoassign/objects/13cd31f46a6e4175aa549a1d56cee313 create mode 100644 geo-cache/geoassign/objects/1422f2be9d8b43cb96eef9df2884bb23 create mode 100644 geo-cache/geoassign/objects/145ad8f4d231481399478a76b01a3082 create mode 100644 geo-cache/geoassign/objects/147bb2a3b0364656be72b8260dec3894 create mode 100644 geo-cache/geoassign/objects/14868b4d7ea1437bbf15869818a5c368 create mode 100644 geo-cache/geoassign/objects/14a76d74c2eb4726aeacf80026db1e08 create mode 100644 geo-cache/geoassign/objects/14b9c812ddeb473493422bbea5bb4de2 create mode 100644 geo-cache/geoassign/objects/14b9fe06e46b4f36ab0a3965d560182f create mode 100644 geo-cache/geoassign/objects/15445f2699884e8382dfdbce3fff21b3 create mode 100644 geo-cache/geoassign/objects/1562935516b249e99233c3e7ba675946 create mode 100644 geo-cache/geoassign/objects/15677a33fad4452cbce19a167cbab92f create mode 100644 geo-cache/geoassign/objects/156a45b3621d496499bbbadb166faff0 create mode 100644 geo-cache/geoassign/objects/1571dfbaa643493c87558f85919eb057 create mode 100644 geo-cache/geoassign/objects/1577b1f5d2134c308cba79b337991489 create mode 100644 geo-cache/geoassign/objects/157f966761dd40dd9159dfbfc3ab15a4 create mode 100644 geo-cache/geoassign/objects/1599e9e3da744f479a7bbe09cc3f51c7 create mode 100644 geo-cache/geoassign/objects/15a7382a7f584703b377f5510dba8d9b create mode 100644 geo-cache/geoassign/objects/15be5142f099497093c82f9cc328843c create mode 100644 geo-cache/geoassign/objects/15d366ab910840038f77c28edda94c64 create mode 100644 geo-cache/geoassign/objects/15ee1c660016408597f37c575d98360a create mode 100644 geo-cache/geoassign/objects/164f4af6c2714f5089e2e758669234e3 create mode 100644 geo-cache/geoassign/objects/1672c99a86254edabb5b32331d117672 create mode 100644 geo-cache/geoassign/objects/1690ad4a62234fa8acd83938831f806c create mode 100644 geo-cache/geoassign/objects/16d634b706804a4c9c64f54c5b42dc8f create mode 100644 geo-cache/geoassign/objects/16fa7863a68542fea81b986ff7657e15 create mode 100644 geo-cache/geoassign/objects/170c6823b012424b96cc33b8f55834e7 create mode 100644 geo-cache/geoassign/objects/17196c430a5642baa12416f6d809ba4b create mode 100644 geo-cache/geoassign/objects/17238321af7946cfb5e5d6308ce81daf create mode 100644 geo-cache/geoassign/objects/172974b5769c423a904847979d5b62b1 create mode 100644 geo-cache/geoassign/objects/17752d7801bc42cdb27f94d8ca92acf2 create mode 100644 geo-cache/geoassign/objects/17851978be124dd8af5af473c9965e8b create mode 100644 geo-cache/geoassign/objects/179862337f95477bbc2c96fb605c8214 create mode 100644 geo-cache/geoassign/objects/1798feda210b426dae3d8e854ad8167e create mode 100644 geo-cache/geoassign/objects/179ea51a32834efda0cc7d44952230f6 create mode 100644 geo-cache/geoassign/objects/17a5080cd57d4cddb3f80711accd4e6a create mode 100644 geo-cache/geoassign/objects/17cba258169f4291ad28bde9eefbe49b create mode 100644 geo-cache/geoassign/objects/17d6dbc20f974c3f95fc467d176e3238 create mode 100644 geo-cache/geoassign/objects/183a30f87c884a0f91b34c3b81480f09 create mode 100644 geo-cache/geoassign/objects/183b717353fe4a22ba8db39d09ecadd7 create mode 100644 geo-cache/geoassign/objects/183cab914e404cf592cdd16995fdac8e create mode 100644 geo-cache/geoassign/objects/184274c77914483d8122a04a28525b35 create mode 100644 geo-cache/geoassign/objects/186b2934576e4c0bb0acfab91e82ba4f create mode 100644 geo-cache/geoassign/objects/1875304fbcb24b2eacd58c1e4f98fecf create mode 100644 geo-cache/geoassign/objects/1891cacc425d4026975f2374693af052 create mode 100644 geo-cache/geoassign/objects/18a2d988c24644b6bdf0ec4ff570966e create mode 100644 geo-cache/geoassign/objects/18b0ef18a2b44092a7cc9e5aeee3a6f8 create mode 100644 geo-cache/geoassign/objects/18ccfe61638041a0b81cdaa51a7d0322 create mode 100644 geo-cache/geoassign/objects/18d118dc2f074a37a771ac9bb7681209 create mode 100644 geo-cache/geoassign/objects/18e4ed69659b45ce8850049015bcdc80 create mode 100644 geo-cache/geoassign/objects/18eeca3212aa4cb2bef189276e67ca50 create mode 100644 geo-cache/geoassign/objects/1907f1bddf9442ddad7636469b11f08f create mode 100644 geo-cache/geoassign/objects/192be6c501164d41bc5a02d442d83141 create mode 100644 geo-cache/geoassign/objects/197cb4fa8839482a90e4306503dcc69c create mode 100644 geo-cache/geoassign/objects/197f96a72b6c48f1a53b7a53aac5890f create mode 100644 geo-cache/geoassign/objects/1986fe42ce494d0ba9dc66a3b2e97798 create mode 100644 geo-cache/geoassign/objects/19a4a802c34a4ba7a1af4d0483ee7626 create mode 100644 geo-cache/geoassign/objects/19aa6ce5284e4c89adc4987d369c2c71 create mode 100644 geo-cache/geoassign/objects/19ad771d6a374d1ab66744c35fa75720 create mode 100644 geo-cache/geoassign/objects/19b1790df8c04380a7bf459ad10620e3 create mode 100644 geo-cache/geoassign/objects/19dde2d371d440f5bcc4f7f0f860b922 create mode 100644 geo-cache/geoassign/objects/19e00579bc744627a0a7807f6addad0b create mode 100644 geo-cache/geoassign/objects/19fb9fdf14e347afaa090e759b2b90a8 create mode 100644 geo-cache/geoassign/objects/1a07ed4712944843ba0a2467584139a0 create mode 100644 geo-cache/geoassign/objects/1a23ef03e3124cb095480f8a5eef1419 create mode 100644 geo-cache/geoassign/objects/1a3b9e05921342199a60b8323cfff90c create mode 100644 geo-cache/geoassign/objects/1a53cd6a8464401ea915a538e87bfc85 create mode 100644 geo-cache/geoassign/objects/1a5eb6a7dff0463fb7e290d271620e4f create mode 100644 geo-cache/geoassign/objects/1a7328392f604c9aa151ba4a072e4aad create mode 100644 geo-cache/geoassign/objects/1aa76370322441c8a6cd659a5064b8ba create mode 100644 geo-cache/geoassign/objects/1aacbbbe2d7745fdb04c53ecd8098cce create mode 100644 geo-cache/geoassign/objects/1ab3967a613c483bb1c3b6024c5ab63b create mode 100644 geo-cache/geoassign/objects/1ac660accea14d96b32b0e537d6ee5c7 create mode 100644 geo-cache/geoassign/objects/1aea9188c3ba4575a895cb55d31b48cb create mode 100644 geo-cache/geoassign/objects/1aec1b66f62240318a76a407960086d0 create mode 100644 geo-cache/geoassign/objects/1af4de922a4d448a9e2a178a6f2fbcd4 create mode 100644 geo-cache/geoassign/objects/1b40019b8eea43b78a270ab6b315583a create mode 100644 geo-cache/geoassign/objects/1b46c6b892224b379751ff7abd31e576 create mode 100644 geo-cache/geoassign/objects/1b54f3c0b0484d4985def2bf170408d9 create mode 100644 geo-cache/geoassign/objects/1b61b07dc1e34bd78980b5464b073d1b create mode 100644 geo-cache/geoassign/objects/1b7c718f6a1945b48df3cb2e7155de06 create mode 100644 geo-cache/geoassign/objects/1bb25c7da93b408c8e8b8a178f36c47c create mode 100644 geo-cache/geoassign/objects/1bdd4caa86014ed899969dc2ccb032f2 create mode 100644 geo-cache/geoassign/objects/1beeaa5de67a47d8bc6ab381c7b2b047 create mode 100644 geo-cache/geoassign/objects/1bfbae8d035b4a4faaae4ea3427adb22 create mode 100644 geo-cache/geoassign/objects/1c058a02534c47548d206f022858574c create mode 100644 geo-cache/geoassign/objects/1c083abe10dd4dd9945e8e5e88ad12b2 create mode 100644 geo-cache/geoassign/objects/1c23db554dfd4dba8ace821d1ed1e007 create mode 100644 geo-cache/geoassign/objects/1c2a7320bee34929bd793fb87946f520 create mode 100644 geo-cache/geoassign/objects/1c3f0eb408f74b759637e0393bcbd0ce create mode 100644 geo-cache/geoassign/objects/1c47f0156ca541628f5cac06fb3daea9 create mode 100644 geo-cache/geoassign/objects/1c5ae729b67c498aab0043e4dad934e4 create mode 100644 geo-cache/geoassign/objects/1c5e108bcf69479b8b0dc8d716e9a628 create mode 100644 geo-cache/geoassign/objects/1ccdabee8c92470690aae1285b2bc08c create mode 100644 geo-cache/geoassign/objects/1ce48f94db1f43a3a1a47c9b9e21ba36 create mode 100644 geo-cache/geoassign/objects/1ce9e5ad79e74290bc795c7a0ee594b1 create mode 100644 geo-cache/geoassign/objects/1d0e1c20ad6e4e8097a17859442bbc0a create mode 100644 geo-cache/geoassign/objects/1d22fcb261ca455493ac5c9e22ac6507 create mode 100644 geo-cache/geoassign/objects/1d4ff19162424f3997bf47b967e0a8f6 create mode 100644 geo-cache/geoassign/objects/1d544bd812c94de0b3d7b4b7eb02bfb1 create mode 100644 geo-cache/geoassign/objects/1d5d27b49247454980c261961544706d create mode 100644 geo-cache/geoassign/objects/1d62d28625674c8db1d2260a8cf06ee4 create mode 100644 geo-cache/geoassign/objects/1d7b8b50ae894d4e811bc6cd9f1adcee create mode 100644 geo-cache/geoassign/objects/1d9dc72495f94f0da0848df97f0c97de create mode 100644 geo-cache/geoassign/objects/1da51258d2434d3daddd722c0a93ba10 create mode 100644 geo-cache/geoassign/objects/1dd43e87b4d54c00a16787a17ea960d0 create mode 100644 geo-cache/geoassign/objects/1de9bc80b7ee470694d17f5f4f200577 create mode 100644 geo-cache/geoassign/objects/1dfbb4b8629c4f55a3ad0643bff8858f create mode 100644 geo-cache/geoassign/objects/1e3ed5ae9b0c42619bd3fb6395b14f45 create mode 100644 geo-cache/geoassign/objects/1e43194e2a66432e8d9a547c0bd4d108 create mode 100644 geo-cache/geoassign/objects/1e925c8637944edc8db3ec0ab52708cb create mode 100644 geo-cache/geoassign/objects/1ef5e25fed334ada8bf8df0e7a2dda97 create mode 100644 geo-cache/geoassign/objects/1f1388fe2ebc44c7a663d380158adeaa create mode 100644 geo-cache/geoassign/objects/1f456abad0a74152baf75d826415fde9 create mode 100644 geo-cache/geoassign/objects/1f68280b25a9420090d3301d56344a0a create mode 100644 geo-cache/geoassign/objects/1f74e3a6af6b4a5c9fd36e24a6787252 create mode 100644 geo-cache/geoassign/objects/1f7b3121bf7a428c80475a7520ca2411 create mode 100644 geo-cache/geoassign/objects/1f8a61241f8642dcb7e18a16233e46e8 create mode 100644 geo-cache/geoassign/objects/1fca77cad45a47839dd4a86ca433a3bb create mode 100644 geo-cache/geoassign/objects/1fdbc089f7cd4fa8b22238131241941e create mode 100644 geo-cache/geoassign/objects/2017b06eec35465cadc472b41f47531b create mode 100644 geo-cache/geoassign/objects/201c938705894afdb06ad4767d6e27d6 create mode 100644 geo-cache/geoassign/objects/20314f5ccb56475e872090bccbb4c5cd create mode 100644 geo-cache/geoassign/objects/206394d12f4446f196f45ca2757aebd4 create mode 100644 geo-cache/geoassign/objects/2069cb68032748bdb4c843dcba1d76e9 create mode 100644 geo-cache/geoassign/objects/20a39cd842134a94995f99a7bf39a43f create mode 100644 geo-cache/geoassign/objects/20a4eab473924298b4f8fa9e68fc1350 create mode 100644 geo-cache/geoassign/objects/20a5c9a238474d3888f315d871248a13 create mode 100644 geo-cache/geoassign/objects/20af499ca8594628afdbd6beacbd6ebe create mode 100644 geo-cache/geoassign/objects/20d5101761b845119244f9b12085985e create mode 100644 geo-cache/geoassign/objects/21005ea335394ac9b16a9a48bba7455c create mode 100644 geo-cache/geoassign/objects/21179a8845c349e0b9cb96457cdf2e03 create mode 100644 geo-cache/geoassign/objects/213bf44395dc4d65b321179b82d210a8 create mode 100644 geo-cache/geoassign/objects/215fbe69174d4e849bb8e017aa46ed58 create mode 100644 geo-cache/geoassign/objects/217a3b4915f84a3aa2ece6538f4138ad create mode 100644 geo-cache/geoassign/objects/218dbfa08ee645cfade2de39d3e8fa2d create mode 100644 geo-cache/geoassign/objects/21b7fa5a2820481484ef48b601191e1d create mode 100644 geo-cache/geoassign/objects/21cd3613baca4676b925b2a1ab68fa02 create mode 100644 geo-cache/geoassign/objects/21ec0eaf4fdc4097a46288fc2a7491bd create mode 100644 geo-cache/geoassign/objects/21f40ae9ac8f4e66a726338620d161ed create mode 100644 geo-cache/geoassign/objects/21f448fc4bea45ac97756808a94e17a9 create mode 100644 geo-cache/geoassign/objects/21f693088e4647238feb4bdbcf67515b create mode 100644 geo-cache/geoassign/objects/2214745292124421a400189125431664 create mode 100644 geo-cache/geoassign/objects/2238801fa7c444adb802a20bdb434a75 create mode 100644 geo-cache/geoassign/objects/2274f20883f34149938129cdf3e8b5a5 create mode 100644 geo-cache/geoassign/objects/22795e293e3a4a029d16f737c10d6c83 create mode 100644 geo-cache/geoassign/objects/228741eed8bc46b3aa1d88dc98c6f0cf create mode 100644 geo-cache/geoassign/objects/229e9e683d4846758979f4eb4439d8e0 create mode 100644 geo-cache/geoassign/objects/22a595f5c92a40829c927b377cffa1e5 create mode 100644 geo-cache/geoassign/objects/22a9d489f98e4b8dbd9b85880669b9e0 create mode 100644 geo-cache/geoassign/objects/22eff58f8fd443e792899412b28b703f create mode 100644 geo-cache/geoassign/objects/2319b8e3a9d64b43a33537ef499d024e create mode 100644 geo-cache/geoassign/objects/2322d5762ceb4d18927048f08ff1e75d create mode 100644 geo-cache/geoassign/objects/23818cd4df1a41c992ef41e7f0dd5496 create mode 100644 geo-cache/geoassign/objects/239c35035c0540fabb0397c38d7bd3f8 create mode 100644 geo-cache/geoassign/objects/23cc04f5ba3240c0af52fab2f570f258 create mode 100644 geo-cache/geoassign/objects/23e1c25d503c4131a9bc809b67521b3a create mode 100644 geo-cache/geoassign/objects/23ee272706794d1cbeb706c87cbff780 create mode 100644 geo-cache/geoassign/objects/240f96e23c5c4f03a28af9702f6dbe05 create mode 100644 geo-cache/geoassign/objects/2420937e7da1406f8fefdede431f4826 create mode 100644 geo-cache/geoassign/objects/2421e0bbd3e648c39db4b05bf899d610 create mode 100644 geo-cache/geoassign/objects/2430f8f8e8074bf186081ef60ab3bba7 create mode 100644 geo-cache/geoassign/objects/2437dc143fd045e7a648ccf1dcbb5f70 create mode 100644 geo-cache/geoassign/objects/243ed49769054d5897f18b039a919a20 create mode 100644 geo-cache/geoassign/objects/2456764868464a4cacccdaec55188a33 create mode 100644 geo-cache/geoassign/objects/2495d6f4e2e7403a96224503c5ed353d create mode 100644 geo-cache/geoassign/objects/24a358e6fc564c738ab774063e072a9a create mode 100644 geo-cache/geoassign/objects/24b5fce4f9fd4ff6b1a9819d0da89324 create mode 100644 geo-cache/geoassign/objects/24e2ffe5c257417f9f1d0a1e49b879ad create mode 100644 geo-cache/geoassign/objects/24ff43cd9d7b47d9ae6114da08315de0 create mode 100644 geo-cache/geoassign/objects/253f86760a06432a9c343206b6305aef create mode 100644 geo-cache/geoassign/objects/2565e37ab76044d88a58ccebbe8fc3e7 create mode 100644 geo-cache/geoassign/objects/2572b49c157447bda7abb6863c99d4b7 create mode 100644 geo-cache/geoassign/objects/2577b2a9f60c41de9a8482d89f4c9fdf create mode 100644 geo-cache/geoassign/objects/258e599336ac46ea924e8761e6102712 create mode 100644 geo-cache/geoassign/objects/25a3a2dc9c53447eb50155377ebc307c create mode 100644 geo-cache/geoassign/objects/25aadfc0ec444bb1a1effe2e7e1891c9 create mode 100644 geo-cache/geoassign/objects/25bfb20cc13741afb7ba71305f47e23c create mode 100644 geo-cache/geoassign/objects/25c4735006e248b7b5af710bb4b6be82 create mode 100644 geo-cache/geoassign/objects/25d881b1e1df49de8a89a36f23fae48b create mode 100644 geo-cache/geoassign/objects/25ee9e1a73af435b913b0c3ac37a8eed create mode 100644 geo-cache/geoassign/objects/25f93378f2974992aea95d6d74d857ed create mode 100644 geo-cache/geoassign/objects/261c0e90f8c54728a02320cd4f2c73fb create mode 100644 geo-cache/geoassign/objects/263e488ca4b84d18a2de685800c360a0 create mode 100644 geo-cache/geoassign/objects/26583b2a94c14965bfd2791322ea9590 create mode 100644 geo-cache/geoassign/objects/266bd8f381e042aca84a251182261658 create mode 100644 geo-cache/geoassign/objects/2693aa0950ef438780b4a433aa3a4d5c create mode 100644 geo-cache/geoassign/objects/26bfc6dc00854dacbed0599e9a1666d4 create mode 100644 geo-cache/geoassign/objects/26c0b929756946c48e7b25a9cb0a2b2d create mode 100644 geo-cache/geoassign/objects/271337ca44fc44b7b395206a54b82d43 create mode 100644 geo-cache/geoassign/objects/2717a7790a21429eab85068c7fa27ed4 create mode 100644 geo-cache/geoassign/objects/27529735feaf4b2b86a3b5926b8ea4a2 create mode 100644 geo-cache/geoassign/objects/27545030ed694573953a6da2ea3d5fa0 create mode 100644 geo-cache/geoassign/objects/275f86cadb28439ab97c65091198d8c6 create mode 100644 geo-cache/geoassign/objects/276b3da0dfe54a9cb8f9d7484185f458 create mode 100644 geo-cache/geoassign/objects/27895e32178a4283b5555057b7086957 create mode 100644 geo-cache/geoassign/objects/27a0b8fa769c4d8bbd816638d634c3a4 create mode 100644 geo-cache/geoassign/objects/27d1ea9f1ab34c58bd66d28b5c67fe34 create mode 100644 geo-cache/geoassign/objects/27d7c07e33114029abcd505d6d2861cb create mode 100644 geo-cache/geoassign/objects/281b2d2fd6b44cf9880fcc5212e63c0f create mode 100644 geo-cache/geoassign/objects/281f676e61a74850b572fb220d5c75c7 create mode 100644 geo-cache/geoassign/objects/2823689c62af4979969fd341ebf7e093 create mode 100644 geo-cache/geoassign/objects/2835c091da70467c95ff65a5ca0a4829 create mode 100644 geo-cache/geoassign/objects/2842edef2b8b46509adc5a26c0d14d9e create mode 100644 geo-cache/geoassign/objects/284be7b911da435ab4d381948d028290 create mode 100644 geo-cache/geoassign/objects/286e5faaac2c4a78bb931137fd825643 create mode 100644 geo-cache/geoassign/objects/2871e28afe684f6eb532130d4a33a79b create mode 100644 geo-cache/geoassign/objects/28bfb704149e4a36be5bd2d28b5fcf92 create mode 100644 geo-cache/geoassign/objects/28c501899b924353a768b0868a7c7373 create mode 100644 geo-cache/geoassign/objects/28ca08e3c26d40b883f0fccf13066b73 create mode 100644 geo-cache/geoassign/objects/28d65bc4642744219ea7224bbcac21b9 create mode 100644 geo-cache/geoassign/objects/28f0013e5bfa49ea945cc2982b7fa392 create mode 100644 geo-cache/geoassign/objects/28faa66a4d384536ba76ac96429903cc create mode 100644 geo-cache/geoassign/objects/295b908f0eca40d7bc58f70a16f75016 create mode 100644 geo-cache/geoassign/objects/29883cf0e59945689a51651ec11cc925 create mode 100644 geo-cache/geoassign/objects/2994dda0396f46a393dc92b699a1647c create mode 100644 geo-cache/geoassign/objects/29bf619ddf2849d2a60b6f1a720e959d create mode 100644 geo-cache/geoassign/objects/29cab06067fc4dd795f1fec938d5b355 create mode 100644 geo-cache/geoassign/objects/29e63eb142774f3ab8214f8d62f99f07 create mode 100644 geo-cache/geoassign/objects/29e97000164f4a20814d0b693696df9f create mode 100644 geo-cache/geoassign/objects/2a0650f2c4ec465bb6f85b9867e0d4c1 create mode 100644 geo-cache/geoassign/objects/2a0827b88fc54e81ae880227c3a433d7 create mode 100644 geo-cache/geoassign/objects/2a096157fabf47ee9dcc0e610bf45337 create mode 100644 geo-cache/geoassign/objects/2a0bd086f86f4ba28ca6e20a311304c2 create mode 100644 geo-cache/geoassign/objects/2a312b999fa14279921b3a38b9d89be5 create mode 100644 geo-cache/geoassign/objects/2a55fcbdab93457ca6e2d1302e235501 create mode 100644 geo-cache/geoassign/objects/2a6ad635cc48420296eb7daaa512ac30 create mode 100644 geo-cache/geoassign/objects/2a6cf6bab0884ae681bf445745a3ce2b create mode 100644 geo-cache/geoassign/objects/2a7a270f0287474e8a9ad9b1c47be8a3 create mode 100644 geo-cache/geoassign/objects/2a8c4f6e2422477aa6b44fff4e4ead64 create mode 100644 geo-cache/geoassign/objects/2aa9c9c218ad4ba5b79322405ac37d3f create mode 100644 geo-cache/geoassign/objects/2aac4a1ee2f0417c8fb285e1a2b00c3e create mode 100644 geo-cache/geoassign/objects/2ab9cd6d900c400885319ef293621274 create mode 100644 geo-cache/geoassign/objects/2ac3c30aa11f4c1794aaa3627bb0c9fe create mode 100644 geo-cache/geoassign/objects/2ad01a6a1f284b62a4487e8be6170014 create mode 100644 geo-cache/geoassign/objects/2ae00623e2e440c9a2e20e85c46875e1 create mode 100644 geo-cache/geoassign/objects/2ae570de692641d48667adf038819be8 create mode 100644 geo-cache/geoassign/objects/2ae747611fcd47ecaea1cf207cc17aaa create mode 100644 geo-cache/geoassign/objects/2b086a1449eb48f6ac22f06aabffc9e8 create mode 100644 geo-cache/geoassign/objects/2b224d01ec4646b6933b68545bffc5c0 create mode 100644 geo-cache/geoassign/objects/2b2ccdf744574928b38308beba50c216 create mode 100644 geo-cache/geoassign/objects/2b38dd7318f0486ab1f3e14c83c1d8b5 create mode 100644 geo-cache/geoassign/objects/2b61527cf713494daf567df548a67224 create mode 100644 geo-cache/geoassign/objects/2b729755e0864d2c8b34aba2ba0f40c0 create mode 100644 geo-cache/geoassign/objects/2b78597df3fc42db877c40d15eb58f93 create mode 100644 geo-cache/geoassign/objects/2baaa83507ff4932ad357da58eefbb48 create mode 100644 geo-cache/geoassign/objects/2bc30e35f7a641909ac795d125bd7f03 create mode 100644 geo-cache/geoassign/objects/2bc651b74b404225bd689543d3c63cb8 create mode 100644 geo-cache/geoassign/objects/2bd69f7926b6448ba603fd64d9356a31 create mode 100644 geo-cache/geoassign/objects/2bd70f754d234e6fa1c99b9e348f90bb create mode 100644 geo-cache/geoassign/objects/2be203b9f83a4feeb07ae335a0d1fb27 create mode 100644 geo-cache/geoassign/objects/2beb92b8843c418994cc0fdde07e929a create mode 100644 geo-cache/geoassign/objects/2bf183a73ac94f16bb237258cf47e7da create mode 100644 geo-cache/geoassign/objects/2bf60872f85d40eb993e86857eacc8c0 create mode 100644 geo-cache/geoassign/objects/2c378523a72344639c7c188024e8d2c2 create mode 100644 geo-cache/geoassign/objects/2c4e4015e6664913bcf1ca9b8b63be3f create mode 100644 geo-cache/geoassign/objects/2c6a7e34124f425e89eec1e1a38404ae create mode 100644 geo-cache/geoassign/objects/2c75a27db993477a9f3be6ef728d29bf create mode 100644 geo-cache/geoassign/objects/2c9e06fb5c4447c0ab9aaec0b26b2d6b create mode 100644 geo-cache/geoassign/objects/2ca3e04ca6d64b05b5bada4dec8dee9a create mode 100644 geo-cache/geoassign/objects/2caa3ad2a89142548410db89d7023979 create mode 100644 geo-cache/geoassign/objects/2cabea4b0811464d80e95750140a7c4d create mode 100644 geo-cache/geoassign/objects/2cb844dfe7d74ed6873e34ba14d32d7e create mode 100644 geo-cache/geoassign/objects/2cbdec1c411e4da0ae38a86979130bd4 create mode 100644 geo-cache/geoassign/objects/2cc26e4085774c5a86ced0dde219bc65 create mode 100644 geo-cache/geoassign/objects/2ce2a71bc95c44b597ee740fbaabe1bb create mode 100644 geo-cache/geoassign/objects/2cedd8f1ccdf4da48415cde34a4c5555 create mode 100644 geo-cache/geoassign/objects/2cfd551be5b944e6bbea29b1fa1d6c28 create mode 100644 geo-cache/geoassign/objects/2d0155ff9f514189a981fc0bb7d66e2a create mode 100644 geo-cache/geoassign/objects/2d027c64f81c4d2aa89092e3a668c5ef create mode 100644 geo-cache/geoassign/objects/2d273f662ff046dfa3290f0f81201ed2 create mode 100644 geo-cache/geoassign/objects/2d3094dfda02442ea81e8ae3236d9cc5 create mode 100644 geo-cache/geoassign/objects/2d494173b21447e5a315e2cfbbcb741b create mode 100644 geo-cache/geoassign/objects/2d547d6117e04d49a4e1ebe25f1f97d6 create mode 100644 geo-cache/geoassign/objects/2d6dcbfdf6a64463a8e4f45798aa349a create mode 100644 geo-cache/geoassign/objects/2dbb61e75b03438f916849dd6e20cbdb create mode 100644 geo-cache/geoassign/objects/2df847e452394a30b56d267e08c2f565 create mode 100644 geo-cache/geoassign/objects/2dfb8befa5784970af369cb422ebdbf5 create mode 100644 geo-cache/geoassign/objects/2e00c7962be64e4fbb8f08fb8413dbb0 create mode 100644 geo-cache/geoassign/objects/2e05c3553a9444cd86d4465796c1b8ed create mode 100644 geo-cache/geoassign/objects/2e1455a7f58149f8a310d985eee77df8 create mode 100644 geo-cache/geoassign/objects/2e4d43dbdc6748919c3357dafa93fa04 create mode 100644 geo-cache/geoassign/objects/2e54f20697494e7a8ce6e2869d4c07ee create mode 100644 geo-cache/geoassign/objects/2e550f6e52054f189462c19f3ea34040 create mode 100644 geo-cache/geoassign/objects/2e8913e78c8f4675b5d9148d3321cede create mode 100644 geo-cache/geoassign/objects/2e952fed941546b38e94933c0f37ebf4 create mode 100644 geo-cache/geoassign/objects/2eb6dd30a130452f89ecbb3011cd7cca create mode 100644 geo-cache/geoassign/objects/2f0463a4e87d4c328a00adbb41c339b9 create mode 100644 geo-cache/geoassign/objects/2f1c3d5d6ebe484bbf2e98716adc0d6e create mode 100644 geo-cache/geoassign/objects/2f20c385b4c74087b8659b4ffc72666c create mode 100644 geo-cache/geoassign/objects/2f2c90666a5a4ba89ec7ea67ac594361 create mode 100644 geo-cache/geoassign/objects/2f46df14bc4d4b2f9a77e37caea58eea create mode 100644 geo-cache/geoassign/objects/2f54f22704064c34ab761432e1e2b740 create mode 100644 geo-cache/geoassign/objects/2f5bb56f60f84ebb8fc466ba91388e59 create mode 100644 geo-cache/geoassign/objects/2f6a626140fe42aa917d8a98c85bed8e create mode 100644 geo-cache/geoassign/objects/2f6df8e873184c64918d8e6d1595172b create mode 100644 geo-cache/geoassign/objects/2f71ef6226094ae8b1b8fba023c2481a create mode 100644 geo-cache/geoassign/objects/2fc8dbdbb76e4415bb50144c1d9be622 create mode 100644 geo-cache/geoassign/objects/2fd3411ffc464625b4988ca01e1a1819 create mode 100644 geo-cache/geoassign/objects/2fe11c9fcf964352bc53664efc48a73b create mode 100644 geo-cache/geoassign/objects/2fe41e4dfacc48ff91ae26be7b1254b4 create mode 100644 geo-cache/geoassign/objects/2fe7c51b5a6a46588039679194e36632 create mode 100644 geo-cache/geoassign/objects/2ffc85408e644cae820a2e9630438e75 create mode 100644 geo-cache/geoassign/objects/2ffea8c37e7b46bc936d1e2380350e1b create mode 100644 geo-cache/geoassign/objects/3006732d1daa4b7f8ccb4fb0b034bd89 create mode 100644 geo-cache/geoassign/objects/3010740c90264bed8c10a0118d358a68 create mode 100644 geo-cache/geoassign/objects/3030fea8893f45b5b469a5b9da627791 create mode 100644 geo-cache/geoassign/objects/3043d5274624473993501407b9d0ef66 create mode 100644 geo-cache/geoassign/objects/304665a442544859a8199719f7fd44bb create mode 100644 geo-cache/geoassign/objects/306f819f7a524abdba39f839f952c26b create mode 100644 geo-cache/geoassign/objects/30922c8784bf46bea8b29181d25a1f31 create mode 100644 geo-cache/geoassign/objects/30bcf65b36044bd5bfb1234f3bca55e8 create mode 100644 geo-cache/geoassign/objects/30cccdf5e0e5417a982b5e830aa33127 create mode 100644 geo-cache/geoassign/objects/30ea609e62ce4a328e3b7058a755223b create mode 100644 geo-cache/geoassign/objects/311ab37580e64324b25b55013aef1233 create mode 100644 geo-cache/geoassign/objects/3138ed5129414422b9a86b312179e54f create mode 100644 geo-cache/geoassign/objects/315eef7105884c64b3e291e12ef7f9b1 create mode 100644 geo-cache/geoassign/objects/319b259d03c5498e98699520737d8a67 create mode 100644 geo-cache/geoassign/objects/31a8c95d80334668a44df11d4fdf63e7 create mode 100644 geo-cache/geoassign/objects/31b4825d9af94f98904b9d818774fcfa create mode 100644 geo-cache/geoassign/objects/31b4a90980d44876a693fc09bf9c000d create mode 100644 geo-cache/geoassign/objects/31c02696de3b494aa990b3d072b83745 create mode 100644 geo-cache/geoassign/objects/31d0e4eb28cc4dfab36531fdce3c97da create mode 100644 geo-cache/geoassign/objects/31e18d5a927b43ec8e64acea9aaea29e create mode 100644 geo-cache/geoassign/objects/320e1c099939491eab84a309ec4d16c2 create mode 100644 geo-cache/geoassign/objects/32106b19895e4c808d6cedc749da0aeb create mode 100644 geo-cache/geoassign/objects/323e19b02fa34be4b11f1825bdcf6999 create mode 100644 geo-cache/geoassign/objects/324dac9d083344b9a8a09087321cd342 create mode 100644 geo-cache/geoassign/objects/3260ddcae44849efa4ce3fa88387f265 create mode 100644 geo-cache/geoassign/objects/328b39136b8b40739566a4a47d7835b6 create mode 100644 geo-cache/geoassign/objects/32b594a65569417b8c16472687c8f79c create mode 100644 geo-cache/geoassign/objects/32c9922e3e374cbfb6bd82c8c93d8b88 create mode 100644 geo-cache/geoassign/objects/32ec63865a6347b6856f661fde492abd create mode 100644 geo-cache/geoassign/objects/331897c854ed42f58ef5b715c4832943 create mode 100644 geo-cache/geoassign/objects/3336a42ff0e14014bfb7eed5b4a83035 create mode 100644 geo-cache/geoassign/objects/3355aa20f92e471195392a373d5d2200 create mode 100644 geo-cache/geoassign/objects/33859971440742268686006913964914 create mode 100644 geo-cache/geoassign/objects/33a3830f717f4d05bda05eee1e262e44 create mode 100644 geo-cache/geoassign/objects/33b14ddbd26341ccaf9cdd82ef41412e create mode 100644 geo-cache/geoassign/objects/340ef81813da40728c75905191428fbd create mode 100644 geo-cache/geoassign/objects/341f4d4d95ec4350be807a6088444cab create mode 100644 geo-cache/geoassign/objects/34242557cc314c7495e4fe4a9de6b1ce create mode 100644 geo-cache/geoassign/objects/3437e1822fa648e9ad5969ab40ef1bbc create mode 100644 geo-cache/geoassign/objects/344e7f9a9e074c1cb2b1560bc96b89d4 create mode 100644 geo-cache/geoassign/objects/3452694c129a4004b248bc0159160bba create mode 100644 geo-cache/geoassign/objects/34615851838a4fc2a6735d145c3607b3 create mode 100644 geo-cache/geoassign/objects/3479e5e51d7447098f145c326a361c7f create mode 100644 geo-cache/geoassign/objects/347b75a65214484ebb10ed2ec4e68008 create mode 100644 geo-cache/geoassign/objects/348634fba0984ea69b2fff0ddca60260 create mode 100644 geo-cache/geoassign/objects/34a922643cc3455a80f6838c9ee947d7 create mode 100644 geo-cache/geoassign/objects/34b8277237974690aab360f8d7eca2b1 create mode 100644 geo-cache/geoassign/objects/34c594720caa4b1889e1c15f4184250d create mode 100644 geo-cache/geoassign/objects/34c883e5de024c6eb4f038f7da7b6225 create mode 100644 geo-cache/geoassign/objects/34cdae7a0f934864b5bda0ece66a8bb2 create mode 100644 geo-cache/geoassign/objects/34d14b5678fe4d22a9fe5540c2e0a4be create mode 100644 geo-cache/geoassign/objects/3528a625028e459eaf21eda16a6ee63d create mode 100644 geo-cache/geoassign/objects/35765abb90d74f72bc3539676b7f4a33 create mode 100644 geo-cache/geoassign/objects/359bd54f3e354142b318d4f74b9d0382 create mode 100644 geo-cache/geoassign/objects/35b202a4fe3c4e06b8e1176d11ec935a create mode 100644 geo-cache/geoassign/objects/35cbb2f37db445ddbd0bc87644f4b631 create mode 100644 geo-cache/geoassign/objects/35ef425f7f5743e194589d279069a7eb create mode 100644 geo-cache/geoassign/objects/36155953bb7b4b43b279987f826d4f80 create mode 100644 geo-cache/geoassign/objects/362fabea7b0e4536a635117ac0685c8d create mode 100644 geo-cache/geoassign/objects/3631cf531c8d4680b3e79840158a67e1 create mode 100644 geo-cache/geoassign/objects/363cd55b8dc24e6a80801be55fa738c0 create mode 100644 geo-cache/geoassign/objects/365b8f9631ee4800a00774f50eecfb9f create mode 100644 geo-cache/geoassign/objects/368073ed73b9449991c74bc3030f3953 create mode 100644 geo-cache/geoassign/objects/36c13426cc29424789a8dcde8ee35b81 create mode 100644 geo-cache/geoassign/objects/36c68181da644e6fb259c99c4aff0baf create mode 100644 geo-cache/geoassign/objects/36c77e01bf0645cc9cf96196422ed5e2 create mode 100644 geo-cache/geoassign/objects/36e08578cbda4fcd9990fa9443e518a2 create mode 100644 geo-cache/geoassign/objects/370e01343137415fa7c4475d3b4a2a53 create mode 100644 geo-cache/geoassign/objects/37550c9c6c4840e0b575bb8449d96b0f create mode 100644 geo-cache/geoassign/objects/37570e27e8454b4c93a3dcf93bdf0ffd create mode 100644 geo-cache/geoassign/objects/375edc826e214c33a9f6ae4809ae54f1 create mode 100644 geo-cache/geoassign/objects/3763229693f44aae8e8516d87e968545 create mode 100644 geo-cache/geoassign/objects/37652606632041ae94dafc574c8a31f9 create mode 100644 geo-cache/geoassign/objects/378385fc3ac441e590419813ee6b4e1d create mode 100644 geo-cache/geoassign/objects/3792c7b5893e4c759e461db43b15ede3 create mode 100644 geo-cache/geoassign/objects/37a7a166c2b54f4bb616e0772942dcd5 create mode 100644 geo-cache/geoassign/objects/37ab6256ac2d42b1947e297db877bfd6 create mode 100644 geo-cache/geoassign/objects/37aceccc96fe42c993f9505b8e1ffa8c create mode 100644 geo-cache/geoassign/objects/37c0cc29ce9446faa205159164e09c77 create mode 100644 geo-cache/geoassign/objects/37d26144d56d463ea884d28e314bf283 create mode 100644 geo-cache/geoassign/objects/37e59c4ebd6249c0a43585681d0c47ac create mode 100644 geo-cache/geoassign/objects/37f2ccdc38684b9da8b2dfd3de44ad82 create mode 100644 geo-cache/geoassign/objects/3814d9bbd1454cc5af52b07f8766cf34 create mode 100644 geo-cache/geoassign/objects/383d91819cf94bcebec6628332250256 create mode 100644 geo-cache/geoassign/objects/383ddd25465445c4ac81ebb5f27470c5 create mode 100644 geo-cache/geoassign/objects/38449e3bc9e74077a3f03870bc6aef02 create mode 100644 geo-cache/geoassign/objects/386fdf853ac44574977228bdf6dfd0e8 create mode 100644 geo-cache/geoassign/objects/38895d699d1740a79e44b1c3bc7f266b create mode 100644 geo-cache/geoassign/objects/38a5fa7942224c5aa53738e1e0c91978 create mode 100644 geo-cache/geoassign/objects/38bc4cfd1b2a45ff8bf7dc64c2747f6f create mode 100644 geo-cache/geoassign/objects/38bf13aa60074d2d90e519de8f35d269 create mode 100644 geo-cache/geoassign/objects/38ef259638e140628deca5529f9a6883 create mode 100644 geo-cache/geoassign/objects/391d323bf85a4fb0966ce286a6923a9d create mode 100644 geo-cache/geoassign/objects/3936ab1b21784256862435fbdbaa5972 create mode 100644 geo-cache/geoassign/objects/3937958e20b44a3ea6cb9cf456ad8717 create mode 100644 geo-cache/geoassign/objects/394026f0211c4817ac7ab1e553509e13 create mode 100644 geo-cache/geoassign/objects/395bc488aff140a6907a585d795d5fe3 create mode 100644 geo-cache/geoassign/objects/39624fcc12244c7db3d9be976b20f7d0 create mode 100644 geo-cache/geoassign/objects/39717f7ee3d74dcf9ac215b0ccdcbf3b create mode 100644 geo-cache/geoassign/objects/398963c394a1425cafe7117a6d2fab34 create mode 100644 geo-cache/geoassign/objects/399a52b2d49744509aa950241c1af824 create mode 100644 geo-cache/geoassign/objects/39ba24bde1b04178b526feb917cb2655 create mode 100644 geo-cache/geoassign/objects/39d30b80ff694dd78a2464e1f5ce97b5 create mode 100644 geo-cache/geoassign/objects/39d77d4f8f8042ad86d4838554502048 create mode 100644 geo-cache/geoassign/objects/39d7d5d1791d42d7af216021cef2af42 create mode 100644 geo-cache/geoassign/objects/3a0958497c68456498e96badc989afc5 create mode 100644 geo-cache/geoassign/objects/3a1ee22df0fc45e4a4e89711b1c7b4db create mode 100644 geo-cache/geoassign/objects/3a1fed5fdd3b4777aa03bdef8b39f658 create mode 100644 geo-cache/geoassign/objects/3a5265b016e94506b8ae76f6e0e4e5d5 create mode 100644 geo-cache/geoassign/objects/3a7d0f3d2e4d4a84979ae141dd480b0e create mode 100644 geo-cache/geoassign/objects/3a7edc9b0d7c4641a0e272bbe62a2121 create mode 100644 geo-cache/geoassign/objects/3a827caec4e345f1a7c64de539aa9093 create mode 100644 geo-cache/geoassign/objects/3a8c665f1e0c445aa733a8326293edce create mode 100644 geo-cache/geoassign/objects/3a97775bea824ef4a828e3382698f931 create mode 100644 geo-cache/geoassign/objects/3a9d2e18235d442d8df87bf7f430bfa1 create mode 100644 geo-cache/geoassign/objects/3aaff465e6c645beb9819bc4d954b9b0 create mode 100644 geo-cache/geoassign/objects/3ad20553da7f4defb8efe9f6f7aa56da create mode 100644 geo-cache/geoassign/objects/3ad7d83445ec4214ba2fe15aec7f825c create mode 100644 geo-cache/geoassign/objects/3ae143d9ecdd46d08b398a641b1350f1 create mode 100644 geo-cache/geoassign/objects/3af7bdb1877a4acfba07189ce3c2a948 create mode 100644 geo-cache/geoassign/objects/3b0f7533a5194905abf879c81d1f92d4 create mode 100644 geo-cache/geoassign/objects/3b462c4c5c46439ebc3dcf5d91a551e4 create mode 100644 geo-cache/geoassign/objects/3b70e72b51f943bbb0c0cdce41e5a67b create mode 100644 geo-cache/geoassign/objects/3b7fc6f907b940608587791a393a3f71 create mode 100644 geo-cache/geoassign/objects/3ba56946a98b41ed84eb969fbf67c0f1 create mode 100644 geo-cache/geoassign/objects/3bbdd0e402f84f7f824ba9f445972e06 create mode 100644 geo-cache/geoassign/objects/3bd4efca11bd4da6ac833207ea6e9d58 create mode 100644 geo-cache/geoassign/objects/3c1203c79aac44e4ab500ceae51fda18 create mode 100644 geo-cache/geoassign/objects/3c1dc3d61d664989b1d5d98ccc94a7d4 create mode 100644 geo-cache/geoassign/objects/3c30acc12df0475d9d25353125117ce9 create mode 100644 geo-cache/geoassign/objects/3c47e1414d754dd89942b43dbe492a77 create mode 100644 geo-cache/geoassign/objects/3c9e44ea62fd43fd82012da0b274f532 create mode 100644 geo-cache/geoassign/objects/3cb088eb44134befa7235d31636ee4ec create mode 100644 geo-cache/geoassign/objects/3cb3bffe356a450a8af8d9d03bba1cca create mode 100644 geo-cache/geoassign/objects/3cb9dce9c2884dd89e136d9ac1609c76 create mode 100644 geo-cache/geoassign/objects/3cc60894ac7d40d58f50016b66f3edf8 create mode 100644 geo-cache/geoassign/objects/3cd0b0e5feec483393881f93648195e9 create mode 100644 geo-cache/geoassign/objects/3cd36a5d38d24176bb1c18ac2a9ba2e5 create mode 100644 geo-cache/geoassign/objects/3ce982b5f31d49b78e2b4908ea5161e4 create mode 100644 geo-cache/geoassign/objects/3d1ab7cd48b04c5faddfcf2eaa8d54c4 create mode 100644 geo-cache/geoassign/objects/3d2064fb2ba744a7900e1f21c967c8a9 create mode 100644 geo-cache/geoassign/objects/3d56d60ccb1048838179c26bb149b118 create mode 100644 geo-cache/geoassign/objects/3d682db67cfd49f4a56ee84cba1a3aba create mode 100644 geo-cache/geoassign/objects/3d9475f3277d4f4495b55016989b7ad7 create mode 100644 geo-cache/geoassign/objects/3d9758e56d804551a67d9c93d7e910f9 create mode 100644 geo-cache/geoassign/objects/3dbf821cbdf54e119a5a8f19be800be6 create mode 100644 geo-cache/geoassign/objects/3dc07a8751fa41d18695d28f8bae6f01 create mode 100644 geo-cache/geoassign/objects/3dcbb7ab9589490aac5a0eafaea6ff3e create mode 100644 geo-cache/geoassign/objects/3ddf1e96f09140d69dc3898bbab5aeb4 create mode 100644 geo-cache/geoassign/objects/3de8afce025d4ab78941156954e1fe08 create mode 100644 geo-cache/geoassign/objects/3df8bd8dd8fe48a7b25ef6f2afbe64cb create mode 100644 geo-cache/geoassign/objects/3e338be95e914b6d976c25729699c9de create mode 100644 geo-cache/geoassign/objects/3ee6ad609599482b8290b3502af5baab create mode 100644 geo-cache/geoassign/objects/3f026d2c9ef1408b9214b0a481c0409c create mode 100644 geo-cache/geoassign/objects/3f0b7ef6af4843c384636b5c5912b353 create mode 100644 geo-cache/geoassign/objects/3f11fbff2fce4c138cc89aadda3eae80 create mode 100644 geo-cache/geoassign/objects/3f2c64d675834b8eb2478b6391280bd3 create mode 100644 geo-cache/geoassign/objects/3f42d99f527e4832a6e4924e00c39027 create mode 100644 geo-cache/geoassign/objects/3f47797938af45c9a8d0166091076527 create mode 100644 geo-cache/geoassign/objects/3f5a5ca8dee6462e9e724134d8bc24ad create mode 100644 geo-cache/geoassign/objects/3f6aaef6ac7e4b359f06a13de0550ce4 create mode 100644 geo-cache/geoassign/objects/3f86f19c26fc4bdcad812ae128b98bae create mode 100644 geo-cache/geoassign/objects/3f8d7c85dab54993b771c71d95ef1914 create mode 100644 geo-cache/geoassign/objects/3f929f73e48b409db34735840e5ffead create mode 100644 geo-cache/geoassign/objects/3f9b7f43a3504daabfc5bc3a82a846a4 create mode 100644 geo-cache/geoassign/objects/3fcb604234304d8981440a47fc4d6eb0 create mode 100644 geo-cache/geoassign/objects/3fd252d8bdfb444ab817ce29a50840a2 create mode 100644 geo-cache/geoassign/objects/3fd2de1024624619acd7559e0694e337 create mode 100644 geo-cache/geoassign/objects/3fe5a3c553f44c2eb84b3f97b53f0dd1 create mode 100644 geo-cache/geoassign/objects/3ff24a3660114bbb95904c9e5e9fcfca create mode 100644 geo-cache/geoassign/objects/40163ecd721b4d64994b57ceded1c4c8 create mode 100644 geo-cache/geoassign/objects/401f1b93586b41ee80dfc209a499c3e0 create mode 100644 geo-cache/geoassign/objects/403104f26d12466eb8474d767306b0f6 create mode 100644 geo-cache/geoassign/objects/403433ba01d14a42bbbc0090a681abe1 create mode 100644 geo-cache/geoassign/objects/407c7fa3461f4afb9cdca21e0a5d839d create mode 100644 geo-cache/geoassign/objects/40b33a96aed4494b8ed10d3f888f5270 create mode 100644 geo-cache/geoassign/objects/40d396935c77494fafbb0e491bf7289d create mode 100644 geo-cache/geoassign/objects/410d6411962b4539b4409bad656890c7 create mode 100644 geo-cache/geoassign/objects/410ee29e3c28404599dcc6fe91100e9c create mode 100644 geo-cache/geoassign/objects/41236116e878492ea90082572f06b9d0 create mode 100644 geo-cache/geoassign/objects/4143516f40fe423fb590cd0482e11f97 create mode 100644 geo-cache/geoassign/objects/414e5aa31eda49e199a741669f7195ae create mode 100644 geo-cache/geoassign/objects/4156e9a7ae2f428ebf2e0f0c2a7aee10 create mode 100644 geo-cache/geoassign/objects/41592021ced9450c8d202f165cc4fa19 create mode 100644 geo-cache/geoassign/objects/417d40602e3f4383ab08060231c0e832 create mode 100644 geo-cache/geoassign/objects/417e52a1df454ddb8d2a1861122cfdf5 create mode 100644 geo-cache/geoassign/objects/41881608284e4a938016cee283d7afa1 create mode 100644 geo-cache/geoassign/objects/41941cbfd2ae4d9387d4290425ef926d create mode 100644 geo-cache/geoassign/objects/41d80542c03a4d9cbe46a0930b5285fe create mode 100644 geo-cache/geoassign/objects/41df6df443e2456c8597ff38e7f313ff create mode 100644 geo-cache/geoassign/objects/421f8077b6b44cc090f8869440699db8 create mode 100644 geo-cache/geoassign/objects/4225286bf7c144e58eb15eeaa8e6cedc create mode 100644 geo-cache/geoassign/objects/422ef93e38b441ebb4df422f233fe0e2 create mode 100644 geo-cache/geoassign/objects/4236b2009e7245d78521ea6f656a29dc create mode 100644 geo-cache/geoassign/objects/4238be1b4dc246d995c1d7c1d1272d63 create mode 100644 geo-cache/geoassign/objects/429bd1edabe04863913ccc47284e8c27 create mode 100644 geo-cache/geoassign/objects/42a770a19051461eac80b2d01fc3c079 create mode 100644 geo-cache/geoassign/objects/4322bce65d934f52843f4ec4bd29e16e create mode 100644 geo-cache/geoassign/objects/436568615ed14c5daceadf25d700c3c0 create mode 100644 geo-cache/geoassign/objects/43764206920a49c39aee86afdae73241 create mode 100644 geo-cache/geoassign/objects/4383fc15822e49deac67387b5de4e309 create mode 100644 geo-cache/geoassign/objects/438ad1746f3d451a9970b13d518db645 create mode 100644 geo-cache/geoassign/objects/43baa850d304454494e9c7422981ef0f create mode 100644 geo-cache/geoassign/objects/43bc52426b884509ac23a9beb8d2dd65 create mode 100644 geo-cache/geoassign/objects/43d0a2526d1e431cb47b4622fdbe2426 create mode 100644 geo-cache/geoassign/objects/43dd339d1dd24ec0826a684931097d55 create mode 100644 geo-cache/geoassign/objects/43e45202ab3e43ceb10618cf70b652f9 create mode 100644 geo-cache/geoassign/objects/43f301cf305d49438654a5676f5ffed5 create mode 100644 geo-cache/geoassign/objects/43fae22f88a041cd93e1053fa3fa63cb create mode 100644 geo-cache/geoassign/objects/4425f804fd284b39b5b657e5135f755c create mode 100644 geo-cache/geoassign/objects/443582f1fe514cbc83c651c02b98ef4a create mode 100644 geo-cache/geoassign/objects/444950d15a2d4c5fa6880f241a6cf514 create mode 100644 geo-cache/geoassign/objects/444f53392f364d3bae7d510a73997321 create mode 100644 geo-cache/geoassign/objects/44974c7857214d8c81ab3cde0f9cc6fc create mode 100644 geo-cache/geoassign/objects/44b6c38282444725af6aa0a4f31088c0 create mode 100644 geo-cache/geoassign/objects/44dd127c433546a284f67be4f69b4ce8 create mode 100644 geo-cache/geoassign/objects/44ed56b9d71145cfa118fd02e3f9a3cf create mode 100644 geo-cache/geoassign/objects/44f964caff254ca3ae5011536199221c create mode 100644 geo-cache/geoassign/objects/44fe353cca964b6f854e9b2f27beb731 create mode 100644 geo-cache/geoassign/objects/450be7b46ac541d4ae9d9161d6e4fb24 create mode 100644 geo-cache/geoassign/objects/45241695583247c59ee044b9f568292f create mode 100644 geo-cache/geoassign/objects/45358b04529f4caaa03a2d2cb64ad789 create mode 100644 geo-cache/geoassign/objects/45384b7e800f4a5383d7fee7269aab1e create mode 100644 geo-cache/geoassign/objects/458c523f452649ff9aeefdf3c3f57f23 create mode 100644 geo-cache/geoassign/objects/4595b03ca78c4375a5acf7ac6fd3bd73 create mode 100644 geo-cache/geoassign/objects/45cb3da065f540189af64567f33bc223 create mode 100644 geo-cache/geoassign/objects/45eaa9afff1748ce960dc5d67f0c83f9 create mode 100644 geo-cache/geoassign/objects/45f05b33567f4d1d948f6a8cba52f0fc create mode 100644 geo-cache/geoassign/objects/45fc9b495ccd4aef88113bc2557e59aa create mode 100644 geo-cache/geoassign/objects/4632566c8572487cbbbed72c68b9ce18 create mode 100644 geo-cache/geoassign/objects/46374662098d410bb4ab4e0cba88e037 create mode 100644 geo-cache/geoassign/objects/464ac0496d9a4d22a79ac17fe81c3086 create mode 100644 geo-cache/geoassign/objects/464c63fb36524dfc882050c47043977d create mode 100644 geo-cache/geoassign/objects/4656c33054fd42eab73545864f503950 create mode 100644 geo-cache/geoassign/objects/46625d8c3f55408f96f8c98c1d6c950b create mode 100644 geo-cache/geoassign/objects/4678532496c1495aa6d01c06ce375794 create mode 100644 geo-cache/geoassign/objects/467a156f908f4e88bd7c423f7abbc0a8 create mode 100644 geo-cache/geoassign/objects/46b97d22a5b04a74985e1990bf49566d create mode 100644 geo-cache/geoassign/objects/46c5ca92d1214731992de5ec1d2aed9f create mode 100644 geo-cache/geoassign/objects/46ca050ee3af4652b94cb2706a0d2ba8 create mode 100644 geo-cache/geoassign/objects/46e1fd5c65494cfaa412d16af20c1f14 create mode 100644 geo-cache/geoassign/objects/46e4c07cc326470aa5d6050eec74ba56 create mode 100644 geo-cache/geoassign/objects/46fb91b403ea415bbc9d86eb1fe12bc3 create mode 100644 geo-cache/geoassign/objects/470552fb2df644469d76171768ad2f6d create mode 100644 geo-cache/geoassign/objects/4730bdfa3b604e71b68e30d37f060eec create mode 100644 geo-cache/geoassign/objects/47352a3d8744478aa4514bf6fb875576 create mode 100644 geo-cache/geoassign/objects/474a3d4ff7e046f483f6eae01d55f36d create mode 100644 geo-cache/geoassign/objects/4772ca6070bb437695f8bf7c88911b53 create mode 100644 geo-cache/geoassign/objects/47a50244af4d48f8adc5d1f8e3ce4d8b create mode 100644 geo-cache/geoassign/objects/47ad1d7bddae45dfbacc4166b14518dc create mode 100644 geo-cache/geoassign/objects/47de8ac6c8f34090a50af62c6821a8b4 create mode 100644 geo-cache/geoassign/objects/4803687b289846b3babc3235c0ec026f create mode 100644 geo-cache/geoassign/objects/48300bdec8c74d978e7e333984de3854 create mode 100644 geo-cache/geoassign/objects/4841de4761c64dbe937d0be1cfc9b079 create mode 100644 geo-cache/geoassign/objects/484a6f992146482e8b5d2922568a4573 create mode 100644 geo-cache/geoassign/objects/48600c6fcb644d408299fd39480fa32f create mode 100644 geo-cache/geoassign/objects/4888b060196045fe9062c9a87bbf0119 create mode 100644 geo-cache/geoassign/objects/489ed0b4aaf6455c982f557c9a4478b6 create mode 100644 geo-cache/geoassign/objects/48beb6cf03e5498a9c3366d61ee613c7 create mode 100644 geo-cache/geoassign/objects/48c93f4f8f43434c88bb002146d89b7f create mode 100644 geo-cache/geoassign/objects/48d44164327142fab97beb9550ba2c91 create mode 100644 geo-cache/geoassign/objects/48e5bd54584c4a63bc0ad4bfe50df212 create mode 100644 geo-cache/geoassign/objects/48f99b54406a4c15a55d4ae2759266e5 create mode 100644 geo-cache/geoassign/objects/490fa75ee2534d6e8e201309ae0bd310 create mode 100644 geo-cache/geoassign/objects/4958f7dab06b4657ac1217ea4baaf8e7 create mode 100644 geo-cache/geoassign/objects/495e9f28a4b24c4fa43f30a3e7f1f188 create mode 100644 geo-cache/geoassign/objects/496b41a23d524550b37ad33e48aa4a5f create mode 100644 geo-cache/geoassign/objects/4970b61d4c4143d4b44b3ca55d4321cd create mode 100644 geo-cache/geoassign/objects/497b17b805fe40739ab0c13634013260 create mode 100644 geo-cache/geoassign/objects/497c65450bcf46a98d51fd168b663416 create mode 100644 geo-cache/geoassign/objects/498ecd00078045ed93aba5d61e531503 create mode 100644 geo-cache/geoassign/objects/49906d104cd54ecda02a3770d0d48b5d create mode 100644 geo-cache/geoassign/objects/49b527ac65df4b6fa2ed701d44602a91 create mode 100644 geo-cache/geoassign/objects/49e0386fe0a5451d946b8ec2c8a3d374 create mode 100644 geo-cache/geoassign/objects/4a20f87e9a0540a5996e4d43d4c968d6 create mode 100644 geo-cache/geoassign/objects/4a32944a14c9492d84d25ea53c785d2d create mode 100644 geo-cache/geoassign/objects/4a3c91e8b4684f98893f5829735ccd88 create mode 100644 geo-cache/geoassign/objects/4a62095ad31c47149f62cb3c41e35192 create mode 100644 geo-cache/geoassign/objects/4a78e264f9844d64873e7da973677a2c create mode 100644 geo-cache/geoassign/objects/4a866a579b4d4c9398104232b173efd7 create mode 100644 geo-cache/geoassign/objects/4ab7a880686a4b46965e388b49210188 create mode 100644 geo-cache/geoassign/objects/4ab805816b2e4493a14c14067f6ce793 create mode 100644 geo-cache/geoassign/objects/4aeb3b7368a14a029c06f7fdfc73543f create mode 100644 geo-cache/geoassign/objects/4afb1af1746644f08d0fc91b51877942 create mode 100644 geo-cache/geoassign/objects/4b31fcf9e5c34ad59f59f6ad84f9948c create mode 100644 geo-cache/geoassign/objects/4b56b6bf0bf542218b5b2c278fdb4267 create mode 100644 geo-cache/geoassign/objects/4b5ea06eb82544dbb9a6039e5bdc43e9 create mode 100644 geo-cache/geoassign/objects/4b62a54d74224135aeb893a2e58de0ea create mode 100644 geo-cache/geoassign/objects/4b6991127dd0435fb99bcd99a65e5881 create mode 100644 geo-cache/geoassign/objects/4b7044a11ddd4968b42c99eb0228ccb4 create mode 100644 geo-cache/geoassign/objects/4b84489fac96457c8122bfaeae32b664 create mode 100644 geo-cache/geoassign/objects/4b9304fe60ee4f27bd78ee8c5b798a09 create mode 100644 geo-cache/geoassign/objects/4b9f06271c6240e18b053098903f95fd create mode 100644 geo-cache/geoassign/objects/4bbead2af7064b6ea3823d66a8b462cf create mode 100644 geo-cache/geoassign/objects/4bd4d494863b46c69ecd5b3789a74cae create mode 100644 geo-cache/geoassign/objects/4bdb09bcac764deaaba88ec9c49f1a2f create mode 100644 geo-cache/geoassign/objects/4be61d0252cd44da9bd53721701c7546 create mode 100644 geo-cache/geoassign/objects/4c374add71034ec1bb37a0b0063f33e1 create mode 100644 geo-cache/geoassign/objects/4c4701ba1e83431bb842fad29c5e688a create mode 100644 geo-cache/geoassign/objects/4c849477d454447780e6e33eb9a6b57a create mode 100644 geo-cache/geoassign/objects/4c989e09ce5a4d618653d166a364573a create mode 100644 geo-cache/geoassign/objects/4ce70ab514c14bf08a898468298058f3 create mode 100644 geo-cache/geoassign/objects/4cec25a9d2be4625a59739144b8c0330 create mode 100644 geo-cache/geoassign/objects/4d1f9ad26ac143a289c3bbbfc1b73866 create mode 100644 geo-cache/geoassign/objects/4d26ab56ae2e45c2b344d6ae5351b458 create mode 100644 geo-cache/geoassign/objects/4d31b26106f74123bb3e508b924d3e8d create mode 100644 geo-cache/geoassign/objects/4d49374d355c4b8caa804782c28489ec create mode 100644 geo-cache/geoassign/objects/4d512b03ff8340bb8c031a5763a5ebbe create mode 100644 geo-cache/geoassign/objects/4d79b613f3e641d7b1f92e5a9ba1df39 create mode 100644 geo-cache/geoassign/objects/4d988c2674834c65ab3b4b67cd6404b8 create mode 100644 geo-cache/geoassign/objects/4daea454d9764e36a294eb073155be54 create mode 100644 geo-cache/geoassign/objects/4dbca15da2de4bcd857e4ee8ba60d64b create mode 100644 geo-cache/geoassign/objects/4dc17edcf8354acf804cbbd3d9fa7f2b create mode 100644 geo-cache/geoassign/objects/4de48975e65a41efb389bbea26730f54 create mode 100644 geo-cache/geoassign/objects/4df9624ffcca42b481c9bb5587b43ae5 create mode 100644 geo-cache/geoassign/objects/4e04d30a852a4550bf1cad92a21215a3 create mode 100644 geo-cache/geoassign/objects/4e0eb0e4f243447b8811734ae26790f9 create mode 100644 geo-cache/geoassign/objects/4e5c75f95a0f404f9cf24a59ac3b91f0 create mode 100644 geo-cache/geoassign/objects/4e6c0a56af124fc8886604356f2fdf7c create mode 100644 geo-cache/geoassign/objects/4e6d915ea4d74c30b9ea02d076677e18 create mode 100644 geo-cache/geoassign/objects/4e8244d631e54e95aebda0f3492ebc22 create mode 100644 geo-cache/geoassign/objects/4e92e6f1b96c411d9d163b9700fc0b96 create mode 100644 geo-cache/geoassign/objects/4ec5ace427244a74be7f5939101198e9 create mode 100644 geo-cache/geoassign/objects/4ecb18187cc04b1b8eb1340f7086e76e create mode 100644 geo-cache/geoassign/objects/4ed63b5935c74db083911de0feb5bb59 create mode 100644 geo-cache/geoassign/objects/4ef5e5ae63c2403497825dc37d3366b5 create mode 100644 geo-cache/geoassign/objects/4f196110bdd4452592efc4bdf6bf96db create mode 100644 geo-cache/geoassign/objects/4f50ab62c80d48f9b820bfc4c6f77f8f create mode 100644 geo-cache/geoassign/objects/4f67896b977a4b4ab8511f78c0ffb575 create mode 100644 geo-cache/geoassign/objects/4f792c74ddbe4003bea14449e3fcb4ab create mode 100644 geo-cache/geoassign/objects/4f9ab4b8ecf545a5b932e93784dc3e61 create mode 100644 geo-cache/geoassign/objects/4fd217672d9347bcb2a953eb2f048a41 create mode 100644 geo-cache/geoassign/objects/4fe575af917e43129d19d70d0649b1b1 create mode 100644 geo-cache/geoassign/objects/4ff33f79848c49638f6021486e0bf989 create mode 100644 geo-cache/geoassign/objects/4ff991eee9484bf2afe697c8c30484ea create mode 100644 geo-cache/geoassign/objects/506077209be54545b03c4ff494613acc create mode 100644 geo-cache/geoassign/objects/50719cf6c26848eabbca4dce6f317cd2 create mode 100644 geo-cache/geoassign/objects/50cd27cba6674dcea03d0fe4991051cd create mode 100644 geo-cache/geoassign/objects/50d7323a9aae4512af65aaefaaf06066 create mode 100644 geo-cache/geoassign/objects/512b0867a8c249a9b5af42032821be06 create mode 100644 geo-cache/geoassign/objects/5137a9f2e92943029998b34edacf76a8 create mode 100644 geo-cache/geoassign/objects/51883f17088f4a65b69e227a1dce851f create mode 100644 geo-cache/geoassign/objects/519781fb31834184aba6f1fce5ac8d37 create mode 100644 geo-cache/geoassign/objects/519bbcb085144c7f9754cb26a60ae02d create mode 100644 geo-cache/geoassign/objects/51a6e05ba5ca4b9f92c85b77f013cbee create mode 100644 geo-cache/geoassign/objects/51e30b35b7e24ee1b0ce79638439f823 create mode 100644 geo-cache/geoassign/objects/5200942825484e12bf2ed6276c0a7de9 create mode 100644 geo-cache/geoassign/objects/520cebec035041f1b818bae9ea75a79f create mode 100644 geo-cache/geoassign/objects/5216fe2bdf454cf99675887794a6c4b2 create mode 100644 geo-cache/geoassign/objects/521fb2d9ad094cb6aa86db6ea1c38f7f create mode 100644 geo-cache/geoassign/objects/524bcf87603640b3aada0a2a687b60ec create mode 100644 geo-cache/geoassign/objects/525233084d474614a1d66e10d2a2029d create mode 100644 geo-cache/geoassign/objects/525cb0888a4e4099a209c8cb617a0308 create mode 100644 geo-cache/geoassign/objects/525e336360e34bc88a431d4900126789 create mode 100644 geo-cache/geoassign/objects/5276d6899e4c439c9ac2d84b20a7a3b1 create mode 100644 geo-cache/geoassign/objects/5289f01e70b0425eadf21a55e7a6faa7 create mode 100644 geo-cache/geoassign/objects/528c64adaa934e26a29c98632424e58c create mode 100644 geo-cache/geoassign/objects/5291e1adec814d9a82c4205b73780a56 create mode 100644 geo-cache/geoassign/objects/52c66ac75842448cbc50aacd6c600103 create mode 100644 geo-cache/geoassign/objects/52c93478655f4c3e9c253164d04ad0d7 create mode 100644 geo-cache/geoassign/objects/5301bb39d2e94b9ab18a6f87d89baf42 create mode 100644 geo-cache/geoassign/objects/532b3b9693e64d628791a24be5c8f3e5 create mode 100644 geo-cache/geoassign/objects/5333d41632654e0eb73bdccd34243713 create mode 100644 geo-cache/geoassign/objects/533f8cd0d2bd4e74b63fc7272cf0177f create mode 100644 geo-cache/geoassign/objects/5340c159bec243b6b29461e6385e288d create mode 100644 geo-cache/geoassign/objects/53653a55e7bf4a88b9bd35d75da480bf create mode 100644 geo-cache/geoassign/objects/53870c159d994e28bc11eea4239ccbea create mode 100644 geo-cache/geoassign/objects/53abec6cfbf249d88e1f133bced5353c create mode 100644 geo-cache/geoassign/objects/53bbfde791b0409991d9efc50b9ecdf3 create mode 100644 geo-cache/geoassign/objects/53f06b3b69944ef78f9601c3caac5162 create mode 100644 geo-cache/geoassign/objects/54086f03bf124a31a586d8797bb45f7b create mode 100644 geo-cache/geoassign/objects/54210252060d4e27830d87120962e72a create mode 100644 geo-cache/geoassign/objects/54275e0444684b458f520241909423f1 create mode 100644 geo-cache/geoassign/objects/544482fe022846d09a0a1c9007c8b872 create mode 100644 geo-cache/geoassign/objects/54497a140074425294bc3401babf7690 create mode 100644 geo-cache/geoassign/objects/544d100d6d9b4740afc48e5e5a9e41d1 create mode 100644 geo-cache/geoassign/objects/545bf0e5c2f64f14b012ba5441aba358 create mode 100644 geo-cache/geoassign/objects/5480d046236e44f38fb8e726c2603ddb create mode 100644 geo-cache/geoassign/objects/549aa65d96a7441b99633a352ae950ba create mode 100644 geo-cache/geoassign/objects/54a196ebfdca41459dad52e0ed76d43e create mode 100644 geo-cache/geoassign/objects/54ab8d7e780749ad9d40fc1d32932d77 create mode 100644 geo-cache/geoassign/objects/54bba7a88e624f3c969ee3970242d5ca create mode 100644 geo-cache/geoassign/objects/54bf5c44441641bb87a5b4c344587629 create mode 100644 geo-cache/geoassign/objects/54d8c83f860f4d2db52da64972a8b1d4 create mode 100644 geo-cache/geoassign/objects/54e0508982824dcaa10ffc309b60dc36 create mode 100644 geo-cache/geoassign/objects/5503cfde5e4e40669f6ee53d12372d9d create mode 100644 geo-cache/geoassign/objects/55216c46b69a4868bc3d9bfad1c93e59 create mode 100644 geo-cache/geoassign/objects/5536400f52ea417eb818108eb352fd19 create mode 100644 geo-cache/geoassign/objects/5554ec0bb8f740d3977242c824dd1b40 create mode 100644 geo-cache/geoassign/objects/555a89ab5e8142ed9f514270819a5409 create mode 100644 geo-cache/geoassign/objects/557245ddc68e4f37a50e412c0e6668a7 create mode 100644 geo-cache/geoassign/objects/5578ef7811c949bd8ab602e255982c28 create mode 100644 geo-cache/geoassign/objects/558c690d32ed4e64a7a3ba15d0249eeb create mode 100644 geo-cache/geoassign/objects/5596ca8c3ee140fc971e3af5409fb19d create mode 100644 geo-cache/geoassign/objects/55a05d64e10c483bb1c085ecf284ad42 create mode 100644 geo-cache/geoassign/objects/55accd847baf40df840e1ae8278ae6c4 create mode 100644 geo-cache/geoassign/objects/55af15e7163d40849337ba2bb8521673 create mode 100644 geo-cache/geoassign/objects/55b02fd111d944efa45346476dc2b711 create mode 100644 geo-cache/geoassign/objects/55c97985769c4a9f90e92fea7e83e1a9 create mode 100644 geo-cache/geoassign/objects/55d73939d3a7498aa7541c9e14f85a7b create mode 100644 geo-cache/geoassign/objects/56043f9c24814c8b935942c9f8fa161f create mode 100644 geo-cache/geoassign/objects/5607e0498d6247b5b492f0688493d62d create mode 100644 geo-cache/geoassign/objects/5623a1097ba64009803111477df05ee1 create mode 100644 geo-cache/geoassign/objects/5635fa8fd5af406c91fc68df8d54eff3 create mode 100644 geo-cache/geoassign/objects/5649c60638de4ac9b710942dcbce4837 create mode 100644 geo-cache/geoassign/objects/56623f08fde8485e92be697bf094054c create mode 100644 geo-cache/geoassign/objects/5664f8dcff8b4b08932f4321bebb0b76 create mode 100644 geo-cache/geoassign/objects/566f1bc3130c412394c7d4d3e6ac1a79 create mode 100644 geo-cache/geoassign/objects/567a3df6e4be4339bc0e0c918cce48f0 create mode 100644 geo-cache/geoassign/objects/56ab027afa8e45a3837b16b3d096906d create mode 100644 geo-cache/geoassign/objects/56d2144bf1f64ccfaa6a27bd10cd0a01 create mode 100644 geo-cache/geoassign/objects/56d87280c6204f04953dc8fba9717928 create mode 100644 geo-cache/geoassign/objects/572a9b4626f24773aaf42ae042366aef create mode 100644 geo-cache/geoassign/objects/572c846e7da64ca09f2209e54e484f3d create mode 100644 geo-cache/geoassign/objects/57533d3ece2f47218a2f301829072a0b create mode 100644 geo-cache/geoassign/objects/576948ce76c946518abd9619b7cd0ee4 create mode 100644 geo-cache/geoassign/objects/57913205abb241759ad6c9e6989acabd create mode 100644 geo-cache/geoassign/objects/57b845b1dc1347e8a8a234cf96f49e89 create mode 100644 geo-cache/geoassign/objects/57c31bc6919f4f08883ff12ef8f7f8c5 create mode 100644 geo-cache/geoassign/objects/57fcf7ae48e94160b64eb12345eab576 create mode 100644 geo-cache/geoassign/objects/58043898555e49278f719deaddebbe15 create mode 100644 geo-cache/geoassign/objects/5821ce747f0540c39ce487bf9fbb6022 create mode 100644 geo-cache/geoassign/objects/582dac05b22b48db8c5519603f23e7eb create mode 100644 geo-cache/geoassign/objects/5887762d30c748c2b920cf5ce4af5a17 create mode 100644 geo-cache/geoassign/objects/5892ecdbfc15484b983119a164047a05 create mode 100644 geo-cache/geoassign/objects/589df78fdb564a5a8f32538c82c4f1d6 create mode 100644 geo-cache/geoassign/objects/58aa0448f5e9475a8106fc6182dc7172 create mode 100644 geo-cache/geoassign/objects/58b8871fc0dd48d7b47a0fb14bab1eb3 create mode 100644 geo-cache/geoassign/objects/58dfb146a24741cdbf9d360800cafc50 create mode 100644 geo-cache/geoassign/objects/58e7fcca81bd4130964aca1ea3255f98 create mode 100644 geo-cache/geoassign/objects/590b16d7c18f40d79ea70440c5ef8379 create mode 100644 geo-cache/geoassign/objects/596713d0937b4b798117f09b9824c1a0 create mode 100644 geo-cache/geoassign/objects/596abfef69eb42459bbd56d75bf5c3da create mode 100644 geo-cache/geoassign/objects/596bc55751c646278e6230befc24da44 create mode 100644 geo-cache/geoassign/objects/5980f20bcd854a02ade48f3e07cc9431 create mode 100644 geo-cache/geoassign/objects/599d97fd26c240ec87fddb46bd7d6de8 create mode 100644 geo-cache/geoassign/objects/59ada40882a040c5b5ca23d4bbaadf84 create mode 100644 geo-cache/geoassign/objects/5a20f180bdff4fce918f30088d02ffd0 create mode 100644 geo-cache/geoassign/objects/5a3ee5c97cd44fe9aeeabadff53cb49e create mode 100644 geo-cache/geoassign/objects/5a855a0f9b33458e8fa7972b8c76bccd create mode 100644 geo-cache/geoassign/objects/5aa7967414104cef8f710b26f236c6d0 create mode 100644 geo-cache/geoassign/objects/5ab19fa76b1f4753bf885f50a5804bb6 create mode 100644 geo-cache/geoassign/objects/5ad4a09e0cc44ef9aba41ea9641d9dd5 create mode 100644 geo-cache/geoassign/objects/5b33654e9ca3425ea7e3f7e926ad937a create mode 100644 geo-cache/geoassign/objects/5b48a32d941e4e5295ed8b2dfac315d4 create mode 100644 geo-cache/geoassign/objects/5c0a9c4c110f43a1b29251cf65fde479 create mode 100644 geo-cache/geoassign/objects/5c83f07d75554951b68a72f619a71c1b create mode 100644 geo-cache/geoassign/objects/5c9149de46624ab98e9e9eed4bcd25a6 create mode 100644 geo-cache/geoassign/objects/5caa52467466402fb1a7be48b51f2e7b create mode 100644 geo-cache/geoassign/objects/5cc60ce7bf7a4f9ab8edb4d7c9263273 create mode 100644 geo-cache/geoassign/objects/5ccf178970074d08acf1c394973ce8ff create mode 100644 geo-cache/geoassign/objects/5d67d3a56b6546b086ee6622f2f5fb5f create mode 100644 geo-cache/geoassign/objects/5d6c4a8d2a374b6e981e6c91ef5d2681 create mode 100644 geo-cache/geoassign/objects/5d7d862ce4214f9fb8903a22f07f261d create mode 100644 geo-cache/geoassign/objects/5d8ed5afa8ef4daa8a9f214a0856c354 create mode 100644 geo-cache/geoassign/objects/5df00c71fd284cac8dead24255f16d9d create mode 100644 geo-cache/geoassign/objects/5e04dd669c2a43de97d4040623e64c42 create mode 100644 geo-cache/geoassign/objects/5e1890a240374cbd803b75d0d620a022 create mode 100644 geo-cache/geoassign/objects/5e26a73a6e3947a5adf578e2847cc3fc create mode 100644 geo-cache/geoassign/objects/5e4cffcb05e449af83482f1346c69eab create mode 100644 geo-cache/geoassign/objects/5e681a34ba804129aa999098ce23d9ce create mode 100644 geo-cache/geoassign/objects/5e6de7a2371b4e4abe65e9503b4ad0a9 create mode 100644 geo-cache/geoassign/objects/5e81d1bfd15e4d07bdcad6cb9793fda5 create mode 100644 geo-cache/geoassign/objects/5e841e4c14084b39b0ed2166c48ce96e create mode 100644 geo-cache/geoassign/objects/5e8d48b67d034debb81c5877c6429d9e create mode 100644 geo-cache/geoassign/objects/5ec7fcb960d34398a34adb2301a20791 create mode 100644 geo-cache/geoassign/objects/5efba7dd6de54a3b933d8b8547922c3a create mode 100644 geo-cache/geoassign/objects/5efeccfb87ba42b0bfec62358b2c24c0 create mode 100644 geo-cache/geoassign/objects/5eff999d858e4f409b0c7c945e51f6a7 create mode 100644 geo-cache/geoassign/objects/5f0de3470cbb4c5190daf0e2e1a562fb create mode 100644 geo-cache/geoassign/objects/5f2de1a793074a4cacce96e89e5898b7 create mode 100644 geo-cache/geoassign/objects/5f3b9c5e600942ff9400d447ab666671 create mode 100644 geo-cache/geoassign/objects/5f41ac4185cf47b8824272b6b5be0bd8 create mode 100644 geo-cache/geoassign/objects/5f4204009c1c4613ba06b22b73ff3794 create mode 100644 geo-cache/geoassign/objects/5f42649c8c5841349bfba948f6078b4a create mode 100644 geo-cache/geoassign/objects/5f7017105c844539ab113d20e64897a1 create mode 100644 geo-cache/geoassign/objects/5f7e07ebc0b544c79e7ab63c357b7212 create mode 100644 geo-cache/geoassign/objects/5f869849251d4e31a1617cefdb561416 create mode 100644 geo-cache/geoassign/objects/5f8e65125a3c4b8bb35ccb2aa6899039 create mode 100644 geo-cache/geoassign/objects/5fa4b9b19e3b4f8a9a9c32420c42ff51 create mode 100644 geo-cache/geoassign/objects/5fb9234220ed428988ec234a7e9e532d create mode 100644 geo-cache/geoassign/objects/5fc9827232c4435d8c6e2fefcd294972 create mode 100644 geo-cache/geoassign/objects/5fd83cb95af847aa99b9ecde5b2390dc create mode 100644 geo-cache/geoassign/objects/5fda83d2016c483497c4fea8a5fa7986 create mode 100644 geo-cache/geoassign/objects/5fe62b36d3834f3581f6da5086c2ec1a create mode 100644 geo-cache/geoassign/objects/5fe73079dfd243b4b794a6eed0c813df create mode 100644 geo-cache/geoassign/objects/5ff0b20a62894118bb9d51ac83ac8709 create mode 100644 geo-cache/geoassign/objects/5fff650c5474459c8057c443d590d485 create mode 100644 geo-cache/geoassign/objects/600305d562b64a78909977b14000fd85 create mode 100644 geo-cache/geoassign/objects/6010b18b2e724458bc8c12903071d359 create mode 100644 geo-cache/geoassign/objects/60124789b3174b4a86479a70ffcd9e5d create mode 100644 geo-cache/geoassign/objects/60163c98db684f82bef001a8050d5401 create mode 100644 geo-cache/geoassign/objects/601cff86fd3245e1afc47393fd705ae7 create mode 100644 geo-cache/geoassign/objects/608122b4debd421582d570e7b379256f create mode 100644 geo-cache/geoassign/objects/60a0391ef048454493c47dbc49f94136 create mode 100644 geo-cache/geoassign/objects/60a1ad1e89114ce1b507c17ad060e58d create mode 100644 geo-cache/geoassign/objects/60b5b21da70b48f49b581010125cc5ae create mode 100644 geo-cache/geoassign/objects/60cb89e22d314c3f864e308de2528009 create mode 100644 geo-cache/geoassign/objects/60d31e180dd842fe8fa747d7b56e0791 create mode 100644 geo-cache/geoassign/objects/60e9e91222f841d6b560ff7b65297192 create mode 100644 geo-cache/geoassign/objects/60f43ab965894c4cb1fd75331543095b create mode 100644 geo-cache/geoassign/objects/610503f40fdf47b2a18ff04c73b3b790 create mode 100644 geo-cache/geoassign/objects/61450a85d99745bd9f41afe813a70927 create mode 100644 geo-cache/geoassign/objects/61500c3968db49ab9a17d0270cb7fe09 create mode 100644 geo-cache/geoassign/objects/617e7454c23141d9ba213dc3b6c5e01a create mode 100644 geo-cache/geoassign/objects/618202fcd82944eab9ef08e752b0ca0c create mode 100644 geo-cache/geoassign/objects/619414d8d8ed459d9fc1e933d6d9c181 create mode 100644 geo-cache/geoassign/objects/61e7f7ad916647488d1710e0643552b0 create mode 100644 geo-cache/geoassign/objects/6220458ee44c4275af2d6e72ff0b5ca4 create mode 100644 geo-cache/geoassign/objects/6223bca567af4ab0ab9250f722187d06 create mode 100644 geo-cache/geoassign/objects/622808b83b424248a754676b10991b46 create mode 100644 geo-cache/geoassign/objects/622ef5c22f6a44279069e841f033c144 create mode 100644 geo-cache/geoassign/objects/6244ea7f9131492998c959f1dba0712c create mode 100644 geo-cache/geoassign/objects/625ae8fd635c4d1ea3bc6fd8510671f9 create mode 100644 geo-cache/geoassign/objects/626be4468547406d85f89819da9bfaa7 create mode 100644 geo-cache/geoassign/objects/62783d235c374cd5be77475b4540593b create mode 100644 geo-cache/geoassign/objects/6293b89643f243f39644d118ee827303 create mode 100644 geo-cache/geoassign/objects/62ad4ed186fb40a8bae5c791e322113c create mode 100644 geo-cache/geoassign/objects/62be7b327f844429998e902a53178184 create mode 100644 geo-cache/geoassign/objects/62ee54649a764f9682b6fdb6428de1b4 create mode 100644 geo-cache/geoassign/objects/63032e85da4b420db391148d8914f361 create mode 100644 geo-cache/geoassign/objects/63048b3e62584e6aa212ddf2c754ecdb create mode 100644 geo-cache/geoassign/objects/630f8611546041068960571a0bf91ff2 create mode 100644 geo-cache/geoassign/objects/631481b8a2ac430ba102880f7724912a create mode 100644 geo-cache/geoassign/objects/631af9f4a1e14fa7b7b2f5374c620dfe create mode 100644 geo-cache/geoassign/objects/631b9d84160d4aff90bebe69bef884d0 create mode 100644 geo-cache/geoassign/objects/632ae7b39881473996acc13af1640284 create mode 100644 geo-cache/geoassign/objects/632fe77923e141ea9216bd0a50a92d3c create mode 100644 geo-cache/geoassign/objects/6330a4d299e445b3ab68642753ccafb5 create mode 100644 geo-cache/geoassign/objects/6363d9aa33ac4bf1a9a9fc6f4267783a create mode 100644 geo-cache/geoassign/objects/6379964fb0d24285bbcdfd2980fd3dcf create mode 100644 geo-cache/geoassign/objects/639bbe41c4c14f79a28751a8860674d8 create mode 100644 geo-cache/geoassign/objects/63d24ee2918b4dfe8afb6b249b4d29a4 create mode 100644 geo-cache/geoassign/objects/63eb962e6f054f4dacbe83dd1f6aee44 create mode 100644 geo-cache/geoassign/objects/63f124a8a32b4af6a6ce3b526ac67723 create mode 100644 geo-cache/geoassign/objects/640ff6966ebf46549fb34ca4b320f1d9 create mode 100644 geo-cache/geoassign/objects/641f54697be24b23b19591c8d0099bfd create mode 100644 geo-cache/geoassign/objects/64273193515c4884b8efbe21c8edf65d create mode 100644 geo-cache/geoassign/objects/642bcac9ec6842debbd3f10ee75f9778 create mode 100644 geo-cache/geoassign/objects/646111acf033489a9ab1af70f236a961 create mode 100644 geo-cache/geoassign/objects/646e046fb3344be9a4ef9a418af7c6db create mode 100644 geo-cache/geoassign/objects/647ff86681214300910e7c5da1458a9e create mode 100644 geo-cache/geoassign/objects/648f9023a75e408f98c67e1400494566 create mode 100644 geo-cache/geoassign/objects/64ad3262c8bf4809aa082f94d7abd780 create mode 100644 geo-cache/geoassign/objects/64af686b52d64d23b18a54a96f43a17c create mode 100644 geo-cache/geoassign/objects/64da0522ba2e452b87c39a0ab67fae90 create mode 100644 geo-cache/geoassign/objects/64fbca29611d4ccfbd202df38e5a2626 create mode 100644 geo-cache/geoassign/objects/650625d743134e0ab7403a4b58fdc5a5 create mode 100644 geo-cache/geoassign/objects/650823fc48014b76900d29e580a57c91 create mode 100644 geo-cache/geoassign/objects/6512a347c3be4befa18ebca98ca3e9ed create mode 100644 geo-cache/geoassign/objects/65183bb726bf4d898d7e03787769b1fe create mode 100644 geo-cache/geoassign/objects/6526baa197cd4f7f9772f5de744196e4 create mode 100644 geo-cache/geoassign/objects/652cec49edf94e1b9c55b02bb6627b57 create mode 100644 geo-cache/geoassign/objects/654094679e59454aa581e4385092fdb8 create mode 100644 geo-cache/geoassign/objects/65560d533ee04402b3a5577bc8a3bee7 create mode 100644 geo-cache/geoassign/objects/65585bba9f0545149c4b07c0dcde6ac0 create mode 100644 geo-cache/geoassign/objects/65691cd68dbc4339b8b0a3cbf9fea1de create mode 100644 geo-cache/geoassign/objects/656b308ea1c543f7b2bc420357086535 create mode 100644 geo-cache/geoassign/objects/656cccfb8272463dbfafae76cc57a379 create mode 100644 geo-cache/geoassign/objects/658d2a4064be41e5ad6b10c14546517a create mode 100644 geo-cache/geoassign/objects/65da09b9b9854cd3a91a8862a6de9bab create mode 100644 geo-cache/geoassign/objects/65e2486e3e52463d96a863bec9747ac1 create mode 100644 geo-cache/geoassign/objects/65e8ae7e62534e62a57585cc2e7d3698 create mode 100644 geo-cache/geoassign/objects/65fbe1f6772a44b89b8c3b47c0da6606 create mode 100644 geo-cache/geoassign/objects/65fd46ce1ebf451e82dca106212bb832 create mode 100644 geo-cache/geoassign/objects/65fd79fe0f41454c863473721aa162f9 create mode 100644 geo-cache/geoassign/objects/66019596efc94cb7b3667275c92a01d9 create mode 100644 geo-cache/geoassign/objects/662ebcf2ea6a454187c9f2eee81bb92d create mode 100644 geo-cache/geoassign/objects/663933c7522243e38b7089877e99cc88 create mode 100644 geo-cache/geoassign/objects/663ee6690f8146f0bb1b25c833ef778d create mode 100644 geo-cache/geoassign/objects/664cb08f49d64555a8e65a3ce0ee000b create mode 100644 geo-cache/geoassign/objects/6654cec949074ec0942415c8fb2e0f84 create mode 100644 geo-cache/geoassign/objects/6666c409630c4564b820ad989d59acde create mode 100644 geo-cache/geoassign/objects/669f46adfd1b47ac8370e010007f17fe create mode 100644 geo-cache/geoassign/objects/66c4749e0838413a9356bc6fca88aa36 create mode 100644 geo-cache/geoassign/objects/670abc1a38dd463b94d4f04fd21091dc create mode 100644 geo-cache/geoassign/objects/671f3f3c11b5494a920f949be36c35b9 create mode 100644 geo-cache/geoassign/objects/67395106aa4c4ca0aa8271b6821d5667 create mode 100644 geo-cache/geoassign/objects/675d088f16cb4815afce0afc90735b27 create mode 100644 geo-cache/geoassign/objects/6768694873b3466e98f209d3aa3fc1fa create mode 100644 geo-cache/geoassign/objects/676c6d5c16934ba2a31c5a1479c5016e create mode 100644 geo-cache/geoassign/objects/679cd2e17dd1470192c80f58e9846df4 create mode 100644 geo-cache/geoassign/objects/679f148ae5dd41e09f56a72aa0f6f8e6 create mode 100644 geo-cache/geoassign/objects/67e62319c3704b27b6ae19c37616ab50 create mode 100644 geo-cache/geoassign/objects/67e6b6802cdb44f78c239959683f1a1b create mode 100644 geo-cache/geoassign/objects/67eabf0d622a4dab809eede3af6d7658 create mode 100644 geo-cache/geoassign/objects/680044d79bf646bb8fd4314c26cb32a2 create mode 100644 geo-cache/geoassign/objects/6802047d7adc4dbb9f327dcd5c2bc690 create mode 100644 geo-cache/geoassign/objects/681a2c39559148d39a2f69431c5c3b06 create mode 100644 geo-cache/geoassign/objects/681b4af48a494c1289c6f5368c77e444 create mode 100644 geo-cache/geoassign/objects/682012f7adc34dbca497951690266373 create mode 100644 geo-cache/geoassign/objects/684555f077b74e58a91c58265e5309ec create mode 100644 geo-cache/geoassign/objects/685f970a24524aeaa7b8f0deb0312bb0 create mode 100644 geo-cache/geoassign/objects/688cce1838e842be9c14b40df1efb669 create mode 100644 geo-cache/geoassign/objects/68c10d1123894523b060eb86bc3bace6 create mode 100644 geo-cache/geoassign/objects/68e7e96ece4f4ff7915226a682f399ed create mode 100644 geo-cache/geoassign/objects/692d6606263d4b6182bdbd9e098dfef6 create mode 100644 geo-cache/geoassign/objects/69312a38c22f4a68b3d9dbbf5f4bed87 create mode 100644 geo-cache/geoassign/objects/693c2dcd4b0142e18254849b94d78051 create mode 100644 geo-cache/geoassign/objects/694d6790f9b54985805d00cd87df76db create mode 100644 geo-cache/geoassign/objects/695ae46daae34f70af22fcf50b63843d create mode 100644 geo-cache/geoassign/objects/695bddb8fb3d4a878b0da3ebf73788d7 create mode 100644 geo-cache/geoassign/objects/697c6981ed6a4d11ae2283df732ca904 create mode 100644 geo-cache/geoassign/objects/69933850fdb84ef1a93d4c7974a8ac0f create mode 100644 geo-cache/geoassign/objects/69960d5ccefb4e06b8ea8a3969142778 create mode 100644 geo-cache/geoassign/objects/69b4ca64b7364e93a7f3a8bacc41d245 create mode 100644 geo-cache/geoassign/objects/69b669d31400425aa1b97135959b24bf create mode 100644 geo-cache/geoassign/objects/69bc3ff874ba4717b3bf84022d74c301 create mode 100644 geo-cache/geoassign/objects/69ffe48117d248728436ee4eff34a0c3 create mode 100644 geo-cache/geoassign/objects/6a184ebca2fb4dcaa66540d68220de4b create mode 100644 geo-cache/geoassign/objects/6a2cae22100a4ac898ee957348a5b977 create mode 100644 geo-cache/geoassign/objects/6a718a7237b24579bd2d7558194ad050 create mode 100644 geo-cache/geoassign/objects/6ab418128c494e78bd6bf9fb942fb9b9 create mode 100644 geo-cache/geoassign/objects/6ab60904dbc043d085e174bc36a5ed67 create mode 100644 geo-cache/geoassign/objects/6abfcdf52b5a4e37a2d6fef85d834732 create mode 100644 geo-cache/geoassign/objects/6aea7f814fe2474bb558801e4711211c create mode 100644 geo-cache/geoassign/objects/6af7b8571d7b429db892cb08a1f71453 create mode 100644 geo-cache/geoassign/objects/6b06bd8e7dcc4105bc426fc74cd10cd5 create mode 100644 geo-cache/geoassign/objects/6b146293d84b42a99547eefb2c470fdb create mode 100644 geo-cache/geoassign/objects/6b27b437107941ac85dc2bb59345d1f7 create mode 100644 geo-cache/geoassign/objects/6b39e1f0890a4375807f69b0e51256a0 create mode 100644 geo-cache/geoassign/objects/6b903de0fea3421eab6357c80449f5db create mode 100644 geo-cache/geoassign/objects/6b925d523e5441ffba1e30ce3d0c72d6 create mode 100644 geo-cache/geoassign/objects/6b932826f5294c65956a594e677e8228 create mode 100644 geo-cache/geoassign/objects/6b9d1f2a372348f488b7c6b6286989b2 create mode 100644 geo-cache/geoassign/objects/6ba8c45c1e8b4433a0a7ae9e1311f1d9 create mode 100644 geo-cache/geoassign/objects/6ba97782160f454baa3bc726a0dc5a97 create mode 100644 geo-cache/geoassign/objects/6bbbe8c913634841a32b8cf5ba0ca09c create mode 100644 geo-cache/geoassign/objects/6bd2f75697b04573abdacd1c0171c209 create mode 100644 geo-cache/geoassign/objects/6bd9e4c9b2d747e3852ae4966c3a611f create mode 100644 geo-cache/geoassign/objects/6beb31f97de349a3a8882c7457775567 create mode 100644 geo-cache/geoassign/objects/6beed339542c48f595c7d66e2b188bbe create mode 100644 geo-cache/geoassign/objects/6c049b94f84e45a696f89f645a36b80f create mode 100644 geo-cache/geoassign/objects/6c06fbd35ab94a2dad1dad4297616b3f create mode 100644 geo-cache/geoassign/objects/6c6f10468da940dc93bf6b556154e163 create mode 100644 geo-cache/geoassign/objects/6c86e6a1f5b643379ba6c59591029fc7 create mode 100644 geo-cache/geoassign/objects/6c9b73243e614adc9e7b260a5cad13be create mode 100644 geo-cache/geoassign/objects/6cb956f237fa405d8c9a22062d0f208f create mode 100644 geo-cache/geoassign/objects/6cbf51ce6fa04310b040dc869d1c5ab2 create mode 100644 geo-cache/geoassign/objects/6cd168ed2b6b49d29ae45d1147d825f8 create mode 100644 geo-cache/geoassign/objects/6cd3abf79bff4ce1884862a8b8d10132 create mode 100644 geo-cache/geoassign/objects/6d0ccf9def554e87b14c47b6aa1a2460 create mode 100644 geo-cache/geoassign/objects/6d0e4191d2c043dba43a24caf7a08e21 create mode 100644 geo-cache/geoassign/objects/6d285074d14743d8a8078f63c05924fe create mode 100644 geo-cache/geoassign/objects/6d5f5a3944ed4ea6a0c05c5a516d0fa4 create mode 100644 geo-cache/geoassign/objects/6d7b2d4a154a407fa9873eb865c1bd71 create mode 100644 geo-cache/geoassign/objects/6d7fd78c83ad42bfb32a2dd4ba5fb7be create mode 100644 geo-cache/geoassign/objects/6d9c74c9535c4973bee0cc25a87313e1 create mode 100644 geo-cache/geoassign/objects/6dbbaed25c5b4f9db0c250c6fcaf802d create mode 100644 geo-cache/geoassign/objects/6dcbfce8fc1241088ab913fae8d07093 create mode 100644 geo-cache/geoassign/objects/6ddd139d3bec411797356ef741fdcb62 create mode 100644 geo-cache/geoassign/objects/6de5517a3860490391522853c1e501c9 create mode 100644 geo-cache/geoassign/objects/6df590ab51c348d79303c42eed25903f create mode 100644 geo-cache/geoassign/objects/6dfea77b7849430593ea7fa68c7bb47b create mode 100644 geo-cache/geoassign/objects/6e0bc80405d245e18ae4c0aaa30f0268 create mode 100644 geo-cache/geoassign/objects/6e0e18fd234c42e2906bda3ee2551bdd create mode 100644 geo-cache/geoassign/objects/6e2669da701c4cdaac2535abf10ced58 create mode 100644 geo-cache/geoassign/objects/6e4892d976d148d7a6e1b4ae32d81f95 create mode 100644 geo-cache/geoassign/objects/6e4d358800b346b8b6fe572ae9ff1e86 create mode 100644 geo-cache/geoassign/objects/6e572fcc67f54f61a1ffb1431e77384b create mode 100644 geo-cache/geoassign/objects/6e68b85735de4df9a28eb098b54b9161 create mode 100644 geo-cache/geoassign/objects/6ea835e0f0cc4d2a908fb198137ff6a8 create mode 100644 geo-cache/geoassign/objects/6eb2895772224e88b6621ad2d0a0ec16 create mode 100644 geo-cache/geoassign/objects/6ee862eb49944eb3a93d859e3ab082d5 create mode 100644 geo-cache/geoassign/objects/6effe3b0d53b442cafd038e699d4d823 create mode 100644 geo-cache/geoassign/objects/6f123f920f1447809ec852307eff86a8 create mode 100644 geo-cache/geoassign/objects/6f128f95ce8e4a99b394b139483299fc create mode 100644 geo-cache/geoassign/objects/6f33a79c9b38409cba4218743051cac4 create mode 100644 geo-cache/geoassign/objects/6f4055f8127a4c88bed3f7dba4a2cb32 create mode 100644 geo-cache/geoassign/objects/6f469d57b6ee4fdb92e7ea1f460c9df7 create mode 100644 geo-cache/geoassign/objects/6f4f521ec6ec4eecb1c7fa6ecc3eed37 create mode 100644 geo-cache/geoassign/objects/6f710f17872948bfb451288b96243142 create mode 100644 geo-cache/geoassign/objects/6f99a31bae344cf0904c5f2c393c31f0 create mode 100644 geo-cache/geoassign/objects/6fb381ab22434d599f443c09959ad452 create mode 100644 geo-cache/geoassign/objects/6fde1cba9325463ba9df9074b1e130da create mode 100644 geo-cache/geoassign/objects/6ff30e8d88bd487a90d22b15df591142 create mode 100644 geo-cache/geoassign/objects/70320995d7af4e21adad10c73be0c5d1 create mode 100644 geo-cache/geoassign/objects/707ea28f53984125871a21b9cea93406 create mode 100644 geo-cache/geoassign/objects/70959c32c004436eb1510e04540b4213 create mode 100644 geo-cache/geoassign/objects/70b5eff0ac914114b9d94e4739103e62 create mode 100644 geo-cache/geoassign/objects/70d121065f284c648c2657571161dfcc create mode 100644 geo-cache/geoassign/objects/70fa2b8a360240a083008a89c26e4d32 create mode 100644 geo-cache/geoassign/objects/7104a6d8a42a4b6aa765c2e7e0c090b7 create mode 100644 geo-cache/geoassign/objects/710b3c7a41aa49198a117b679d70348b create mode 100644 geo-cache/geoassign/objects/710dbff7027d434aa8991e6420dc3bab create mode 100644 geo-cache/geoassign/objects/7117d41281ef4b3c915400a9512f98eb create mode 100644 geo-cache/geoassign/objects/7126a339af904cef976014c35a03a37e create mode 100644 geo-cache/geoassign/objects/712d1b68df024dca9237c70ecb967e76 create mode 100644 geo-cache/geoassign/objects/7142bf2fc4c24416b49f3e3ebaa6f769 create mode 100644 geo-cache/geoassign/objects/7146d8588bb9414fac5afd0c990d3d74 create mode 100644 geo-cache/geoassign/objects/714d76f3a45a4b3fb8ee983db9091c86 create mode 100644 geo-cache/geoassign/objects/715a5fb977754e44b21b23c9cf1d5f05 create mode 100644 geo-cache/geoassign/objects/71692739831346d7ac8bf6fd3b3cac19 create mode 100644 geo-cache/geoassign/objects/717cf2dc64fb478aaaf4883c998e8142 create mode 100644 geo-cache/geoassign/objects/718928cfce814f9a8eb02ce7fdd5683a create mode 100644 geo-cache/geoassign/objects/71d1b8589b5d472ba2ac1f2403ce8aae create mode 100644 geo-cache/geoassign/objects/71ece8f641de474b963b8cc1d2f1c226 create mode 100644 geo-cache/geoassign/objects/71ffd3a54b454b8e9a97c51bf1c319e1 create mode 100644 geo-cache/geoassign/objects/7226b9e9e3d14b118352ffc68b2ab947 create mode 100644 geo-cache/geoassign/objects/7257f5087910405a9a2270536062287e create mode 100644 geo-cache/geoassign/objects/726574e995894a5abe3cc706dea02da8 create mode 100644 geo-cache/geoassign/objects/72750707a9f54ca48d890f217e04dfcc create mode 100644 geo-cache/geoassign/objects/72909afc7fb34b0eba9496aaf9b3d5d0 create mode 100644 geo-cache/geoassign/objects/729d3e6b6960473995a5b6fe7730eebe create mode 100644 geo-cache/geoassign/objects/729d801acba34db69e8ab7a80bea19f3 create mode 100644 geo-cache/geoassign/objects/72acf3d2259242ac9231990738cb300d create mode 100644 geo-cache/geoassign/objects/72b142124db74b53a772c8d4de2fe431 create mode 100644 geo-cache/geoassign/objects/72b49d83c8634751bb672a938e8300f9 create mode 100644 geo-cache/geoassign/objects/72c0750911ab4b5293b4d58aa8fecf24 create mode 100644 geo-cache/geoassign/objects/72d38bd49434410ca42175abde0a8e4e create mode 100644 geo-cache/geoassign/objects/730190bda64949389b1c3b237151cc5f create mode 100644 geo-cache/geoassign/objects/7345c5d2a90b40919011c43c6692cb92 create mode 100644 geo-cache/geoassign/objects/73583f0562634158b62201c1aafceec9 create mode 100644 geo-cache/geoassign/objects/736a294f2a3240f9bc8d7412d64f4009 create mode 100644 geo-cache/geoassign/objects/736c30bb94e948f7a457772199c044b9 create mode 100644 geo-cache/geoassign/objects/736fc2be457840b9adcaac5326eeb6a7 create mode 100644 geo-cache/geoassign/objects/73a88a8bc944428a854e5520acbba245 create mode 100644 geo-cache/geoassign/objects/73aad37a7a7a40f59fb86017d84e8383 create mode 100644 geo-cache/geoassign/objects/73b7ed209be842c5999a38263fe8b6d2 create mode 100644 geo-cache/geoassign/objects/7403af72d9994e88a472e3d4749fee88 create mode 100644 geo-cache/geoassign/objects/74052bff968541d2b70a27296a8f690b create mode 100644 geo-cache/geoassign/objects/740fae541b3f45fbac65194e7815fcfe create mode 100644 geo-cache/geoassign/objects/745c06d8b2ac44afa3aecacd3648cf31 create mode 100644 geo-cache/geoassign/objects/7465da87e4f840638907efab562c3cf4 create mode 100644 geo-cache/geoassign/objects/74a7bef6e1e4400a809a4034e9c40a0f create mode 100644 geo-cache/geoassign/objects/74c6abd5d43d483d8a4a595a6d650b29 create mode 100644 geo-cache/geoassign/objects/74d5d751b455441eb05dce938f5c842d create mode 100644 geo-cache/geoassign/objects/74e3a09c6b6f4026be823be2f7d57b02 create mode 100644 geo-cache/geoassign/objects/74eb9ff5d0994e3c894f3f885261ffe6 create mode 100644 geo-cache/geoassign/objects/750a48c361944c1e9441a8da98a39469 create mode 100644 geo-cache/geoassign/objects/752e22d353964da5b536c65188a08a56 create mode 100644 geo-cache/geoassign/objects/7532d78ab9724dfa8ec756d2fcda9b7f create mode 100644 geo-cache/geoassign/objects/75358b261ac043ef81f1e8e1722579db create mode 100644 geo-cache/geoassign/objects/753d5d43602445d68df9cba63d5c1de2 create mode 100644 geo-cache/geoassign/objects/75696cf1d06f4d838bc56ca2068250d5 create mode 100644 geo-cache/geoassign/objects/7570f447bf034d6783f01c59976bf9ed create mode 100644 geo-cache/geoassign/objects/75798b43d3884624baafa4ab043abb21 create mode 100644 geo-cache/geoassign/objects/758259820cad439ab86ecbd7b471e654 create mode 100644 geo-cache/geoassign/objects/758279ae88b247b790ea1beb79ff061f create mode 100644 geo-cache/geoassign/objects/75979197c8fe41b4866e60f9dc060589 create mode 100644 geo-cache/geoassign/objects/75a3328653e84555bcdb852f66a1e212 create mode 100644 geo-cache/geoassign/objects/75b51cc232f74448b05be6cfb2b6ca0d create mode 100644 geo-cache/geoassign/objects/75c161a16dd64e4194a91a8a25dd11d6 create mode 100644 geo-cache/geoassign/objects/75ccc50d1e5f4144b0153432022121d2 create mode 100644 geo-cache/geoassign/objects/75e6fe4b2a3b4d2a90922f2a0e1a2840 create mode 100644 geo-cache/geoassign/objects/75e93121764f45ed8dcc8387681c3041 create mode 100644 geo-cache/geoassign/objects/760b53107c9e459e813c644f3dcb6196 create mode 100644 geo-cache/geoassign/objects/76220d1c44ba417d8e7fa73d3db267e7 create mode 100644 geo-cache/geoassign/objects/76867beade174c0aab4be5db7eaf39de create mode 100644 geo-cache/geoassign/objects/76976fdcc8594a5db25b0c3c8e2656a9 create mode 100644 geo-cache/geoassign/objects/76adcd6ec6d143628afbe57459a83f2a create mode 100644 geo-cache/geoassign/objects/76b0153c3baf4799a37144d707f60ec5 create mode 100644 geo-cache/geoassign/objects/76b6ef399b4447a3b109fed68762ef8b create mode 100644 geo-cache/geoassign/objects/76d0fdb8a7ae44f88dcb4eace3e2442a create mode 100644 geo-cache/geoassign/objects/76f41121b3094228b0f787a8f6c28a86 create mode 100644 geo-cache/geoassign/objects/7790801d2d20435fbb2331c1eb2d268b create mode 100644 geo-cache/geoassign/objects/77d2820abdc447cdb3b5628cd83b5499 create mode 100644 geo-cache/geoassign/objects/7821c71af29649adba3b051875bb1b78 create mode 100644 geo-cache/geoassign/objects/782bf1258de848ca9a4d8605c37680bd create mode 100644 geo-cache/geoassign/objects/782fd09376f6460cad7e24c9ea163826 create mode 100644 geo-cache/geoassign/objects/783419db53764c53a59e08cb70e12e17 create mode 100644 geo-cache/geoassign/objects/784c65085e2c406a8e3c821f1161e5a1 create mode 100644 geo-cache/geoassign/objects/7857bb034176433286cbd4a362ed3a55 create mode 100644 geo-cache/geoassign/objects/786c9150092a4a41b08c99effa0a400b create mode 100644 geo-cache/geoassign/objects/78981033428b41b880a7d0f7ae6ffc33 create mode 100644 geo-cache/geoassign/objects/78ae4f7138ea4f63ab799dec39a64753 create mode 100644 geo-cache/geoassign/objects/78b25e7e3b92464c85dfd8635ff4e066 create mode 100644 geo-cache/geoassign/objects/78bcc9e313054914854c957b15a817d7 create mode 100644 geo-cache/geoassign/objects/78cbd65e1c48472b9ad72ea1826be4ca create mode 100644 geo-cache/geoassign/objects/78cd9ad5c3e3422e92600f9a470b8f07 create mode 100644 geo-cache/geoassign/objects/78d32b6cb7ac419eb0739639545e935d create mode 100644 geo-cache/geoassign/objects/78f624eaf6a147a1abc8d931c663c49b create mode 100644 geo-cache/geoassign/objects/790b6c2c844547bfa216934d65f77136 create mode 100644 geo-cache/geoassign/objects/79156436b9e946438a66a2623a17010c create mode 100644 geo-cache/geoassign/objects/7917464b2fdf454bb9610c963d86d2b9 create mode 100644 geo-cache/geoassign/objects/791c08042927413abebc75afd39effd9 create mode 100644 geo-cache/geoassign/objects/792bb059481e485ab0a5e15203efed02 create mode 100644 geo-cache/geoassign/objects/797683898d6a46f78cb3908d900a203e create mode 100644 geo-cache/geoassign/objects/797bb4abc8d441b9b46262af0a7bcd8f create mode 100644 geo-cache/geoassign/objects/79a4a7cec614470fb2f6e24281ee9c41 create mode 100644 geo-cache/geoassign/objects/79c45a2e9cc84b3a83d080fa67b66df6 create mode 100644 geo-cache/geoassign/objects/79ccbe7c506e4c4e8f8f129511178efc create mode 100644 geo-cache/geoassign/objects/79cd19650d7142d4b19551a98842b6f2 create mode 100644 geo-cache/geoassign/objects/7a1445b2df994ce59b9e7a1802d9d338 create mode 100644 geo-cache/geoassign/objects/7a1b7f64ab1a476a987ff76e051504b5 create mode 100644 geo-cache/geoassign/objects/7a3a54f7515e4934aa2edaafb97dda3e create mode 100644 geo-cache/geoassign/objects/7a57574a4e444ee08461ce9c3d2553d4 create mode 100644 geo-cache/geoassign/objects/7a959aa46e1f4a06b54ab10f5e4dd531 create mode 100644 geo-cache/geoassign/objects/7ab4625889ff4982a2dc4ac7041fc707 create mode 100644 geo-cache/geoassign/objects/7b16048e6d7640c1bb17c56187f02d08 create mode 100644 geo-cache/geoassign/objects/7b18129b97f1458d8c5b2e761d7436ac create mode 100644 geo-cache/geoassign/objects/7b309bca61b249e0a9f7c131cfc09203 create mode 100644 geo-cache/geoassign/objects/7b6317afa63e41d9932bbb7f3f1933d3 create mode 100644 geo-cache/geoassign/objects/7b8c18f7d88347a6920f0ddf16ee9280 create mode 100644 geo-cache/geoassign/objects/7b8fcdf580614e7cbb6a7d3136d7cff9 create mode 100644 geo-cache/geoassign/objects/7ba8ad9d238e46c6b3be6370901004f3 create mode 100644 geo-cache/geoassign/objects/7bb3af59cf3f430984dca8f0c9be0310 create mode 100644 geo-cache/geoassign/objects/7bcbcd88d4ab467d98082f80d1289e7d create mode 100644 geo-cache/geoassign/objects/7c028fb4e65d4151a6f8f661ec017990 create mode 100644 geo-cache/geoassign/objects/7c256e1f11d6493781b2f373055df4a8 create mode 100644 geo-cache/geoassign/objects/7c36ddd5607148c5a8aa2ae8b9a431cc create mode 100644 geo-cache/geoassign/objects/7c855466a7e34be9b518903045c216b1 create mode 100644 geo-cache/geoassign/objects/7ca11c4a069a45339341ad160dc784ba create mode 100644 geo-cache/geoassign/objects/7cb80d0129f54b568c1e8bca2fbef61f create mode 100644 geo-cache/geoassign/objects/7cdb66b5a6194b9195c1de0f3bb09c2d create mode 100644 geo-cache/geoassign/objects/7ce6e1abb39449339d93354c8e2f1563 create mode 100644 geo-cache/geoassign/objects/7cf0168d66f54a63a12a1b889c615a52 create mode 100644 geo-cache/geoassign/objects/7d03662682394d20ae646db09bbf4c23 create mode 100644 geo-cache/geoassign/objects/7d1a023c5c934ef694b255ffd8e65595 create mode 100644 geo-cache/geoassign/objects/7d2ec399c82041a4b1a2c2e5dad2a5f8 create mode 100644 geo-cache/geoassign/objects/7d4b37a308374a02a3ad10e8f7c0813f create mode 100644 geo-cache/geoassign/objects/7d5796169ee34329963e8a78b1922714 create mode 100644 geo-cache/geoassign/objects/7daa1c7a709844978ec7978554352e84 create mode 100644 geo-cache/geoassign/objects/7db5f14a7cb94e6c9f5d855752629cab create mode 100644 geo-cache/geoassign/objects/7dd2cd67d8e8475ab4b2e949715509fe create mode 100644 geo-cache/geoassign/objects/7de2526b23034b6e8635db8bd600bd1f create mode 100644 geo-cache/geoassign/objects/7de32e15a4444ba48d70ebb3f823d90e create mode 100644 geo-cache/geoassign/objects/7e0b2b04f14743c89bd998e86b7cd4ee create mode 100644 geo-cache/geoassign/objects/7e3009ab8d3147578a699ab449f2ed79 create mode 100644 geo-cache/geoassign/objects/7e308de0d96d4fb58ebbd3e33b2af4bb create mode 100644 geo-cache/geoassign/objects/7e488f0358d444248c8f8678a3bb0aea create mode 100644 geo-cache/geoassign/objects/7e5289f2ad1b4491827594201584a94f create mode 100644 geo-cache/geoassign/objects/7e7302cc35394a2b98f2f8261e144f3a create mode 100644 geo-cache/geoassign/objects/7e827d0a7d514ff6861282a005b3df88 create mode 100644 geo-cache/geoassign/objects/7ec7c67fe74d4e4dba20d77e61f8ff03 create mode 100644 geo-cache/geoassign/objects/7ed04be99570489d830aa6617ede0948 create mode 100644 geo-cache/geoassign/objects/7eeb7513915b46b9bf3355adef5b89b9 create mode 100644 geo-cache/geoassign/objects/7f00870c44f449ae9278ffb25abde73f create mode 100644 geo-cache/geoassign/objects/7f016e21c0484b61ba7ce056bdc3f033 create mode 100644 geo-cache/geoassign/objects/7f2711e6da1e43f59d6581e56098978b create mode 100644 geo-cache/geoassign/objects/7f3f0acd8f5f4b539eebc07bb1ed692e create mode 100644 geo-cache/geoassign/objects/7f46251c5d254dd3a3a2caff3aa8d881 create mode 100644 geo-cache/geoassign/objects/7f47088b914f429f81db5d84535c6f2b create mode 100644 geo-cache/geoassign/objects/7f53cde7b99742deaa3d64cf8f7d4a91 create mode 100644 geo-cache/geoassign/objects/7f66235571ad44578e3b0d6186fe07f4 create mode 100644 geo-cache/geoassign/objects/7f7c07f8bbad4352b4874bb6577a1a9c create mode 100644 geo-cache/geoassign/objects/7f91d9b2123a4c028c41a3c170ca5678 create mode 100644 geo-cache/geoassign/objects/7f96e8a544994af0b366208c1564e269 create mode 100644 geo-cache/geoassign/objects/7fc12994c57546d8b110ed0b68c72671 create mode 100644 geo-cache/geoassign/objects/7fd7772dffae4130b9b87633bf7134a0 create mode 100644 geo-cache/geoassign/objects/7fe347046711409482e30cd9d126d232 create mode 100644 geo-cache/geoassign/objects/7ffea282f51a4258a55236636cb1831d create mode 100644 geo-cache/geoassign/objects/800107572e9640388cf6a38fc1fd5e7e create mode 100644 geo-cache/geoassign/objects/800a3c412fb74f10a876673e9db26d34 create mode 100644 geo-cache/geoassign/objects/80131fba47514d048f8eccf2635246c6 create mode 100644 geo-cache/geoassign/objects/803fd410cffe40f5b2d2385551d55f57 create mode 100644 geo-cache/geoassign/objects/8067f34679344626b49ee8cf35c3dd59 create mode 100644 geo-cache/geoassign/objects/80773e7bf4214d7ebec5a18a7e4773e0 create mode 100644 geo-cache/geoassign/objects/80b1759b43ad4a23ac3d74d68693d8dd create mode 100644 geo-cache/geoassign/objects/80e87efe10fb42c597771db38a46a1f0 create mode 100644 geo-cache/geoassign/objects/8120da9999f14a609ac238aa8b99aed9 create mode 100644 geo-cache/geoassign/objects/81387226c3494553a6b4a2b388045923 create mode 100644 geo-cache/geoassign/objects/813c5f1be4944db49bc470d92257f7d4 create mode 100644 geo-cache/geoassign/objects/814a743b3298454eac360e23edb44644 create mode 100644 geo-cache/geoassign/objects/814b0ec21ec04452957c787aab98526f create mode 100644 geo-cache/geoassign/objects/814ee98e76a54c3890b86d4b5de08e87 create mode 100644 geo-cache/geoassign/objects/8160f2ffdd5145b39e818bc5bd3248ae create mode 100644 geo-cache/geoassign/objects/819426878d10463dbf0962e1d853c143 create mode 100644 geo-cache/geoassign/objects/81ac6909b4784a4c8876eed50d9a8345 create mode 100644 geo-cache/geoassign/objects/820e58b92cff4509a9cf6ae0486a5d7f create mode 100644 geo-cache/geoassign/objects/8214503ae11542d18cd6268f76c9be35 create mode 100644 geo-cache/geoassign/objects/8217c1a0385a41089023a1fcdb5b4fcb create mode 100644 geo-cache/geoassign/objects/8218ac879591436aabc679d0391182a4 create mode 100644 geo-cache/geoassign/objects/821a93b501b94c28b42ae091b1128cba create mode 100644 geo-cache/geoassign/objects/8246e44a9a9845959aad7d1d1b7c7673 create mode 100644 geo-cache/geoassign/objects/827d1aab2cb34cc4af6573e111968471 create mode 100644 geo-cache/geoassign/objects/8293be1f8723438db8e7268bf0171522 create mode 100644 geo-cache/geoassign/objects/8293d99fc9684e05bed5f548d2aba77b create mode 100644 geo-cache/geoassign/objects/82b7faf9c34b4faca781490570648262 create mode 100644 geo-cache/geoassign/objects/82c392c88c3148e1acdb7401494d7cb9 create mode 100644 geo-cache/geoassign/objects/82c394e6ba8a407cbd0592850ec7cb61 create mode 100644 geo-cache/geoassign/objects/82e17aea2d4c43de9dea62d103ca770d create mode 100644 geo-cache/geoassign/objects/82ff833f79994516b65c310df2a9deda create mode 100644 geo-cache/geoassign/objects/83043963512845e381b2ecf7ad1b7c4d create mode 100644 geo-cache/geoassign/objects/83119ec686e04272a3e9cc96207ae479 create mode 100644 geo-cache/geoassign/objects/831a437fe5454e9a9acfe053407d7f7c create mode 100644 geo-cache/geoassign/objects/8327ffc099bb418d8dc457bf336078ab create mode 100644 geo-cache/geoassign/objects/8338ee0b302c4f96be4918ef757cf23e create mode 100644 geo-cache/geoassign/objects/834e903cf3a243999781274a792e7f53 create mode 100644 geo-cache/geoassign/objects/8370194a042146bfa768540afe8d166f create mode 100644 geo-cache/geoassign/objects/8376175c21aa4dab923854799d9b5f8b create mode 100644 geo-cache/geoassign/objects/83763a52d327496ebf74be309f419d78 create mode 100644 geo-cache/geoassign/objects/8379c96ccc21471aaa8e09a7c01e77d7 create mode 100644 geo-cache/geoassign/objects/83815a231d5947ee99d46b5ce11aa178 create mode 100644 geo-cache/geoassign/objects/8387ae2e3cd14b0fa2ce8f1768d48d8b create mode 100644 geo-cache/geoassign/objects/838a8de17a15491f9fa1fe6630cbd011 create mode 100644 geo-cache/geoassign/objects/8399e7e4c8b04a2a897f3ca186f18858 create mode 100644 geo-cache/geoassign/objects/839e20c1be794b3cbc3bb099b2c97c2d create mode 100644 geo-cache/geoassign/objects/83c3b6cdb5cc40efbc519f1c646dc547 create mode 100644 geo-cache/geoassign/objects/83c973c5d4b04f00969e20f029c5ec00 create mode 100644 geo-cache/geoassign/objects/83e90f1ae918451cb99165571d05691a create mode 100644 geo-cache/geoassign/objects/8409cf85a58c4f93b273525e23e211b3 create mode 100644 geo-cache/geoassign/objects/8410f95d9cad47f3acd5fef632d1b666 create mode 100644 geo-cache/geoassign/objects/84355a64b10d455c9a5a6c7f9c236fe1 create mode 100644 geo-cache/geoassign/objects/8437607f8fa14397b438b0277ddb1c11 create mode 100644 geo-cache/geoassign/objects/84395643e7ba475d93e36916cdb6f35b create mode 100644 geo-cache/geoassign/objects/84509e83a1b94335b24cbd6e4e3ae19d create mode 100644 geo-cache/geoassign/objects/847d052b56f342b8918e91edca003cad create mode 100644 geo-cache/geoassign/objects/8496747900cb4eb5a21dec29c75290f6 create mode 100644 geo-cache/geoassign/objects/84ff4d09fe1047e59a3d1704e118facb create mode 100644 geo-cache/geoassign/objects/8508ada520774e22ad884f00e2850cf8 create mode 100644 geo-cache/geoassign/objects/850b75ad10d54677a03563c597bcb6c0 create mode 100644 geo-cache/geoassign/objects/8529a77e303147b4be15f7c15543a754 create mode 100644 geo-cache/geoassign/objects/852b22277cc54d5d820f5dd8bfd1e302 create mode 100644 geo-cache/geoassign/objects/8531e0f7df1245c19209b923e16ed56e create mode 100644 geo-cache/geoassign/objects/854a1060e31c40c8ab5e9a17247f891c create mode 100644 geo-cache/geoassign/objects/85579455dcc7430f92d374bce5a77ca9 create mode 100644 geo-cache/geoassign/objects/85a71336958d45fcb70485608b67221f create mode 100644 geo-cache/geoassign/objects/85b3d42ab95d493eac824ddb6a42b3fc create mode 100644 geo-cache/geoassign/objects/85c54bcb83b44aef9d5747fe44473a43 create mode 100644 geo-cache/geoassign/objects/85e8f45063d34468888bfcad2b0d9127 create mode 100644 geo-cache/geoassign/objects/85e96065717341ef8bfb24b0f75dc5f7 create mode 100644 geo-cache/geoassign/objects/8604a6edd48b4ea4bb99cf6ee4b337b5 create mode 100644 geo-cache/geoassign/objects/861a16dd2ead4c5d87414c71c3817f88 create mode 100644 geo-cache/geoassign/objects/86570a773cec4230bee456c02555263b create mode 100644 geo-cache/geoassign/objects/8672a0ce18374733ac221dab44dce721 create mode 100644 geo-cache/geoassign/objects/8685af79713448f3977caeef1bb7f5cf create mode 100644 geo-cache/geoassign/objects/86887528379c48ccbbfcc03f9fcdaed2 create mode 100644 geo-cache/geoassign/objects/8688bb77c87d48ae847bc1dafa8ff729 create mode 100644 geo-cache/geoassign/objects/8693d876cb5e47b4b3bc2ac6681997ae create mode 100644 geo-cache/geoassign/objects/86a42b116f6047318307d31574fd0f37 create mode 100644 geo-cache/geoassign/objects/86a64a1885154004b6f915fbef1de2e8 create mode 100644 geo-cache/geoassign/objects/86c68c23b66e4284a5c9ecdfb857d713 create mode 100644 geo-cache/geoassign/objects/86cc0b7dc9c1464fae294a784b7f6a53 create mode 100644 geo-cache/geoassign/objects/86f7008b55f546afb8da63e0ea5b73c4 create mode 100644 geo-cache/geoassign/objects/86f836f4479a49879496168556ae2707 create mode 100644 geo-cache/geoassign/objects/87058553ece14233a62142a304f15d87 create mode 100644 geo-cache/geoassign/objects/872ecace8eb547b488b8949e8d933ead create mode 100644 geo-cache/geoassign/objects/87431f1c030545deb558cc087d1695f1 create mode 100644 geo-cache/geoassign/objects/874ffdeed88d47a2aebf445c6ad81591 create mode 100644 geo-cache/geoassign/objects/875e1f175aff410297c4388a9e347326 create mode 100644 geo-cache/geoassign/objects/8762d46c788f493a9c52966224087279 create mode 100644 geo-cache/geoassign/objects/8776166549804f2f83d12263237373c4 create mode 100644 geo-cache/geoassign/objects/87882dbe70ec4ae18af88a1c5e40a57c create mode 100644 geo-cache/geoassign/objects/878ad31004784b0da6eb7fb9d11430b9 create mode 100644 geo-cache/geoassign/objects/879cd97b4ba849dea26035fad57a7703 create mode 100644 geo-cache/geoassign/objects/87c386705e004a21b4f3122d1a709cbe create mode 100644 geo-cache/geoassign/objects/87f97cdb8e5b456e846a690576122407 create mode 100644 geo-cache/geoassign/objects/884ac99a372a49498352dfe6e4057eab create mode 100644 geo-cache/geoassign/objects/88910d44a5d34295be953c3c7efb2586 create mode 100644 geo-cache/geoassign/objects/88affc1f19f04f2caddacb1120cfce81 create mode 100644 geo-cache/geoassign/objects/88c0b65641364b1589dbaa504967fda6 create mode 100644 geo-cache/geoassign/objects/88c0f0fee64f4b86bacec8c6f6868398 create mode 100644 geo-cache/geoassign/objects/88d3b46acc884858a376eb3e22b3995f create mode 100644 geo-cache/geoassign/objects/88e658ff4e2946398be51495fbc7ebea create mode 100644 geo-cache/geoassign/objects/88ef2f3908264c1abee2cba3d3c74e20 create mode 100644 geo-cache/geoassign/objects/88f25886d3fa42dba0307898227a28ca create mode 100644 geo-cache/geoassign/objects/88ffaaf417b54fc8b44dc90cbca39754 create mode 100644 geo-cache/geoassign/objects/8908ff956244483f9b5b13cea2a9a8cc create mode 100644 geo-cache/geoassign/objects/890b3d6ed5854ab68202c619fbee306b create mode 100644 geo-cache/geoassign/objects/8920f7581cef44c184e09adcb973e511 create mode 100644 geo-cache/geoassign/objects/8925b7e7f8264c3ca5b5f558b8f98a79 create mode 100644 geo-cache/geoassign/objects/89a4d2ac057e489caec4590f3ba548f3 create mode 100644 geo-cache/geoassign/objects/89d849d864c740ada54b45a4f05847c6 create mode 100644 geo-cache/geoassign/objects/89e2eed16ef54db2a35b28f01a720396 create mode 100644 geo-cache/geoassign/objects/8a013b4fe12d46d8a4a824d26411fe59 create mode 100644 geo-cache/geoassign/objects/8a1ca4ae12e54e9bb48ac2a8f4281943 create mode 100644 geo-cache/geoassign/objects/8a24e8d8f7244307896e0883770ef433 create mode 100644 geo-cache/geoassign/objects/8a281f64a9e443e590479e5b4769b6b1 create mode 100644 geo-cache/geoassign/objects/8a2d1a2d0b8147b283ee5d05837bd217 create mode 100644 geo-cache/geoassign/objects/8a63d2ee687347f08cc1926c94d5a9c8 create mode 100644 geo-cache/geoassign/objects/8a6c69e16b444dd18f4ca36e12de0a13 create mode 100644 geo-cache/geoassign/objects/8a7aae9fe98648ccb82bf06d07ebe234 create mode 100644 geo-cache/geoassign/objects/8a810e6dfec94fdeb21465aa9efc47fa create mode 100644 geo-cache/geoassign/objects/8af852665e3042ff948bf888418e8cd6 create mode 100644 geo-cache/geoassign/objects/8b500cc479bc4ac2997a78ff6a992d58 create mode 100644 geo-cache/geoassign/objects/8b5f822f67b34849848672481d5535cc create mode 100644 geo-cache/geoassign/objects/8b7902ee408747d2a81eb4b6178f20e9 create mode 100644 geo-cache/geoassign/objects/8b9c801eafca4517a2cfaa3f19d98be6 create mode 100644 geo-cache/geoassign/objects/8bcf49ff536c47dbb97161edf4521099 create mode 100644 geo-cache/geoassign/objects/8bd4fa2d05fa47149ee00c09f1bb6d5c create mode 100644 geo-cache/geoassign/objects/8c1bfc7e3fb642c2955d591b1c4456d4 create mode 100644 geo-cache/geoassign/objects/8c2727c29b044a6fbf9148d642a88874 create mode 100644 geo-cache/geoassign/objects/8c93865f10c5400a8cfe61db9e34bdda create mode 100644 geo-cache/geoassign/objects/8c99beff888e4d989795b93bca5fce94 create mode 100644 geo-cache/geoassign/objects/8ca1a7cb48764ede8e65d6e2891132e9 create mode 100644 geo-cache/geoassign/objects/8ca311f4638545ab9ff36c4d7e8b6a31 create mode 100644 geo-cache/geoassign/objects/8ccbe42ffc2944fc83fea9e42ee6ffa7 create mode 100644 geo-cache/geoassign/objects/8ce2ded2936d454f995af2f4f3edd76b create mode 100644 geo-cache/geoassign/objects/8cfe36c62d944fc4936e4d8188c30b41 create mode 100644 geo-cache/geoassign/objects/8d15a60673244ea280c7886a379400e4 create mode 100644 geo-cache/geoassign/objects/8d2580b13e944bedb488435fbc537367 create mode 100644 geo-cache/geoassign/objects/8d4f11c333ce4cf48a77cfc5f1cb7131 create mode 100644 geo-cache/geoassign/objects/8d69b02e7cfb44eab28312f9e0c72ed8 create mode 100644 geo-cache/geoassign/objects/8d97ca504f934797879b0c86ff112a8f create mode 100644 geo-cache/geoassign/objects/8da1c2d8d45d403f993e965e980a58af create mode 100644 geo-cache/geoassign/objects/8db24c52fd1f4352825e0f996c76b880 create mode 100644 geo-cache/geoassign/objects/8dc48fb81a7642ada768085a44a638c0 create mode 100644 geo-cache/geoassign/objects/8dc5d56dabde46a78d0990d0c6b59491 create mode 100644 geo-cache/geoassign/objects/8dd9b8ea053d4bfaab462638d71833d0 create mode 100644 geo-cache/geoassign/objects/8df6c108109a4b0d8b8b4da6aa7be429 create mode 100644 geo-cache/geoassign/objects/8e1c0b8f982f438185ab1c3e98128634 create mode 100644 geo-cache/geoassign/objects/8e22375a4ef04cc0b5b6c7e4c8fffe27 create mode 100644 geo-cache/geoassign/objects/8e2510b919e149c6a810cb583de10529 create mode 100644 geo-cache/geoassign/objects/8e94bd228aee469cbf113f9beae82068 create mode 100644 geo-cache/geoassign/objects/8ea04eace90c4e8196cc8ab9b5917c83 create mode 100644 geo-cache/geoassign/objects/8eab1138d4f040e58341d708c313ef48 create mode 100644 geo-cache/geoassign/objects/8eb36d5b1bc74374ae0c629bef7973c9 create mode 100644 geo-cache/geoassign/objects/8eba85bc25fd496cbf4f6a45930dead2 create mode 100644 geo-cache/geoassign/objects/8ebfe1dae9c14035b13fc4b6b55a038d create mode 100644 geo-cache/geoassign/objects/8ed31e41d5534e3696f9646b7f675a48 create mode 100644 geo-cache/geoassign/objects/8ed7e50550b34ded97b1139ad702bfba create mode 100644 geo-cache/geoassign/objects/8ee4a4c8587f4595a075e00edbce812c create mode 100644 geo-cache/geoassign/objects/8ef10862dbd04b03ac5f71684c397582 create mode 100644 geo-cache/geoassign/objects/8f089d51e75c4780888e3d2e9fb3ea70 create mode 100644 geo-cache/geoassign/objects/8f12036701c54ed5b7ecc72598af512d create mode 100644 geo-cache/geoassign/objects/8f66ffc1f36541128cb26e7304e04bb2 create mode 100644 geo-cache/geoassign/objects/8f7c9e43311a43f7a2d7e373d9f05a10 create mode 100644 geo-cache/geoassign/objects/8fcaa3343afb4780ada253dcc34c8b27 create mode 100644 geo-cache/geoassign/objects/9010bfd73aa145d3b566a54c9a05bca3 create mode 100644 geo-cache/geoassign/objects/905ac7f0c4d04b3896e55af205431786 create mode 100644 geo-cache/geoassign/objects/906188cd690c496ca951d01db21e3e2a create mode 100644 geo-cache/geoassign/objects/907a8519a3c14b0b94e135307e8a9ac3 create mode 100644 geo-cache/geoassign/objects/90bab5a388fc44f69275880118bd5ff4 create mode 100644 geo-cache/geoassign/objects/90d03a9df74644e5af68ccf1d957476f create mode 100644 geo-cache/geoassign/objects/90f3f677a13a4a30a50f34022c6b91b8 create mode 100644 geo-cache/geoassign/objects/910bfd92342e42fd97078bf24bf280f0 create mode 100644 geo-cache/geoassign/objects/912461c3d2cf4c99946d7684dd6e355d create mode 100644 geo-cache/geoassign/objects/912d22a8d5654118a2387bc0a12c63d1 create mode 100644 geo-cache/geoassign/objects/91418ee2443a4da188f19fe497b83cab create mode 100644 geo-cache/geoassign/objects/91529b069ca84c4b87cdeba3fa6b9253 create mode 100644 geo-cache/geoassign/objects/915f79c6f1c24fc3acce02af291c8a7d create mode 100644 geo-cache/geoassign/objects/91a91816c70a4c9bb1f1d49706fe24f0 create mode 100644 geo-cache/geoassign/objects/91b4810b3e9a47e682053ab3e0bdf544 create mode 100644 geo-cache/geoassign/objects/91cdfc35f7f242aea4d5c78e389df308 create mode 100644 geo-cache/geoassign/objects/91f0e28ad97443f09f81ecd3873e3540 create mode 100644 geo-cache/geoassign/objects/9206b2b1e350492a9b22a55783d42a98 create mode 100644 geo-cache/geoassign/objects/920c3a86aa4046d7a7193dc32ba6f0dd create mode 100644 geo-cache/geoassign/objects/9224ba30e9084ebdb14381ae7c9086f7 create mode 100644 geo-cache/geoassign/objects/92273445ffd049d8a05e5003a52639bf create mode 100644 geo-cache/geoassign/objects/92277308c5cf4b25aac3763d7bc27f8a create mode 100644 geo-cache/geoassign/objects/9242c788b166401a81ac7d44c13c338b create mode 100644 geo-cache/geoassign/objects/92694d8ffc6b44e38b039476b69a6b90 create mode 100644 geo-cache/geoassign/objects/928378feed8c4acc9bfcdf6ca247d65f create mode 100644 geo-cache/geoassign/objects/9283f534f9a64fce809f57ff9544474d create mode 100644 geo-cache/geoassign/objects/92a9f713d11747ddb4dbe30c08e951a1 create mode 100644 geo-cache/geoassign/objects/92aea49cfffe4d84ab4e01174ba245e2 create mode 100644 geo-cache/geoassign/objects/92bbab8ed89541a4a57f032ac9418ef6 create mode 100644 geo-cache/geoassign/objects/92d7b02f08c345fda0b9fcb973014656 create mode 100644 geo-cache/geoassign/objects/92e23c57c13a45ef83a40dcce45d11f8 create mode 100644 geo-cache/geoassign/objects/92e9be072fe44c6d922ed56406363b44 create mode 100644 geo-cache/geoassign/objects/92ed836ebb644526b2e652732c7150ea create mode 100644 geo-cache/geoassign/objects/9309c148dfbe4dccb5f01a5e96cd1004 create mode 100644 geo-cache/geoassign/objects/931752cfd4224090884c1ec989a9e7eb create mode 100644 geo-cache/geoassign/objects/932adc7f211a43f5a02a81f0a9819a05 create mode 100644 geo-cache/geoassign/objects/9330c68da0a649daa4ff6d2df3eb6ed2 create mode 100644 geo-cache/geoassign/objects/933221fb62134c7ab44afe66efbcb14e create mode 100644 geo-cache/geoassign/objects/93506f023c554ac9a4525c8a7d469b90 create mode 100644 geo-cache/geoassign/objects/936526c36e7248e8aacdb459107e19b5 create mode 100644 geo-cache/geoassign/objects/93f8df1161724e96a61e0dbf3fd97554 create mode 100644 geo-cache/geoassign/objects/9425b03fb942417c96d80a130fe3bca5 create mode 100644 geo-cache/geoassign/objects/943290f9ceb84c868409c8c495a0b435 create mode 100644 geo-cache/geoassign/objects/9437cb662dce4aae932416b21e61848e create mode 100644 geo-cache/geoassign/objects/94394bc517c64a45bcd4b211f279cd67 create mode 100644 geo-cache/geoassign/objects/9440b02419b1412a925f84ab9c24cdf2 create mode 100644 geo-cache/geoassign/objects/945fba05b61049428c6505511620f81d create mode 100644 geo-cache/geoassign/objects/9460754fc4dc4ff2965b9a9bba186643 create mode 100644 geo-cache/geoassign/objects/9464728b616b421ea8b6f49b4992161d create mode 100644 geo-cache/geoassign/objects/9471ac05ed464109b50860754d372025 create mode 100644 geo-cache/geoassign/objects/94745372b81f4c49872cf8678fca6145 create mode 100644 geo-cache/geoassign/objects/9487e87a077442d6bfb97916149e4a49 create mode 100644 geo-cache/geoassign/objects/94dd0effab194b9dbce948eba662f72f create mode 100644 geo-cache/geoassign/objects/94e4211f7f8948908810ecbdf96fd725 create mode 100644 geo-cache/geoassign/objects/94e6ee5cb2df4dcb9e3ded21cb003d7a create mode 100644 geo-cache/geoassign/objects/94ec3a2b676d4e3bb9a8b7c29a683fe8 create mode 100644 geo-cache/geoassign/objects/94ee0fe364854da9b43417a829c20fd5 create mode 100644 geo-cache/geoassign/objects/94f111e449be4783869236d4db5b34e8 create mode 100644 geo-cache/geoassign/objects/94f68bc21a5d448291a97346f3ac9208 create mode 100644 geo-cache/geoassign/objects/9506a13fcc774ced81b4b1bcaf916d73 create mode 100644 geo-cache/geoassign/objects/9511afed5b4f4e79b97d88f9ffee49b4 create mode 100644 geo-cache/geoassign/objects/955370f773d9408cb1c43bd8a357b585 create mode 100644 geo-cache/geoassign/objects/95588dc0fe244e3a876659cbff3b30e3 create mode 100644 geo-cache/geoassign/objects/958e398450b343479aaf9aabda873948 create mode 100644 geo-cache/geoassign/objects/958fba736e6f47d4af172720be80282e create mode 100644 geo-cache/geoassign/objects/95929a7e62e143989439c1e19b2e7897 create mode 100644 geo-cache/geoassign/objects/95b57665cb584da4ab51174b0ba4b89b create mode 100644 geo-cache/geoassign/objects/96029ebecfa64b90b7032f3ac3322d83 create mode 100644 geo-cache/geoassign/objects/960c6153febe4139bec712c60a4238e7 create mode 100644 geo-cache/geoassign/objects/961628f5707f4bdfae521a358ad71367 create mode 100644 geo-cache/geoassign/objects/962232d84f94428c80c68431af857123 create mode 100644 geo-cache/geoassign/objects/9629773d69064832a749d243da2538dc create mode 100644 geo-cache/geoassign/objects/962ef33a9358400384f7e2cd1d54d708 create mode 100644 geo-cache/geoassign/objects/963c2871c1ee4235a3f58f1fa723fec5 create mode 100644 geo-cache/geoassign/objects/964c1e114b52446bb382b666c327806d create mode 100644 geo-cache/geoassign/objects/9689af20849a4831ac52bc09c95ae01a create mode 100644 geo-cache/geoassign/objects/96a87923da1e4069bb7f33d8d2780eb0 create mode 100644 geo-cache/geoassign/objects/9706b4784e9341ff9b1b62c67d7ba124 create mode 100644 geo-cache/geoassign/objects/970d6c4b3d974e249b69c3a5be6c152a create mode 100644 geo-cache/geoassign/objects/9760336ad68940869032b6c647d2b65f create mode 100644 geo-cache/geoassign/objects/97654b57abdb4fc58f8a9d5a17046784 create mode 100644 geo-cache/geoassign/objects/979bbf1c9ece4aafa79deeecb33840b1 create mode 100644 geo-cache/geoassign/objects/97a397f70dfb4eb49eab4db87a71ecd3 create mode 100644 geo-cache/geoassign/objects/97bc1febeac240a3b4b6b6eeb36b5be2 create mode 100644 geo-cache/geoassign/objects/97c141866a5d4402bd17e68d6bd28b13 create mode 100644 geo-cache/geoassign/objects/97c77548f21044999d8b6510ca303f60 create mode 100644 geo-cache/geoassign/objects/97e2a08caeaa4ce28d4546f7de353325 create mode 100644 geo-cache/geoassign/objects/98073a8e474f4173b64a2fb5c03d344e create mode 100644 geo-cache/geoassign/objects/98671c27eac548618e74ef6bd5d2222d create mode 100644 geo-cache/geoassign/objects/986f9b27accc4d089eb5caa927e87495 create mode 100644 geo-cache/geoassign/objects/9884c6b3ce1847cd906fef148784f7c0 create mode 100644 geo-cache/geoassign/objects/9896198fa8b04cb19361c5bb5fa5d8bc create mode 100644 geo-cache/geoassign/objects/98a8397d1fcf46b38a3b8913d73d3332 create mode 100644 geo-cache/geoassign/objects/98d15f5f4e674eb383548b7bb2cf3ffe create mode 100644 geo-cache/geoassign/objects/9918e6535a51401fa77a1c2dcfcef848 create mode 100644 geo-cache/geoassign/objects/991d700336234057883c646b1ff60585 create mode 100644 geo-cache/geoassign/objects/9921016848764d01bac10b77c4a4f47f create mode 100644 geo-cache/geoassign/objects/99495e68b9de4a1c8736399e42cc9732 create mode 100644 geo-cache/geoassign/objects/9950183de16349d1b262ce3acc93a052 create mode 100644 geo-cache/geoassign/objects/9952d640cc1249feace5e55b3cd1a5cd create mode 100644 geo-cache/geoassign/objects/9976ff0ae8194a05beb978a2e5833f0f create mode 100644 geo-cache/geoassign/objects/998cdecd345440999fea5ba5a2e3e26e create mode 100644 geo-cache/geoassign/objects/99bb66da4f954ca7baf786a6c07cc0a7 create mode 100644 geo-cache/geoassign/objects/99ea153b1dc74f148342a76c8546cf31 create mode 100644 geo-cache/geoassign/objects/99f95d4e111b4ae38ee150cfb1a14dfa create mode 100644 geo-cache/geoassign/objects/9a00bcad4ff64875bce5120f5860a0ca create mode 100644 geo-cache/geoassign/objects/9a3576bd5da743b4b508146da74fe941 create mode 100644 geo-cache/geoassign/objects/9a361a76003b4eee94e1e8397eea295e create mode 100644 geo-cache/geoassign/objects/9a44e341e7cb4ed7b45baf4ca30108e8 create mode 100644 geo-cache/geoassign/objects/9a5b6da3588e49ab89be8aa5adeca322 create mode 100644 geo-cache/geoassign/objects/9a97af86002f49a5a5d5cc922906163e create mode 100644 geo-cache/geoassign/objects/9ad93761e8134fe596b223791d128ae5 create mode 100644 geo-cache/geoassign/objects/9b3af019fd2748d0bb628afb03465993 create mode 100644 geo-cache/geoassign/objects/9b582ee3b87e44e9802e58ee89dfe7ed create mode 100644 geo-cache/geoassign/objects/9b7dbbda782e41268597a03e0e63ecea create mode 100644 geo-cache/geoassign/objects/9b8e06b6b0c9409a821c047c2e2e5589 create mode 100644 geo-cache/geoassign/objects/9b985e90835d4598ac92614a6db952b0 create mode 100644 geo-cache/geoassign/objects/9b9e6ab1da1c4f5b9ae1141d10d63fae create mode 100644 geo-cache/geoassign/objects/9bae9703b3094aa3887721282d02714c create mode 100644 geo-cache/geoassign/objects/9bceea10e2f14541b298e2983009e6ae create mode 100644 geo-cache/geoassign/objects/9bd010255a044e789f14b4b900495091 create mode 100644 geo-cache/geoassign/objects/9bd4bb799cd54b2a8a9374e827c332ab create mode 100644 geo-cache/geoassign/objects/9bdc685d7033427f8ef076b6c9d6d498 create mode 100644 geo-cache/geoassign/objects/9c2232d2e7cd47c0a11f3c116cab1301 create mode 100644 geo-cache/geoassign/objects/9c24f49bb2d840cdae2f941235d020ec create mode 100644 geo-cache/geoassign/objects/9c3e7637495744439d706fd71c948160 create mode 100644 geo-cache/geoassign/objects/9c51379a7d4e444e91e169f8897a845e create mode 100644 geo-cache/geoassign/objects/9c5e4676739d4fbd92c63800bd162d41 create mode 100644 geo-cache/geoassign/objects/9c66d3096ec142efb54bb6540843b67d create mode 100644 geo-cache/geoassign/objects/9c9150ca1b3346feb298d280fa47867b create mode 100644 geo-cache/geoassign/objects/9c920d7e390c480688ff6a54fa6eeca0 create mode 100644 geo-cache/geoassign/objects/9c96ff924687416e81da393168d06ae6 create mode 100644 geo-cache/geoassign/objects/9cb8384ec5d84cb1838309109c5ec767 create mode 100644 geo-cache/geoassign/objects/9ccf79a2eec24ce290cab84ea9b5b1ca create mode 100644 geo-cache/geoassign/objects/9cd099774993487cb44c86fd8bb35149 create mode 100644 geo-cache/geoassign/objects/9cd33344e8b945f8835ec40fc023c3d9 create mode 100644 geo-cache/geoassign/objects/9cea0c8592a64d978236ab41b95335cd create mode 100644 geo-cache/geoassign/objects/9d00096525bc458eab92d9926bfcc6b0 create mode 100644 geo-cache/geoassign/objects/9d222156001246f19823905202becc15 create mode 100644 geo-cache/geoassign/objects/9d235fae307d429eba0d437d37eea6cf create mode 100644 geo-cache/geoassign/objects/9d4361adbb714369b8a7974391651016 create mode 100644 geo-cache/geoassign/objects/9d562d4d1d134f31930840e0f0acbf67 create mode 100644 geo-cache/geoassign/objects/9d58ce3445bf477bab02d3380eb57fb3 create mode 100644 geo-cache/geoassign/objects/9d9dd8eef6b24876b64222dcfcef79f6 create mode 100644 geo-cache/geoassign/objects/9d9f2a3632184a448b8115c3f55dae73 create mode 100644 geo-cache/geoassign/objects/9dc8c5d5d0e04800a3480f2b5447bed7 create mode 100644 geo-cache/geoassign/objects/9ddbe60fd3b144fa962e7bce69a916c2 create mode 100644 geo-cache/geoassign/objects/9dec89c9590f4f5a9697af5937f82da3 create mode 100644 geo-cache/geoassign/objects/9df7c3dbe56a41579aac3a85814eeb75 create mode 100644 geo-cache/geoassign/objects/9dff1ae08f184cf2a2bb8c1c0967ffee create mode 100644 geo-cache/geoassign/objects/9e064e80c0894af79da9270479804b84 create mode 100644 geo-cache/geoassign/objects/9e1423d0ce2849ada91c52c340ba8c32 create mode 100644 geo-cache/geoassign/objects/9e1c0a7e47604e7382014e72ee7711db create mode 100644 geo-cache/geoassign/objects/9e6fadeed1e4423c8c10f39b376262d8 create mode 100644 geo-cache/geoassign/objects/9e784345a2de4236ad216f0e7bbf9d3d create mode 100644 geo-cache/geoassign/objects/9e7c80cd900a4301ab3be60192c7f7fc create mode 100644 geo-cache/geoassign/objects/9e84e032ea7548538c386751f227f978 create mode 100644 geo-cache/geoassign/objects/9e8fef40e93a4fbea9fe76bcdf8f2510 create mode 100644 geo-cache/geoassign/objects/9ebe876797c14fe08f0c879c199e5bcd create mode 100644 geo-cache/geoassign/objects/9edb56bb87ff4059bf45ef35a444d41a create mode 100644 geo-cache/geoassign/objects/9ee4505b2be74d2783a4c696e035ec2f create mode 100644 geo-cache/geoassign/objects/9f3915037a0b449e9537d0fde9d5e4d4 create mode 100644 geo-cache/geoassign/objects/9f721181aef9444a9f0bcf304170f35a create mode 100644 geo-cache/geoassign/objects/9fa87637eae949e3af68cb3a42bb91b8 create mode 100644 geo-cache/geoassign/objects/9fb66d3bbfd0426ba1abfa2f0363a10c create mode 100644 geo-cache/geoassign/objects/9ff0962dd668449ab26dc1fc9e86c4c8 create mode 100644 geo-cache/geoassign/objects/a0073f6f98e946c4a2c1a54db7902e87 create mode 100644 geo-cache/geoassign/objects/a00aca749d1b440bac7dfd1160eba3bd create mode 100644 geo-cache/geoassign/objects/a00bb589e9c645f39710c5f3ddbf56fb create mode 100644 geo-cache/geoassign/objects/a016a930dc3745748494ed251b53794f create mode 100644 geo-cache/geoassign/objects/a031c68e16394d21a54420557ae8c24f create mode 100644 geo-cache/geoassign/objects/a03353724bab49f9b327e05cdb7da316 create mode 100644 geo-cache/geoassign/objects/a06309706001426180ccce56e72ac7f9 create mode 100644 geo-cache/geoassign/objects/a06f7f05ed4d4558a4cfcfa81931ce86 create mode 100644 geo-cache/geoassign/objects/a0865e3bbdbf47a2804a026d36d6bd13 create mode 100644 geo-cache/geoassign/objects/a09ed5d072494ced896e5b7f304d2587 create mode 100644 geo-cache/geoassign/objects/a0b4ce1c6b7f400bbeb37cf1ea2460fa create mode 100644 geo-cache/geoassign/objects/a0ec6c3e1f3c40fc8dac669a89d23e7e create mode 100644 geo-cache/geoassign/objects/a0f40f67cd22459e9a009756ce7876b6 create mode 100644 geo-cache/geoassign/objects/a139b8373eb44cfa9b2f2c9f84986e10 create mode 100644 geo-cache/geoassign/objects/a13c2dfca6cb4274a4dd1da8508dced6 create mode 100644 geo-cache/geoassign/objects/a13d743d91d44619bd9b1073f47b28e8 create mode 100644 geo-cache/geoassign/objects/a1448a95c6774a359bb892b29279cb3f create mode 100644 geo-cache/geoassign/objects/a163593c4ea54dfdb7062e3e46ecbbc2 create mode 100644 geo-cache/geoassign/objects/a166d6a9483f4aeeb25b8bd05613f951 create mode 100644 geo-cache/geoassign/objects/a16710f9d3e74dc187207b3b41c1d70b create mode 100644 geo-cache/geoassign/objects/a1818a487bae438f91d08c14255a2410 create mode 100644 geo-cache/geoassign/objects/a19b3386f52345c5a7a7e7d778eeb5e1 create mode 100644 geo-cache/geoassign/objects/a1d69183893d41d4a1f129a7ab4e9801 create mode 100644 geo-cache/geoassign/objects/a1dae934439e4b68bf2a2321ab84789a create mode 100644 geo-cache/geoassign/objects/a1e521e7b4ad449b8a0fbc3633ee36c4 create mode 100644 geo-cache/geoassign/objects/a1ed893414ef4a33ba9a9687dc41962d create mode 100644 geo-cache/geoassign/objects/a2121214108848958725c44cf5e5e882 create mode 100644 geo-cache/geoassign/objects/a251fd054c34468486dd014a777e6f52 create mode 100644 geo-cache/geoassign/objects/a25a10585aaa4421adbea23180a00e0e create mode 100644 geo-cache/geoassign/objects/a27113d23dd64d0cbb6f8fd1258819a2 create mode 100644 geo-cache/geoassign/objects/a283c45878564f9caa7c943ffe67407b create mode 100644 geo-cache/geoassign/objects/a29c03ddc41b46eb88691d60c979160f create mode 100644 geo-cache/geoassign/objects/a2b67b04531947a9bacab98ef5fedd76 create mode 100644 geo-cache/geoassign/objects/a2f76877fb724e11995a3111124408fa create mode 100644 geo-cache/geoassign/objects/a3191e0aaca3460191fead814b71162d create mode 100644 geo-cache/geoassign/objects/a323d64a8d954b488748e15548eac1dd create mode 100644 geo-cache/geoassign/objects/a35e55adf65c45529d1c2a0e34957a6a create mode 100644 geo-cache/geoassign/objects/a362962b40ab4ff38bcdc73eeb285b28 create mode 100644 geo-cache/geoassign/objects/a394243f89bc4f9387896ef462b0686d create mode 100644 geo-cache/geoassign/objects/a39797f0ef0b4c7d89b6ae40a4563f80 create mode 100644 geo-cache/geoassign/objects/a39c543a1cbe4be39ec78a4791ab230d create mode 100644 geo-cache/geoassign/objects/a3bdea9e92514cd7b178c0e835acb9fe create mode 100644 geo-cache/geoassign/objects/a3cc039a0cb34558bbee32e1f44bbc02 create mode 100644 geo-cache/geoassign/objects/a426a09e9476448a93f9f899bbc3d145 create mode 100644 geo-cache/geoassign/objects/a443edf3f8d64dbf872c7cb1c404e8d9 create mode 100644 geo-cache/geoassign/objects/a45186e5f3a549d785ee31bb45e61cc9 create mode 100644 geo-cache/geoassign/objects/a45eb8b538fb486ca90468420282c878 create mode 100644 geo-cache/geoassign/objects/a468ee7471124a5aa6b70e86ee35667f create mode 100644 geo-cache/geoassign/objects/a48468b7e0c344ec8fd972a255b7b708 create mode 100644 geo-cache/geoassign/objects/a48752f4ce424bad9520f54c1a3aa39c create mode 100644 geo-cache/geoassign/objects/a49e157f173343cd86a0eeb63b3eee7a create mode 100644 geo-cache/geoassign/objects/a4bf122f33c94742a167951ff968562f create mode 100644 geo-cache/geoassign/objects/a4e1996a30fb4699811ec82acbb1ac26 create mode 100644 geo-cache/geoassign/objects/a5390fa0a0d04584ba6e1cc049d07821 create mode 100644 geo-cache/geoassign/objects/a58ade8265ca4be883ec4ce34c5fe188 create mode 100644 geo-cache/geoassign/objects/a58c0d3c18314d81bc8a6f0c41fd12c9 create mode 100644 geo-cache/geoassign/objects/a59e66a829804f9e8a1f05b215d607a8 create mode 100644 geo-cache/geoassign/objects/a5b0a514b8944693864d330384c2c9b7 create mode 100644 geo-cache/geoassign/objects/a5c09c08afb24cc192551b0652b1de7e create mode 100644 geo-cache/geoassign/objects/a5cb48bcf6604724962d4cc7b0908ece create mode 100644 geo-cache/geoassign/objects/a60b7d059a214013a007a776b01c0e2e create mode 100644 geo-cache/geoassign/objects/a60e2214942c41b9887a2a0421fdff18 create mode 100644 geo-cache/geoassign/objects/a617630f0d6e493b839b679aae38d68f create mode 100644 geo-cache/geoassign/objects/a61e285edb9444daad2b54faf81ebb1d create mode 100644 geo-cache/geoassign/objects/a6373938a6884f438943aba0f1d07ccf create mode 100644 geo-cache/geoassign/objects/a6622bf53cb24c3fa5c935ec9970a3a9 create mode 100644 geo-cache/geoassign/objects/a673d921b2754b8a9559f3ad13b1b314 create mode 100644 geo-cache/geoassign/objects/a6afcc567384465884a207521fe30a23 create mode 100644 geo-cache/geoassign/objects/a6c1e54daf5c40acb44f850f4235764b create mode 100644 geo-cache/geoassign/objects/a6d672637d7142bbb5831388747231ff create mode 100644 geo-cache/geoassign/objects/a6df81ca573f4fa896bfabcad274efce create mode 100644 geo-cache/geoassign/objects/a6f6993377324c84bd57d5866aa987d2 create mode 100644 geo-cache/geoassign/objects/a6f7181b01c24828aac045175c3544f1 create mode 100644 geo-cache/geoassign/objects/a72b1167f597406d8aa75dbbd06da99c create mode 100644 geo-cache/geoassign/objects/a738d17119244353ab320efbf88847cf create mode 100644 geo-cache/geoassign/objects/a73b0d91010d4cb985614079a6b82f3f create mode 100644 geo-cache/geoassign/objects/a73d29b1acb44372babe3ad0d445019c create mode 100644 geo-cache/geoassign/objects/a74397fdfb6247169edd1d4f67b4133f create mode 100644 geo-cache/geoassign/objects/a79b63e7795944b18fe40129d75b960f create mode 100644 geo-cache/geoassign/objects/a79b8709492c4b97ace306a16d55037d create mode 100644 geo-cache/geoassign/objects/a7bdfa0cb8284c50b0c76586814e9a13 create mode 100644 geo-cache/geoassign/objects/a7cf0f9633924604ad6a995655e96cbd create mode 100644 geo-cache/geoassign/objects/a7d637097c424dc4a6a2d1bf2492b7ae create mode 100644 geo-cache/geoassign/objects/a7e6e8bd1f6849b98b58ed7909c4bde8 create mode 100644 geo-cache/geoassign/objects/a7f0234328a0468999bd5b268993726a create mode 100644 geo-cache/geoassign/objects/a841e9e0de17448fadf906b14c7df9b0 create mode 100644 geo-cache/geoassign/objects/a898b91498cf420e9f46678e8af3b4d4 create mode 100644 geo-cache/geoassign/objects/a899713b85b14df0a16cee05105205c1 create mode 100644 geo-cache/geoassign/objects/a89f514808ef4b39b1ce8579343dc05b create mode 100644 geo-cache/geoassign/objects/a8c4af2faccc462ba2d221c97d19a6cb create mode 100644 geo-cache/geoassign/objects/a8d065dccba3424eb8691b190d3f3ec3 create mode 100644 geo-cache/geoassign/objects/a8d7aa07f9a04c7aa34401ae54a4a1bf create mode 100644 geo-cache/geoassign/objects/a8ee5f00897747d385ff8412d49a42b5 create mode 100644 geo-cache/geoassign/objects/a8fb01fb1ffd42799e210c74ac96333a create mode 100644 geo-cache/geoassign/objects/a908fb4d0ee14d41af5f7f6121c6a812 create mode 100644 geo-cache/geoassign/objects/a964cf4aeb4142b8a5cb80011d6df1c4 create mode 100644 geo-cache/geoassign/objects/a989706a9d0b4c708ca81a43dc84ed11 create mode 100644 geo-cache/geoassign/objects/a9c1f9aff6ab49da907b5481b38205b2 create mode 100644 geo-cache/geoassign/objects/a9d8bd0e5b534567982ff2daabd94be5 create mode 100644 geo-cache/geoassign/objects/a9d9c871e3504e419915faab5fcde44a create mode 100644 geo-cache/geoassign/objects/a9dbf44a249446de92c9b1b788982a12 create mode 100644 geo-cache/geoassign/objects/aa0a4b6d57ff4b6d8055f627f61031f9 create mode 100644 geo-cache/geoassign/objects/aa167e5c54c74127b52538ff96ede90b create mode 100644 geo-cache/geoassign/objects/aa2b786a0fcd41ebac3f801d4ab88cbf create mode 100644 geo-cache/geoassign/objects/aa443e62da5042c4816a80ff2ff2ac46 create mode 100644 geo-cache/geoassign/objects/aa461ba2a7ae4871abcfcad58d7f4950 create mode 100644 geo-cache/geoassign/objects/aa568f0a1b3641c2991a72e7c65df0af create mode 100644 geo-cache/geoassign/objects/aa857fd9638348d89ec9410cf1f6634a create mode 100644 geo-cache/geoassign/objects/aaadc24dad9948a2a40dacb38402542c create mode 100644 geo-cache/geoassign/objects/aac815b7c20149729ec8521832558100 create mode 100644 geo-cache/geoassign/objects/aad086a38b384800ade313c208a0b35d create mode 100644 geo-cache/geoassign/objects/aaf2b51d8def4daca591f360ba8f76bd create mode 100644 geo-cache/geoassign/objects/ab29c9330b8e4f6b9bf3971d07551df4 create mode 100644 geo-cache/geoassign/objects/ab2b1b4e71e9467e9f976966c1c6c67d create mode 100644 geo-cache/geoassign/objects/ab5436a5af3244fc8e0a826e65c51339 create mode 100644 geo-cache/geoassign/objects/ab5e9f6b8b2a421cae206f19482b72b6 create mode 100644 geo-cache/geoassign/objects/ab65cf21d3a147cba92da36dc4c6f99b create mode 100644 geo-cache/geoassign/objects/ab81e30424bb47009f6d3191c2b29a98 create mode 100644 geo-cache/geoassign/objects/abcf1d16001a45b0b91325005c340c0c create mode 100644 geo-cache/geoassign/objects/abd13ecb9840423dadd520901eeeaccb create mode 100644 geo-cache/geoassign/objects/abd64899d63649ec89af70b823e7af22 create mode 100644 geo-cache/geoassign/objects/abdd70db46514c78840832e005c9eb8f create mode 100644 geo-cache/geoassign/objects/abdfde4091294164a1fe8bc853824c50 create mode 100644 geo-cache/geoassign/objects/ac12a828a93d4b0cb0be1b0a3636ad40 create mode 100644 geo-cache/geoassign/objects/ac1ea9034d42431b8a8aa93d9c5904f4 create mode 100644 geo-cache/geoassign/objects/ac4e8b4f38e54746a1444739a04b8c9b create mode 100644 geo-cache/geoassign/objects/ac59cebefc794b9994b8a7cfc8e292ba create mode 100644 geo-cache/geoassign/objects/ac5bbae7b0f14ca5bc6c4ff90d10db6c create mode 100644 geo-cache/geoassign/objects/acb0f71f44fe4d539efb8837d0716410 create mode 100644 geo-cache/geoassign/objects/acbb499df7124056a787767ba694ccb1 create mode 100644 geo-cache/geoassign/objects/ace173456eb74868aea0b0276b0741c1 create mode 100644 geo-cache/geoassign/objects/acf29fb2822642acb0c734358081ee44 create mode 100644 geo-cache/geoassign/objects/acfc88d48c904f62af480478ab711849 create mode 100644 geo-cache/geoassign/objects/ad28003945a541ccabfcf0b56f831e04 create mode 100644 geo-cache/geoassign/objects/ad4e8f866d4d41258cc702530332b9a8 create mode 100644 geo-cache/geoassign/objects/ad6d338c9c3e41bdac8db44bfd3294a8 create mode 100644 geo-cache/geoassign/objects/ad6d489d84f144348289371377fcb82c create mode 100644 geo-cache/geoassign/objects/ada0c440ca434944a9d740a556aced6b create mode 100644 geo-cache/geoassign/objects/ada4b07f4db94e408323b09d5dcf4ebb create mode 100644 geo-cache/geoassign/objects/adb11c34295041e4bec370bf5c043246 create mode 100644 geo-cache/geoassign/objects/adc1edb5c5c941f5a3e52c8e1a2253f0 create mode 100644 geo-cache/geoassign/objects/ade2de4bb3c1475088f9eaf4aa72f7dd create mode 100644 geo-cache/geoassign/objects/adf63080462e419b9d475a0630b6f2af create mode 100644 geo-cache/geoassign/objects/ae1f24d454cb47628e59dae9cb9674dc create mode 100644 geo-cache/geoassign/objects/ae258e623bee44648504e9f6118634ce create mode 100644 geo-cache/geoassign/objects/ae34bf5fd86143ecb8000a18f705a15e create mode 100644 geo-cache/geoassign/objects/ae49c42252264b9daffe6d67fbd223a6 create mode 100644 geo-cache/geoassign/objects/ae79acb4fdf54fdea2fba01dda1b9f0a create mode 100644 geo-cache/geoassign/objects/aeed3ea3cce84e609ea6529f63cdb281 create mode 100644 geo-cache/geoassign/objects/aeff913cae364d7aaca1e2b1ee4f428d create mode 100644 geo-cache/geoassign/objects/af1d5a35313e46eab358896db4b9ee09 create mode 100644 geo-cache/geoassign/objects/af71403a946a45f28b75d7372f28cd15 create mode 100644 geo-cache/geoassign/objects/af8436e30c544726aa17abacf84d6dce create mode 100644 geo-cache/geoassign/objects/af91bb740f92407ea0d70eb05fac83cd create mode 100644 geo-cache/geoassign/objects/af932c100b58442eb553713ad4271c36 create mode 100644 geo-cache/geoassign/objects/afe06c2421c048c4b86b813eca9614bb create mode 100644 geo-cache/geoassign/objects/afee6e1001574ea88f98119d0eb57d3c create mode 100644 geo-cache/geoassign/objects/affd3a4ccf1044288a6d177841fde339 create mode 100644 geo-cache/geoassign/objects/b00117d4abef4cc481e73f5d68f58b16 create mode 100644 geo-cache/geoassign/objects/b01f8d69d7f94706b0b01fc2c20fa56a create mode 100644 geo-cache/geoassign/objects/b0221a1dace742d39271ab9e2f62ed06 create mode 100644 geo-cache/geoassign/objects/b03c7607e9c9451f91f1a1f070798bf2 create mode 100644 geo-cache/geoassign/objects/b0426b442e8f45a6baec7915c91af712 create mode 100644 geo-cache/geoassign/objects/b0696d8b62ea429b894166a6bd8e74bd create mode 100644 geo-cache/geoassign/objects/b0ac67d77a174da18bb73cc7e59bc36d create mode 100644 geo-cache/geoassign/objects/b0d0f5336598438196d0d5d97e2da0de create mode 100644 geo-cache/geoassign/objects/b0e706497f0046b5962069e16a09f019 create mode 100644 geo-cache/geoassign/objects/b0f83434798143429e47a6399b1134ba create mode 100644 geo-cache/geoassign/objects/b1064892630544e3be8a65f672ddb1c6 create mode 100644 geo-cache/geoassign/objects/b10b1a4c84f04a55aadd2d38ba59c1ea create mode 100644 geo-cache/geoassign/objects/b13fc4151f4f47f4b21d835243b6a497 create mode 100644 geo-cache/geoassign/objects/b152143b4ffe48a2bb70f1046d4494f1 create mode 100644 geo-cache/geoassign/objects/b1543b5574a746a2a5a4300a6144fdc2 create mode 100644 geo-cache/geoassign/objects/b17997ecfa584bfc94fb76b3640c7026 create mode 100644 geo-cache/geoassign/objects/b17e82e65f3c477b80b0a78e222fdd91 create mode 100644 geo-cache/geoassign/objects/b1825a710c564510a25fe9cb3fd9c792 create mode 100644 geo-cache/geoassign/objects/b1a27411fad3401a865bde872adb09b4 create mode 100644 geo-cache/geoassign/objects/b1b65a9420c149bcb95bfc8b8220be0a create mode 100644 geo-cache/geoassign/objects/b214020dba8b42909160a212b6e01005 create mode 100644 geo-cache/geoassign/objects/b2181c907c6947999a2011af2f539c88 create mode 100644 geo-cache/geoassign/objects/b24c9c4fff544636807f4073c3bdf6ed create mode 100644 geo-cache/geoassign/objects/b273589eb5074033b8813b9b6f740db1 create mode 100644 geo-cache/geoassign/objects/b280c29013f541059f035626e842e967 create mode 100644 geo-cache/geoassign/objects/b283cd0fa6874306b7119af6edf51771 create mode 100644 geo-cache/geoassign/objects/b285259f30bb4094b1b4e7a681d199cf create mode 100644 geo-cache/geoassign/objects/b28ac42ab82242f899d1bdcaca668c08 create mode 100644 geo-cache/geoassign/objects/b2b0be512afe459c85af6d6f4b09413f create mode 100644 geo-cache/geoassign/objects/b2b469ffd80045469b1b37b4636dd658 create mode 100644 geo-cache/geoassign/objects/b2f4aacbe7b04d8cad98ea2db2bb94db create mode 100644 geo-cache/geoassign/objects/b2fa1215dddb4aa4b73bb09392f071c4 create mode 100644 geo-cache/geoassign/objects/b2ffd322f5de4576983de86cdc5fa8e6 create mode 100644 geo-cache/geoassign/objects/b31462149f7b4e258ea720750ff86b10 create mode 100644 geo-cache/geoassign/objects/b3a77d782d224c6497ac02db5b1d85bc create mode 100644 geo-cache/geoassign/objects/b3a967803c37498cbf3eb6e2723b356e create mode 100644 geo-cache/geoassign/objects/b3b7addade1c44e3950791016b56be2b create mode 100644 geo-cache/geoassign/objects/b3b83ae9572048868d0ef63ac90d0906 create mode 100644 geo-cache/geoassign/objects/b3c181050e134a5293949ac4437ccb12 create mode 100644 geo-cache/geoassign/objects/b3e1bcd0956e46cf952831d0a51255c4 create mode 100644 geo-cache/geoassign/objects/b3f3b4a869b04634b2a1853dd432619c create mode 100644 geo-cache/geoassign/objects/b3f8628c7f4747379525db251c4a5177 create mode 100644 geo-cache/geoassign/objects/b3fd086910d049159e866a41617908d5 create mode 100644 geo-cache/geoassign/objects/b417bbb4fc8d4071a06a345b21327cb8 create mode 100644 geo-cache/geoassign/objects/b4211e7983814177a2b59e79c1dc3510 create mode 100644 geo-cache/geoassign/objects/b444d63e96fa488197d2553db5c47a33 create mode 100644 geo-cache/geoassign/objects/b46221c3f5074f43b7b9fcf0ab1d5f33 create mode 100644 geo-cache/geoassign/objects/b464d0b8cdd24064839978d4b0dff195 create mode 100644 geo-cache/geoassign/objects/b46f02d2d20e44b29fd182a385a4f04d create mode 100644 geo-cache/geoassign/objects/b49712ba4ab442a5a68afb536c396c4c create mode 100644 geo-cache/geoassign/objects/b497e499728d40efa87b0c37891176c2 create mode 100644 geo-cache/geoassign/objects/b4bd6fe7a42a4c0ba98fef566860eed0 create mode 100644 geo-cache/geoassign/objects/b4dc208de9864eebb01417bcc6823cdd create mode 100644 geo-cache/geoassign/objects/b560ab179963487baecbc93bbfb540ad create mode 100644 geo-cache/geoassign/objects/b5af1b787dfb42abb103988c31760c9f create mode 100644 geo-cache/geoassign/objects/b5b4470f0c6e45659c1c90db504cdc30 create mode 100644 geo-cache/geoassign/objects/b5ce857eb00447e28e956a2f43f4d872 create mode 100644 geo-cache/geoassign/objects/b5cf4eb67cd64d369e4669dafd36b53e create mode 100644 geo-cache/geoassign/objects/b5d35053afe942ac900e27058d2d02ac create mode 100644 geo-cache/geoassign/objects/b5ec07fd6ac74e04b91ea0835bca36f5 create mode 100644 geo-cache/geoassign/objects/b5fcc8cfdafc4ccc8de211e6e5322ef3 create mode 100644 geo-cache/geoassign/objects/b614ee65a7ff42f9883dc556e5e9a788 create mode 100644 geo-cache/geoassign/objects/b615f2e83dbb4053856a9a0fadd3aba8 create mode 100644 geo-cache/geoassign/objects/b616b951fb1d41ad84fad4be3b83b9a5 create mode 100644 geo-cache/geoassign/objects/b6201a739e1d4b94b9c6338d54d47f42 create mode 100644 geo-cache/geoassign/objects/b63b41861554467f9309ac7f70b26be5 create mode 100644 geo-cache/geoassign/objects/b647914f837d4caaa1ae9db03b76982a create mode 100644 geo-cache/geoassign/objects/b66fc4bf691e44c28c35a1bf48d9211e create mode 100644 geo-cache/geoassign/objects/b670445f6c6e4c46a94a3d54ddf053ca create mode 100644 geo-cache/geoassign/objects/b6731c151de14a70b6e126514611f121 create mode 100644 geo-cache/geoassign/objects/b6b10b47875845f483621ff864360b3e create mode 100644 geo-cache/geoassign/objects/b6b8e24316c84ac09f294221717969c5 create mode 100644 geo-cache/geoassign/objects/b6bb206c9e3e4f9bbc94fe06e4b56ffc create mode 100644 geo-cache/geoassign/objects/b6d4bc429677467bb66a6a09da2d83ba create mode 100644 geo-cache/geoassign/objects/b6e1d4c904eb4d6bb290a1321d8521b1 create mode 100644 geo-cache/geoassign/objects/b704bdf46d564e1b97999b71461e7ea8 create mode 100644 geo-cache/geoassign/objects/b70792f0f7484ec3a75c22f4f04d76d6 create mode 100644 geo-cache/geoassign/objects/b7097d6b30544999a0fb41face4263c6 create mode 100644 geo-cache/geoassign/objects/b71da72b746241c09cfcfca6acbf4389 create mode 100644 geo-cache/geoassign/objects/b72bd8b2781041c6a2e28129ba7aac1b create mode 100644 geo-cache/geoassign/objects/b7b78dbd3b95456c93975b7c1a569b1c create mode 100644 geo-cache/geoassign/objects/b7bf746b5d644f0594505dd5c04cd2f2 create mode 100644 geo-cache/geoassign/objects/b7dcdcd3f45448c3b842c952af1f2baa create mode 100644 geo-cache/geoassign/objects/b7f31823fd9f4615baffbc2a6427224c create mode 100644 geo-cache/geoassign/objects/b83cac91f881436aa0956c070cbd0332 create mode 100644 geo-cache/geoassign/objects/b84052d5db0942f69f154d3d03e72c25 create mode 100644 geo-cache/geoassign/objects/b84352d5cc744278b84bcc6dde11afb8 create mode 100644 geo-cache/geoassign/objects/b851d3119d11497b9683daf23906dd08 create mode 100644 geo-cache/geoassign/objects/b85580ae0ba94fa285a8127df38a2655 create mode 100644 geo-cache/geoassign/objects/b8672fec17fa4a08a7a8c66588a5f4fd create mode 100644 geo-cache/geoassign/objects/b86c28182db24e60858c4f54aa92919e create mode 100644 geo-cache/geoassign/objects/b872696f51194c6c8fb358cb30fab17b create mode 100644 geo-cache/geoassign/objects/b89ee0719ce84fb9abe0dda56d2398a7 create mode 100644 geo-cache/geoassign/objects/b8a9cd40a32d46b39283276f126de3af create mode 100644 geo-cache/geoassign/objects/b8c85d202e294f4bb36ed02f6eaa3ae4 create mode 100644 geo-cache/geoassign/objects/b8e03ddca73349c791838959ac006409 create mode 100644 geo-cache/geoassign/objects/b8e2c09b09e742778fbe1af56f61261e create mode 100644 geo-cache/geoassign/objects/b92e39bbaadf4628b75dacbcd0bdf8f0 create mode 100644 geo-cache/geoassign/objects/b957fd9ac80e4b2883f8438f1c474a1d create mode 100644 geo-cache/geoassign/objects/b9784c0b2b774f03bac37da8bed7536b create mode 100644 geo-cache/geoassign/objects/b99a2d90b109467a9cb1c571ead1ea30 create mode 100644 geo-cache/geoassign/objects/b9b09215cab44d5aaf9efd852b054b54 create mode 100644 geo-cache/geoassign/objects/b9d622416174454593b6adb2e0619333 create mode 100644 geo-cache/geoassign/objects/b9f442f5709b439e82f031d871d2e0e9 create mode 100644 geo-cache/geoassign/objects/b9f8c2b9548445488bef75682350b571 create mode 100644 geo-cache/geoassign/objects/ba17456c06d34f1fb0227757cb6c983b create mode 100644 geo-cache/geoassign/objects/ba1d56f9f30a4bfcbdeab0ebfc8c0bb2 create mode 100644 geo-cache/geoassign/objects/ba369c9042a046f78fa60a9b5c75ff1d create mode 100644 geo-cache/geoassign/objects/ba5e7f7fc6534cfd86c6efc99cf7a381 create mode 100644 geo-cache/geoassign/objects/ba64663a359b4c9dba8ea223c0c62d87 create mode 100644 geo-cache/geoassign/objects/ba688834b5d342bbb8f9d930d70bb549 create mode 100644 geo-cache/geoassign/objects/ba73e02af9434a519177134915e81614 create mode 100644 geo-cache/geoassign/objects/ba795e99b35448ecb586e5c94073a909 create mode 100644 geo-cache/geoassign/objects/ba862eb4214b410980fd068980d50bf7 create mode 100644 geo-cache/geoassign/objects/baab3c5fbca9488ea4aac97dbb58592f create mode 100644 geo-cache/geoassign/objects/bad5a8a812f54f5e8bf7865770fb2660 create mode 100644 geo-cache/geoassign/objects/baf9b5d048a34ab9bc76610fa6ea9614 create mode 100644 geo-cache/geoassign/objects/bb1cdfd43904483eac8013ea3f8371bc create mode 100644 geo-cache/geoassign/objects/bb56bb13c99a4aa6b1a8bdb81e2a85e9 create mode 100644 geo-cache/geoassign/objects/bb6e1f28ef144a51bdb7bf2324a5fa31 create mode 100644 geo-cache/geoassign/objects/bb928b3a4f094827ab3e9417975955de create mode 100644 geo-cache/geoassign/objects/bb9517e3414d4503a542fac41d585190 create mode 100644 geo-cache/geoassign/objects/bbeb3a44a7fc4e9ca6e72d1de0f312d1 create mode 100644 geo-cache/geoassign/objects/bbf5043600414341b213bb1b8b4a029b create mode 100644 geo-cache/geoassign/objects/bbfada755c5f432bbcb0737a477437ea create mode 100644 geo-cache/geoassign/objects/bbfd6ac73bb944969b57726c54ba70bb create mode 100644 geo-cache/geoassign/objects/bc05891c746249cca51b33b0293b0801 create mode 100644 geo-cache/geoassign/objects/bc23d6193b774293a7fa47ff9621bf4c create mode 100644 geo-cache/geoassign/objects/bc4eae5ea0364387b640a82aa48f2106 create mode 100644 geo-cache/geoassign/objects/bc6c718881b2417498ed11d9d33f7e08 create mode 100644 geo-cache/geoassign/objects/bc77c762f2534ee0bb23d2a7587c94f2 create mode 100644 geo-cache/geoassign/objects/bc788fd454cd46c9956877a25157bd4f create mode 100644 geo-cache/geoassign/objects/bc871989802340ada0bc088c59b65cf6 create mode 100644 geo-cache/geoassign/objects/bca35c968c754186a8bca97bf4b8837b create mode 100644 geo-cache/geoassign/objects/bcb55607230246d0a66502c081b158bb create mode 100644 geo-cache/geoassign/objects/bcca32d8eb7748e2b5ae6cbc21504f39 create mode 100644 geo-cache/geoassign/objects/bcea0bdcea8541e3910627746fc04283 create mode 100644 geo-cache/geoassign/objects/bcfc732fabd94e0e9bd61f3c73ea6815 create mode 100644 geo-cache/geoassign/objects/bd09e651b8424d44862df446e9f6f98d create mode 100644 geo-cache/geoassign/objects/bd1ffaab781a4324b78670270293206f create mode 100644 geo-cache/geoassign/objects/bd3c003d1c6244d98ae14c2aadfcc871 create mode 100644 geo-cache/geoassign/objects/bd50ab3cf8614a5fa113eb13e9a0c5ad create mode 100644 geo-cache/geoassign/objects/bd5d66940c3947c5a3648b31b9c7b9ed create mode 100644 geo-cache/geoassign/objects/bd73a89368bc40acb80f61c94ad8a4ce create mode 100644 geo-cache/geoassign/objects/bd7bf73c046046b48d0beddde8e23973 create mode 100644 geo-cache/geoassign/objects/bd901b077fae49a29bc5fe8597302164 create mode 100644 geo-cache/geoassign/objects/bdb628859c9e49ffae7b8e8e45bd83ba create mode 100644 geo-cache/geoassign/objects/bdd31c7c4b1a418e95b04e6df9595933 create mode 100644 geo-cache/geoassign/objects/be4ec7f2f8124986a51db97ffc17d1b7 create mode 100644 geo-cache/geoassign/objects/be89f9fc06c4461d8c5c61aabf59fcca create mode 100644 geo-cache/geoassign/objects/be9c4d19477646d1aa70c6633b7a8f41 create mode 100644 geo-cache/geoassign/objects/be9e96b9567d47af9148da89fbc403d6 create mode 100644 geo-cache/geoassign/objects/bebfb0aee2ec4be1891fed906cdaa83f create mode 100644 geo-cache/geoassign/objects/bec3884cb88d46409d2906c652075d74 create mode 100644 geo-cache/geoassign/objects/bedd061aaf7a425d8304325a770ac9ab create mode 100644 geo-cache/geoassign/objects/bf0965b28953485aa273404e4cbe4254 create mode 100644 geo-cache/geoassign/objects/bf15902d537a462c96bea44e76d6ba11 create mode 100644 geo-cache/geoassign/objects/bf2103025ec447209b56acc691dccb32 create mode 100644 geo-cache/geoassign/objects/bf2297ec7e7e4c73bead3efd180ccaab create mode 100644 geo-cache/geoassign/objects/bf58f12963bb42b489ebe92364961cdf create mode 100644 geo-cache/geoassign/objects/bf688d4bfc3e421d96dd50e3ed4a4b81 create mode 100644 geo-cache/geoassign/objects/bf70c66a6fee410b914e203190e5248d create mode 100644 geo-cache/geoassign/objects/bf898c5922f7450e88d345c8b6405442 create mode 100644 geo-cache/geoassign/objects/bf965ccca9474580a06a70afd80fc21e create mode 100644 geo-cache/geoassign/objects/bf9e2b56847b430b8a9f69c53f3a94f2 create mode 100644 geo-cache/geoassign/objects/bfcd95dcd700458ea64a5a84555b8624 create mode 100644 geo-cache/geoassign/objects/c05cf6f7d03b47e3bbb7b1c8b22a724f create mode 100644 geo-cache/geoassign/objects/c073169bf3e447e5b09c12393aa45c9b create mode 100644 geo-cache/geoassign/objects/c08232ee0c7b479e93a769b604bb8639 create mode 100644 geo-cache/geoassign/objects/c08bbe3a6c304bf4b4dc21d0e4ae1503 create mode 100644 geo-cache/geoassign/objects/c0954d5cb786478cb98b3af64c2ee8b6 create mode 100644 geo-cache/geoassign/objects/c0afd804ef6240afa9186a9053887d5c create mode 100644 geo-cache/geoassign/objects/c0b9f6da74db478c83a862b8e239be62 create mode 100644 geo-cache/geoassign/objects/c0c13c31fc8241c490e55536c8aa5177 create mode 100644 geo-cache/geoassign/objects/c0cefec590d2466ebd487490f353e814 create mode 100644 geo-cache/geoassign/objects/c0e5cc24e03b46698e1e8983365fd580 create mode 100644 geo-cache/geoassign/objects/c0ebab229cb54451917d46a5030257e0 create mode 100644 geo-cache/geoassign/objects/c0f0940f7134405a96fd72cfdd8e0eda create mode 100644 geo-cache/geoassign/objects/c10d08f1a34c4f05a5b56382e383b699 create mode 100644 geo-cache/geoassign/objects/c14a348d3e544751a42d7b08e53ca89b create mode 100644 geo-cache/geoassign/objects/c169cbf92460431fb8af4864560000a1 create mode 100644 geo-cache/geoassign/objects/c16ccfd4b88045aba3029c790c08fb40 create mode 100644 geo-cache/geoassign/objects/c19f5afc670a4dd6a1a082e2d3c15033 create mode 100644 geo-cache/geoassign/objects/c1a1201912fc47888ef68b38a5edd4d8 create mode 100644 geo-cache/geoassign/objects/c1a5ba9ae09242afbfd5db170bd94306 create mode 100644 geo-cache/geoassign/objects/c1af4d1efcbc4cf599238c85de30d780 create mode 100644 geo-cache/geoassign/objects/c1da20c055884857a822395cf5c2a38f create mode 100644 geo-cache/geoassign/objects/c1da216311d24bd88b926e557db34f86 create mode 100644 geo-cache/geoassign/objects/c1e6228e6bb84810855f05c58e2d94d2 create mode 100644 geo-cache/geoassign/objects/c2809bdacadc4cecaa76eb872393f1e7 create mode 100644 geo-cache/geoassign/objects/c2a5bd2bfb2c47e99bd7de962e25e695 create mode 100644 geo-cache/geoassign/objects/c2b685bcbe62421aba5140b8086d2437 create mode 100644 geo-cache/geoassign/objects/c2cb4c8e2d73498a897264c98dffa1d2 create mode 100644 geo-cache/geoassign/objects/c2ce3757269f4e6fa18307a98d84a67d create mode 100644 geo-cache/geoassign/objects/c2d42f6410474b6d9fe7140d1900a7f9 create mode 100644 geo-cache/geoassign/objects/c33717447c87456b9777aa64e1c8981e create mode 100644 geo-cache/geoassign/objects/c338868801d04503861e51de6c442d87 create mode 100644 geo-cache/geoassign/objects/c33e500db3644df9845d2a1975e6a9f1 create mode 100644 geo-cache/geoassign/objects/c386b775a7784060ab56f9dcc0af0743 create mode 100644 geo-cache/geoassign/objects/c39387426a6546fb81d413e1494182d1 create mode 100644 geo-cache/geoassign/objects/c3a0af09c31a4806b6397565d9b5d71b create mode 100644 geo-cache/geoassign/objects/c3b09784c4ee42eeaae7a964a31990b3 create mode 100644 geo-cache/geoassign/objects/c3cb16b1e3174d48a53c2810890510f7 create mode 100644 geo-cache/geoassign/objects/c3ccfd73254c4bad954de1596abfed82 create mode 100644 geo-cache/geoassign/objects/c3d09e6ab6874aca8cb08a45845f31dd create mode 100644 geo-cache/geoassign/objects/c40e81cce99d4661b0475e650a18990b create mode 100644 geo-cache/geoassign/objects/c4429da1846349789bf8161fa075de40 create mode 100644 geo-cache/geoassign/objects/c4440e4468de489aa246f76f4eb4ecf7 create mode 100644 geo-cache/geoassign/objects/c45d59bb83a64fbc9164810edf43c00b create mode 100644 geo-cache/geoassign/objects/c474e4861ed04be98ba64371d341edf8 create mode 100644 geo-cache/geoassign/objects/c4892ee10e0c42919c0a39824fbda934 create mode 100644 geo-cache/geoassign/objects/c49078b23b794014b7740a16330bbc3c create mode 100644 geo-cache/geoassign/objects/c4c93493b1bf446bac8c0d041436d418 create mode 100644 geo-cache/geoassign/objects/c4e7e9429980437dad2dd59291d85572 create mode 100644 geo-cache/geoassign/objects/c4f55f963ca34c9a90f1d08c3cc02677 create mode 100644 geo-cache/geoassign/objects/c4fa564ffde04b0cb3545c1454cc6bbb create mode 100644 geo-cache/geoassign/objects/c559aa8b296f43fd8dd638788c1de428 create mode 100644 geo-cache/geoassign/objects/c55e2567211545ae82b5795bc5e76336 create mode 100644 geo-cache/geoassign/objects/c5721361ba93452b8163943bce2ed241 create mode 100644 geo-cache/geoassign/objects/c5843a83bede44829a0e08d75665617a create mode 100644 geo-cache/geoassign/objects/c5c611af1bf64b9cac7fd0187f879814 create mode 100644 geo-cache/geoassign/objects/c5cd06c534ac4959a79f9069fb960cd9 create mode 100644 geo-cache/geoassign/objects/c5d6a897d5cc44a6a63ebfc40ad90a76 create mode 100644 geo-cache/geoassign/objects/c5defc8a4ae24824bd1abc72076d51e6 create mode 100644 geo-cache/geoassign/objects/c633024771014016ad11924f96d8015d create mode 100644 geo-cache/geoassign/objects/c635917e488c419ebb3d6e4d3a20d236 create mode 100644 geo-cache/geoassign/objects/c6393b476a014dc0822151ac0cb10ddd create mode 100644 geo-cache/geoassign/objects/c63e190ff42e4353a735e99724f70de1 create mode 100644 geo-cache/geoassign/objects/c652c5c64c9e428bbf22f7eef54476e9 create mode 100644 geo-cache/geoassign/objects/c660b27b20394967a9315eb46a9b073f create mode 100644 geo-cache/geoassign/objects/c666fb2dfcd04291b2cfc5a57a50b390 create mode 100644 geo-cache/geoassign/objects/c6a67da681fa4d17a5c321cef9ad2c24 create mode 100644 geo-cache/geoassign/objects/c6a6b97eb39b4935938699efd3b6b0ac create mode 100644 geo-cache/geoassign/objects/c6a795cffa424286821c26dac92c80cf create mode 100644 geo-cache/geoassign/objects/c6c23f333ce449b9ae048f44c87ccc17 create mode 100644 geo-cache/geoassign/objects/c6c6e129f76f4a06842844d21f39ac9c create mode 100644 geo-cache/geoassign/objects/c6c6fcb625974cb38790c1a1ddd68d0a create mode 100644 geo-cache/geoassign/objects/c6d11706790244cf9169a6d6c8f2986f create mode 100644 geo-cache/geoassign/objects/c6d1659e4ec645368ef3a6a58113338e create mode 100644 geo-cache/geoassign/objects/c6d45beeb5774df1bc823e3792989d36 create mode 100644 geo-cache/geoassign/objects/c6dccbaef3e94287a16cd14900d56099 create mode 100644 geo-cache/geoassign/objects/c6f4f61d9dde4d439b6eb43522328e00 create mode 100644 geo-cache/geoassign/objects/c6f869d61c2b4c038dfb239525df013b create mode 100644 geo-cache/geoassign/objects/c73ad75f935f4427a4447872b98792f4 create mode 100644 geo-cache/geoassign/objects/c73b8641562b414482e344c80f069c2a create mode 100644 geo-cache/geoassign/objects/c75a7b6708f346a7b4c59ddea3fd38b4 create mode 100644 geo-cache/geoassign/objects/c76c4a9eb81c49d58071916e5b57efc5 create mode 100644 geo-cache/geoassign/objects/c7ca5c85232348d8a7fc38b09bb3b60c create mode 100644 geo-cache/geoassign/objects/c7d65f5313f847c89b95e80e887e69aa create mode 100644 geo-cache/geoassign/objects/c7f07e58ff37486a83b772dcc5d1752c create mode 100644 geo-cache/geoassign/objects/c7f504a8083c43ea9a28357706893341 create mode 100644 geo-cache/geoassign/objects/c8161a7047624179ae8d3df58272f6e2 create mode 100644 geo-cache/geoassign/objects/c87ade8cd6d94e44a670e88027773531 create mode 100644 geo-cache/geoassign/objects/c87e0684ecda4f84ab47a109b2d2776f create mode 100644 geo-cache/geoassign/objects/c88ef5b6b2764d3ebd3b33890fd62dfc create mode 100644 geo-cache/geoassign/objects/c89298c1a28840df8bc2464b97a8dc6e create mode 100644 geo-cache/geoassign/objects/c89f8f72e1c84dc9b6b475345d51de7d create mode 100644 geo-cache/geoassign/objects/c8a82731824846fca6c2b90399509bfa create mode 100644 geo-cache/geoassign/objects/c8b547abf0ed49469f001db9dc1476ab create mode 100644 geo-cache/geoassign/objects/c8c3b404971847e4a153058a3d05924f create mode 100644 geo-cache/geoassign/objects/c8caf5c78efe471ba0db16716742afa0 create mode 100644 geo-cache/geoassign/objects/c90cd9ebfddc4556a7ffe133434bfe55 create mode 100644 geo-cache/geoassign/objects/c920d64f163342d29198fc59948f87a6 create mode 100644 geo-cache/geoassign/objects/c9289dfb4657463987319ad7fa25fb2e create mode 100644 geo-cache/geoassign/objects/c93e98f676a84b9983bb069e25e0a321 create mode 100644 geo-cache/geoassign/objects/c94abbd9fb7e47c58a8b44f70dd59a1d create mode 100644 geo-cache/geoassign/objects/c972bd5e5f964ba5b7636ab722fa8572 create mode 100644 geo-cache/geoassign/objects/c981e62add8142f78df140d9bc41d1ff create mode 100644 geo-cache/geoassign/objects/c9921a72098a4a56a31b83d0b4bd8c89 create mode 100644 geo-cache/geoassign/objects/c9a552874b8e4462b203befb991a2211 create mode 100644 geo-cache/geoassign/objects/c9bf7004fb0447efadead02011de4b10 create mode 100644 geo-cache/geoassign/objects/c9c09158085949f6836cb73e4e02e5cf create mode 100644 geo-cache/geoassign/objects/c9c5f92c447341fea4fdb0f820751c7e create mode 100644 geo-cache/geoassign/objects/c9eef62e56e6404f82abb8944400721e create mode 100644 geo-cache/geoassign/objects/ca35593042ac4c18b3d364478e491256 create mode 100644 geo-cache/geoassign/objects/ca3c2df9281a4c50b01a1bbf880d4acd create mode 100644 geo-cache/geoassign/objects/ca6788c2609b4c2b98b81c0c4778565f create mode 100644 geo-cache/geoassign/objects/caacd364720c40e6834bbe71c65f7928 create mode 100644 geo-cache/geoassign/objects/cac07b874f8e471b97e3ac5beedc47b1 create mode 100644 geo-cache/geoassign/objects/cac69d623f8b44cdac253a28f1d7aa21 create mode 100644 geo-cache/geoassign/objects/cad6a076a8af44d8a43c0136f5bf7c86 create mode 100644 geo-cache/geoassign/objects/caf7dc7948ff4d6c9c77895be32e09f2 create mode 100644 geo-cache/geoassign/objects/cb20699287474e0fb53ad28391095fe8 create mode 100644 geo-cache/geoassign/objects/cb29151a036c460db4f9ebff51aab1e9 create mode 100644 geo-cache/geoassign/objects/cb4a64deeeb44ea89c0367ace022d530 create mode 100644 geo-cache/geoassign/objects/cb7a3c33653f4d3194ecc24202221617 create mode 100644 geo-cache/geoassign/objects/cb7aa6913ae94bc8b0e99ddb6c1e2f75 create mode 100644 geo-cache/geoassign/objects/cba06b130af847a8bc657fb427392924 create mode 100644 geo-cache/geoassign/objects/cbac802919674bd0924fc1d9433c73fd create mode 100644 geo-cache/geoassign/objects/cbb41684adc64cfbb0d3fa292b08ebd3 create mode 100644 geo-cache/geoassign/objects/cbba7ca7d35c43e4928ba27842e77a0f create mode 100644 geo-cache/geoassign/objects/cbdcc0bccb4a45f4954a1063c95c3d98 create mode 100644 geo-cache/geoassign/objects/cbe894e2015f41b9bad3c5776407e38b create mode 100644 geo-cache/geoassign/objects/cbef6cbc86864af58a598babd8a7fc52 create mode 100644 geo-cache/geoassign/objects/cc193a33a8c34c9f8fd3569eed8ba1fb create mode 100644 geo-cache/geoassign/objects/cca2ca3721c34cb9bb0e1e0b19c4ba92 create mode 100644 geo-cache/geoassign/objects/ccb3f1ddddfa430f93b4958dddba4391 create mode 100644 geo-cache/geoassign/objects/ccd9f9de761c4a1888fc1cbafbc2066d create mode 100644 geo-cache/geoassign/objects/ccddf0001a2a43ccb50c6a14286e271f create mode 100644 geo-cache/geoassign/objects/cce1fc7c69064c60a4d01b150038cbd7 create mode 100644 geo-cache/geoassign/objects/cce42394bd224db89793ff25ee7d3eee create mode 100644 geo-cache/geoassign/objects/cd3912f44c0549fb8df3acb79fa21e08 create mode 100644 geo-cache/geoassign/objects/cd4eafa319464748a69e2b81e5d3dd76 create mode 100644 geo-cache/geoassign/objects/cd5870fec1934fbebd7f83803fd0e5b2 create mode 100644 geo-cache/geoassign/objects/cd6bfeaa6c754b3d92325fdd4cf3137a create mode 100644 geo-cache/geoassign/objects/cd993c218b5d47b38a0a05638458ed16 create mode 100644 geo-cache/geoassign/objects/cd9febf2c6244bc982952cd135099f3d create mode 100644 geo-cache/geoassign/objects/cda20e8bd8a24c1d9e2fbea43ad9d9eb create mode 100644 geo-cache/geoassign/objects/cdb33583a6e6460ab909c576afa4fae1 create mode 100644 geo-cache/geoassign/objects/cde37839904c45b6ae85810c31fe9a9a create mode 100644 geo-cache/geoassign/objects/cde8e8ac8f6d4a4c8a2d63a08fefea6b create mode 100644 geo-cache/geoassign/objects/ce0370f808544c0d8ea48d77ae0a62a1 create mode 100644 geo-cache/geoassign/objects/ce0998f1a4f049968c072e49f824e0d4 create mode 100644 geo-cache/geoassign/objects/ce11675458544479900177f00bade113 create mode 100644 geo-cache/geoassign/objects/ce30864d4ae54532a079a97c5bc555a7 create mode 100644 geo-cache/geoassign/objects/ce4100f7001d4a3498dea64cb527acfb create mode 100644 geo-cache/geoassign/objects/ce4a2c381fa3403f966cb509f67ce434 create mode 100644 geo-cache/geoassign/objects/ce59eeaf0cf44526ba339013ee7a71c0 create mode 100644 geo-cache/geoassign/objects/ce5d1048ccd24e3fbc0ecee6083b4697 create mode 100644 geo-cache/geoassign/objects/ce80d371deac4189b550973f85cfa88e create mode 100644 geo-cache/geoassign/objects/ce98b4a506ec49a69f3239f4877f6d8a create mode 100644 geo-cache/geoassign/objects/cee64beb861142faa80b7f0d83388cd4 create mode 100644 geo-cache/geoassign/objects/cf0f4e8145b7401092abeff69f402ab7 create mode 100644 geo-cache/geoassign/objects/cf2b13429b844658806a06237cb335f6 create mode 100644 geo-cache/geoassign/objects/cf37c618ae544253b25d4e14079ebfc8 create mode 100644 geo-cache/geoassign/objects/cf443f9b79fa49fc8cfc05940ac30969 create mode 100644 geo-cache/geoassign/objects/cf4d1ba5f0cc47edbc48f8b1573d7a9e create mode 100644 geo-cache/geoassign/objects/cf4fb5436cf445a097fdebfb57e2f3a8 create mode 100644 geo-cache/geoassign/objects/cf6bf87a472b488aa82a104d8aada99e create mode 100644 geo-cache/geoassign/objects/cf6fd8a8df5a42e4a1af6a870163a84a create mode 100644 geo-cache/geoassign/objects/cf746866f53b4ce58950455040daf0d4 create mode 100644 geo-cache/geoassign/objects/cf936faae10b402d8aaa2a5eccf43502 create mode 100644 geo-cache/geoassign/objects/cf98f4d62c6d4d65a913524ef0d41e2c create mode 100644 geo-cache/geoassign/objects/cfa660bd3a7a43c993fa8457eb5f4936 create mode 100644 geo-cache/geoassign/objects/cfabcd65dd7347499d6f4ca891cfec39 create mode 100644 geo-cache/geoassign/objects/cfcff95d60e2488a8575362a3dac90b8 create mode 100644 geo-cache/geoassign/objects/cfe5b963dce14080b9439db6f7506094 create mode 100644 geo-cache/geoassign/objects/cff36672487c4e1a83fe56614a2a03e9 create mode 100644 geo-cache/geoassign/objects/cff5a36196354f8da5fd39c30d732602 create mode 100644 geo-cache/geoassign/objects/cffa2d8e42644f7a9afe9cace51f370d create mode 100644 geo-cache/geoassign/objects/d012d541721a40d69116abdbcf0e91e9 create mode 100644 geo-cache/geoassign/objects/d0156f1e5cdc49219fa9d1ae257a1abe create mode 100644 geo-cache/geoassign/objects/d017ee5d5b70470c9e4039d655476f80 create mode 100644 geo-cache/geoassign/objects/d022168acb96426ba94e5bed7d5873bf create mode 100644 geo-cache/geoassign/objects/d0245d16d71c4d7e9d23359e7191b148 create mode 100644 geo-cache/geoassign/objects/d0325314024440888bbded5a772bd07e create mode 100644 geo-cache/geoassign/objects/d03960bd8c0a46798f6a0787a1ef4de7 create mode 100644 geo-cache/geoassign/objects/d040eb74ed0f49078d3ecb2c8809b33b create mode 100644 geo-cache/geoassign/objects/d053ade073134cc49e0307b5b345f5b6 create mode 100644 geo-cache/geoassign/objects/d079dec2a5794977a6f5b458862698e9 create mode 100644 geo-cache/geoassign/objects/d07c4f355c0743ab947e56d26f83c43d create mode 100644 geo-cache/geoassign/objects/d08ac24f185546e09b616e3b6dd941df create mode 100644 geo-cache/geoassign/objects/d09789500e6143e3bb70365c5f23b1ff create mode 100644 geo-cache/geoassign/objects/d0980c477300458d8e812bfae7c97408 create mode 100644 geo-cache/geoassign/objects/d0c30b394a9e417ab3d64b5b33e4d05d create mode 100644 geo-cache/geoassign/objects/d0dcd772d84d4dd6b23b96b06e2aee7a create mode 100644 geo-cache/geoassign/objects/d0e993208df3469faa8205fa951d2a90 create mode 100644 geo-cache/geoassign/objects/d0f86fc7045d415fadda72b1c1223389 create mode 100644 geo-cache/geoassign/objects/d10b238d3dc343a8af1c3db4f76e5e78 create mode 100644 geo-cache/geoassign/objects/d10c9263f51f488bb9739b3eeb93cfa2 create mode 100644 geo-cache/geoassign/objects/d11041eb29024003839ea81931a0430b create mode 100644 geo-cache/geoassign/objects/d120a637038e4cf59e645927da0f7465 create mode 100644 geo-cache/geoassign/objects/d135e9d9af2a4c42b22968663f2087e9 create mode 100644 geo-cache/geoassign/objects/d14963d65b3f4ae2b37012623634e3d8 create mode 100644 geo-cache/geoassign/objects/d156caf689cf443caba9562288b5f3be create mode 100644 geo-cache/geoassign/objects/d17b1930fe5d4d6e93bd4da956cbe44b create mode 100644 geo-cache/geoassign/objects/d1cf1e879ebf40b69ddc039df3f9eb37 create mode 100644 geo-cache/geoassign/objects/d1d51e6cbaf64853a7c1623954ecabb2 create mode 100644 geo-cache/geoassign/objects/d1f75239d9034fc1a2cc28141d4f6f13 create mode 100644 geo-cache/geoassign/objects/d20ba42db4c24dde99ba79ebdef2f0db create mode 100644 geo-cache/geoassign/objects/d20e510099f047df9e0ccb5a70105ff0 create mode 100644 geo-cache/geoassign/objects/d237c0c740854ce6b6e57609f58a4982 create mode 100644 geo-cache/geoassign/objects/d258fd6916a14dae90da41aa3f32a1fa create mode 100644 geo-cache/geoassign/objects/d26659b3308848238a8d82d67c6339cb create mode 100644 geo-cache/geoassign/objects/d2a63c33a8b0479ba0802529a94a6282 create mode 100644 geo-cache/geoassign/objects/d2a7c0dbfe6f49d18ba400119024657b create mode 100644 geo-cache/geoassign/objects/d2bb9d8ab47048f194274f733e8591c4 create mode 100644 geo-cache/geoassign/objects/d2cf31b801304663b27c83f715094a73 create mode 100644 geo-cache/geoassign/objects/d2edc97f25c84c778502c58ecff1eb9e create mode 100644 geo-cache/geoassign/objects/d2ff9d7d7d94470291930099a0b32fe9 create mode 100644 geo-cache/geoassign/objects/d31025cab88b44ae915efad77c77ea08 create mode 100644 geo-cache/geoassign/objects/d32f6b68c8d946efae62ae600c4c7e12 create mode 100644 geo-cache/geoassign/objects/d35f05c613f84fe9b5f4c6d012424e31 create mode 100644 geo-cache/geoassign/objects/d364601532c0496ca6038affaef63753 create mode 100644 geo-cache/geoassign/objects/d36ef04003a84d14a7ebf59766d4d2dd create mode 100644 geo-cache/geoassign/objects/d3773ae2f72c445ea33e78cc6ba23b1d create mode 100644 geo-cache/geoassign/objects/d38c6366a52047a1aaf364b32be99376 create mode 100644 geo-cache/geoassign/objects/d3c26c8d872d46468455f48d3ada222e create mode 100644 geo-cache/geoassign/objects/d4149eebcb0b474480530d0a44dff496 create mode 100644 geo-cache/geoassign/objects/d44b9be823cd4179a5381ec3e5425d4d create mode 100644 geo-cache/geoassign/objects/d45694f55e3040848b2022d25812b7b2 create mode 100644 geo-cache/geoassign/objects/d4695cf2ac2b41c9a4db027947107e14 create mode 100644 geo-cache/geoassign/objects/d47cee45c61c4e259dc6075b5962d5d5 create mode 100644 geo-cache/geoassign/objects/d48c28e55c454e8cb265bf471fd23796 create mode 100644 geo-cache/geoassign/objects/d49cc32a195e4cc096730cc783fc98a5 create mode 100644 geo-cache/geoassign/objects/d4aea1357eee4f8d90ff8f7cc15f8232 create mode 100644 geo-cache/geoassign/objects/d4bacd5d4b084316a4b157d2af8e78fa create mode 100644 geo-cache/geoassign/objects/d4beb8dc8e974e0d88366b4a238dc4e8 create mode 100644 geo-cache/geoassign/objects/d4c96f1462c94b0a875e796b48c70b20 create mode 100644 geo-cache/geoassign/objects/d4f270d50ec9417cb5e0dc05dadd4390 create mode 100644 geo-cache/geoassign/objects/d5135c4a31854e8c8125c5208d44f447 create mode 100644 geo-cache/geoassign/objects/d520b9be60714aaa9824768f097c103a create mode 100644 geo-cache/geoassign/objects/d566ff9ca9614e1eafee4e6c6d1fda95 create mode 100644 geo-cache/geoassign/objects/d56de29f1c4648828b5c35a7322c8afa create mode 100644 geo-cache/geoassign/objects/d5bd1fb592fa4c5fbd59b387564c23a5 create mode 100644 geo-cache/geoassign/objects/d5c302a293c2464eb2fd70c8f738fd32 create mode 100644 geo-cache/geoassign/objects/d5ea8580482d47c69eda30ccb98521a2 create mode 100644 geo-cache/geoassign/objects/d5f2df42af92445baf4568781990d0f9 create mode 100644 geo-cache/geoassign/objects/d5f50016a8ad4de9bcce833e0b8c83a0 create mode 100644 geo-cache/geoassign/objects/d6458214e4c8484ebf91ed9f7e3c516f create mode 100644 geo-cache/geoassign/objects/d645b611ef504054b89558920ed6932d create mode 100644 geo-cache/geoassign/objects/d652ae5f3b994dc99d68fca42e4e9a91 create mode 100644 geo-cache/geoassign/objects/d67d08827f924cf6a8abc9677eff4d64 create mode 100644 geo-cache/geoassign/objects/d694fd9c52de453bab1bc080ce10bdab create mode 100644 geo-cache/geoassign/objects/d6953598816e47df91890862f4aa0f2e create mode 100644 geo-cache/geoassign/objects/d69b8e1261704144b2ca3f8acb600da1 create mode 100644 geo-cache/geoassign/objects/d6e94dd280a04be380d4bae2076fc0b2 create mode 100644 geo-cache/geoassign/objects/d722a131b1e9490381e08fb7e33e7b20 create mode 100644 geo-cache/geoassign/objects/d74a6d935bd9418293c2b9694d781d00 create mode 100644 geo-cache/geoassign/objects/d75013923b334250886eac914e3a969d create mode 100644 geo-cache/geoassign/objects/d752e48f242545358f303ee8b99d8b71 create mode 100644 geo-cache/geoassign/objects/d75533dfbd69477c86214b6d4d27f569 create mode 100644 geo-cache/geoassign/objects/d75ff3fc98414e038bcf68be255761d6 create mode 100644 geo-cache/geoassign/objects/d760b214e4da4116b0ef80219b21d5eb create mode 100644 geo-cache/geoassign/objects/d76d404e86854e32887b067a7daa2a05 create mode 100644 geo-cache/geoassign/objects/d77117fb8b79439db44349ceb03134a7 create mode 100644 geo-cache/geoassign/objects/d77acd26b5b04dbc93ed16864943fdd4 create mode 100644 geo-cache/geoassign/objects/d7c75bd2fdc94053865172ffd47b77a0 create mode 100644 geo-cache/geoassign/objects/d7d24d9bb0ad475d8515f7c69bad2d67 create mode 100644 geo-cache/geoassign/objects/d7f62d1192f94c59a5fe7aaedaca26c2 create mode 100644 geo-cache/geoassign/objects/d820a97b1c514dc18bdad48c80dba84c create mode 100644 geo-cache/geoassign/objects/d82ec6e2c3b444a7b1d36b9031d35341 create mode 100644 geo-cache/geoassign/objects/d85b570bb2414276be21c7b9144f98d8 create mode 100644 geo-cache/geoassign/objects/d861c8ddc36d42ddbb07ce6a6be86f7e create mode 100644 geo-cache/geoassign/objects/d874ae892c3848fe959c1a14b6029de2 create mode 100644 geo-cache/geoassign/objects/d89fb5d4814b4d23ba815e331944b4f0 create mode 100644 geo-cache/geoassign/objects/d8a9e8dee46749ad99992351fa23c6ac create mode 100644 geo-cache/geoassign/objects/d8b4ee456c4642dd97c1b9761054b905 create mode 100644 geo-cache/geoassign/objects/d8c04f218e6f43deb1b26e2d0d07e3b9 create mode 100644 geo-cache/geoassign/objects/d8c256385f43438fa05b2cc8ee9cbd92 create mode 100644 geo-cache/geoassign/objects/d8caac38a62d49b0a481a59dbf22f210 create mode 100644 geo-cache/geoassign/objects/d8db8a6f7b31482da18c4a5a2f47f3b5 create mode 100644 geo-cache/geoassign/objects/d8f51283186349ee9a279f692ccf57d2 create mode 100644 geo-cache/geoassign/objects/d95be542f6dd451da70991bb6671d754 create mode 100644 geo-cache/geoassign/objects/d960eded9a5a4ae2ac3fd2be43b31b79 create mode 100644 geo-cache/geoassign/objects/d97158f11eb24df4bddaebe15be8cde6 create mode 100644 geo-cache/geoassign/objects/d9c5452fbcfb48f9a9efff7893f6f97c create mode 100644 geo-cache/geoassign/objects/d9c689f09e6443adbfa1316ceff95388 create mode 100644 geo-cache/geoassign/objects/d9db15c93b3844a9b36a009dde2dde8a create mode 100644 geo-cache/geoassign/objects/d9ecf75171994befae6699e6de9ca62e create mode 100644 geo-cache/geoassign/objects/da0ca755f87a435f9e7e2f8efd633f00 create mode 100644 geo-cache/geoassign/objects/da236c6ac5204847af5147778eebac0e create mode 100644 geo-cache/geoassign/objects/da2f85687fc5411da33a6deb37212bd2 create mode 100644 geo-cache/geoassign/objects/da4ada1c4ea043109b9f852b7a4d571e create mode 100644 geo-cache/geoassign/objects/da53532bb8504136972f87cdc3f04855 create mode 100644 geo-cache/geoassign/objects/da62b97602884e9baef8f57be7960340 create mode 100644 geo-cache/geoassign/objects/da98e9bafb7a4033ad7a3e49d2cee4d8 create mode 100644 geo-cache/geoassign/objects/da9f4f50d8004a1597b6813638c95bb4 create mode 100644 geo-cache/geoassign/objects/dad5e1c27b10498ea0a1e28f6c172888 create mode 100644 geo-cache/geoassign/objects/db0368240b55454f9a8d2f5ffe81a874 create mode 100644 geo-cache/geoassign/objects/db16d9dfec914626acf5657468624a66 create mode 100644 geo-cache/geoassign/objects/db20ce6748fc4bdfad60a007507b41c4 create mode 100644 geo-cache/geoassign/objects/db4ef7ba68604ec5acb16b22735c9d48 create mode 100644 geo-cache/geoassign/objects/db79ab585ef44c49a462fd776bc6809b create mode 100644 geo-cache/geoassign/objects/db7ff5aba3724fc699f3deafc6d9d71b create mode 100644 geo-cache/geoassign/objects/db99877de11546079f28a920c46fa96c create mode 100644 geo-cache/geoassign/objects/dba562771076449c859542109a3a89f4 create mode 100644 geo-cache/geoassign/objects/dbb50592c95a4751acb3642050265741 create mode 100644 geo-cache/geoassign/objects/dbb5d5c1e2db4a318238ded1e24c3030 create mode 100644 geo-cache/geoassign/objects/dbba277dcd164a32bc140d859efb74eb create mode 100644 geo-cache/geoassign/objects/dbe5360713fa48b192f16df5e6186ad6 create mode 100644 geo-cache/geoassign/objects/dbefb553378143d2bbfa080fe79c358a create mode 100644 geo-cache/geoassign/objects/dc006d676660468aa8aa10852319df8e create mode 100644 geo-cache/geoassign/objects/dc514ee605e046148047af77df149d8d create mode 100644 geo-cache/geoassign/objects/dc638acdcc25499c9ebecb198d991814 create mode 100644 geo-cache/geoassign/objects/dc85e56c06694939a0f7a5cd29a8cf4b create mode 100644 geo-cache/geoassign/objects/dcaaea62b25240c9ae68aeff281eb496 create mode 100644 geo-cache/geoassign/objects/dcc0852c13c74efcb29d5441ccc4a732 create mode 100644 geo-cache/geoassign/objects/dcd5971285cf447b84e5f10fe8fe3e50 create mode 100644 geo-cache/geoassign/objects/dd1a9f3ec48b44ccb0ef6fa4176575ac create mode 100644 geo-cache/geoassign/objects/dd1ceadf15f249b18d89f54aa8569027 create mode 100644 geo-cache/geoassign/objects/dd1efa34a3624f7db8d2379f2bf71b8e create mode 100644 geo-cache/geoassign/objects/dd30765ab5b84e7aac488d05b2d62613 create mode 100644 geo-cache/geoassign/objects/dd543c89ebb14b9d92bc507caa98cdb7 create mode 100644 geo-cache/geoassign/objects/dd7870d4d09246a682e802c8bfa40d97 create mode 100644 geo-cache/geoassign/objects/dd7eb8f6d87140bc94fc80a5f6195008 create mode 100644 geo-cache/geoassign/objects/dd909a69626040f3b9cb83163a7918b6 create mode 100644 geo-cache/geoassign/objects/dd9b0722acf2413a9f21a15e613e6f77 create mode 100644 geo-cache/geoassign/objects/ddad6409180e43caa8acf26104fe2394 create mode 100644 geo-cache/geoassign/objects/ddcaf6362e1a45ab9a22b7b0ff79c072 create mode 100644 geo-cache/geoassign/objects/ddcc40723f304cd988959ea3151fb3f2 create mode 100644 geo-cache/geoassign/objects/ddd19a87237f4acf84d5522aa460a144 create mode 100644 geo-cache/geoassign/objects/ddddece2170641728c9dfdd49105d351 create mode 100644 geo-cache/geoassign/objects/ddf8eb57d9874f6cab80c25104036ef6 create mode 100644 geo-cache/geoassign/objects/de300fac9acb43f38cf3b4dfdb11ab1d create mode 100644 geo-cache/geoassign/objects/de4441cc63a9480aa999c634e80be2dd create mode 100644 geo-cache/geoassign/objects/de9ea941c3df43389fd5526f84a766ce create mode 100644 geo-cache/geoassign/objects/deb5009a07584fb6858522cc1a4702f3 create mode 100644 geo-cache/geoassign/objects/defc79571a0f42809933ecd16ba9e6ba create mode 100644 geo-cache/geoassign/objects/df0d28ff915d47969735248329805f61 create mode 100644 geo-cache/geoassign/objects/df167cb0447745adb7ea8180d479de96 create mode 100644 geo-cache/geoassign/objects/df1a9cf57bea4390b6a7396389e84969 create mode 100644 geo-cache/geoassign/objects/df2feca9563148d78305df1b5d6d96bd create mode 100644 geo-cache/geoassign/objects/df6178a95c3b4ae2aa7762340d605d7c create mode 100644 geo-cache/geoassign/objects/df886110723b4873aa3e08a540867490 create mode 100644 geo-cache/geoassign/objects/df8b8375ad7c492e9db73b228410ad3a create mode 100644 geo-cache/geoassign/objects/df8c3ea403ba40e097bbeefa151072af create mode 100644 geo-cache/geoassign/objects/dfc7e47cdc8e402fb48a6c3c7d208b53 create mode 100644 geo-cache/geoassign/objects/dfccbe711cba40e9ba111b448210aae8 create mode 100644 geo-cache/geoassign/objects/e034318dc544487baaf5fd021326c710 create mode 100644 geo-cache/geoassign/objects/e035916d1e5e4d33a9f0a3d694efc473 create mode 100644 geo-cache/geoassign/objects/e060a31b4c174a57a4fe5f47ca7b815b create mode 100644 geo-cache/geoassign/objects/e06b9bd564584251b56bddf34e646d53 create mode 100644 geo-cache/geoassign/objects/e071638267f64ed5a076992fb10efea6 create mode 100644 geo-cache/geoassign/objects/e09d0a93242649e3a39a282b036a85f9 create mode 100644 geo-cache/geoassign/objects/e0ed39f1d971442b8f159fb5c50a613a create mode 100644 geo-cache/geoassign/objects/e110bff3ad1646a18a6f056aa77873cd create mode 100644 geo-cache/geoassign/objects/e119bc78b832401ba99a86ed5006199b create mode 100644 geo-cache/geoassign/objects/e1200cb943d54e5f86800f1a480e74e9 create mode 100644 geo-cache/geoassign/objects/e12aef2ba57c44b0ba19d39d0a92ce32 create mode 100644 geo-cache/geoassign/objects/e134cf492f2e4d7081f36317505e0435 create mode 100644 geo-cache/geoassign/objects/e14304cfef2b4e3881cf7dca5d0c57e2 create mode 100644 geo-cache/geoassign/objects/e165f9ff42634ba89d9600d17c17b214 create mode 100644 geo-cache/geoassign/objects/e16e8946718f4e13878654b42a1e6df8 create mode 100644 geo-cache/geoassign/objects/e1839c0b16174727a6cdd55819bd46fa create mode 100644 geo-cache/geoassign/objects/e18b42344fcf4ca38dfa1d9f9e1ba5c2 create mode 100644 geo-cache/geoassign/objects/e1c4ef2bb0f04c5486afa9f41ec745ee create mode 100644 geo-cache/geoassign/objects/e1d685b02ddd4e17a0a39ff3ef26bf16 create mode 100644 geo-cache/geoassign/objects/e1ddaac37b5e4e2f92a6fde98593d89d create mode 100644 geo-cache/geoassign/objects/e1f428d2bc334e8787e3adcc02378ca9 create mode 100644 geo-cache/geoassign/objects/e25b9d6c6db64b698c20ec8fb1643402 create mode 100644 geo-cache/geoassign/objects/e264de774070417caac9196f8725046e create mode 100644 geo-cache/geoassign/objects/e28414ea5a5b4d70b3f04427e05e9080 create mode 100644 geo-cache/geoassign/objects/e2a0da1b1b8c4eedb1742339057b9278 create mode 100644 geo-cache/geoassign/objects/e2ac698917654288a2d152b22a679ec7 create mode 100644 geo-cache/geoassign/objects/e2b938ad534040a5b4b8dd948d5d63fd create mode 100644 geo-cache/geoassign/objects/e2eddd6f0ab643ea9cce1bdf88b600d3 create mode 100644 geo-cache/geoassign/objects/e365cf2c0660404a9727341c375228c8 create mode 100644 geo-cache/geoassign/objects/e3765490fce1406085e491e60fcc8f92 create mode 100644 geo-cache/geoassign/objects/e3912da2c4334a3da5c91a32b6c423cf create mode 100644 geo-cache/geoassign/objects/e3bb21a3e74b4d6a9daa9575e6be2267 create mode 100644 geo-cache/geoassign/objects/e3e7acce38a540319eb82aa30a9dd482 create mode 100644 geo-cache/geoassign/objects/e413c7ced26a44af985a9b7aad865cee create mode 100644 geo-cache/geoassign/objects/e44775b86a064196a2ca397740991b53 create mode 100644 geo-cache/geoassign/objects/e4699d0584484af1962ac254d80d7e65 create mode 100644 geo-cache/geoassign/objects/e480714321ea458d9dd43ff808460334 create mode 100644 geo-cache/geoassign/objects/e4b81d3c8fcd48dba738023ed6fe0928 create mode 100644 geo-cache/geoassign/objects/e4dc576a5c6148cbb4cb23ee2b7c509b create mode 100644 geo-cache/geoassign/objects/e4f60a1783354b2689a52b421df80263 create mode 100644 geo-cache/geoassign/objects/e51483023f2a452a961a109719806aa2 create mode 100644 geo-cache/geoassign/objects/e58a7e5bcefd4e1ab9d08d6d676bfc5e create mode 100644 geo-cache/geoassign/objects/e5cec2ad2b16456b847bc3dc7358d08f create mode 100644 geo-cache/geoassign/objects/e5d4385291f948c39698f9d7b328afce create mode 100644 geo-cache/geoassign/objects/e639ceba5a6b4b9dafa38fc2955ed2f0 create mode 100644 geo-cache/geoassign/objects/e648078d050d4ee791c194e70682f3ef create mode 100644 geo-cache/geoassign/objects/e65b58f22d7d4a66a3ad3959a371e9b5 create mode 100644 geo-cache/geoassign/objects/e66dcf40a1e74c05a54132cf4054d767 create mode 100644 geo-cache/geoassign/objects/e677632c42814f04ad0bd1c8852bc9c1 create mode 100644 geo-cache/geoassign/objects/e68f40d53fdb4d82a1d6ca2edcb83024 create mode 100644 geo-cache/geoassign/objects/e6cc14f51b534b1d8355b421ca41754d create mode 100644 geo-cache/geoassign/objects/e6d01cad3d544c94acd7d6f682182675 create mode 100644 geo-cache/geoassign/objects/e6e5032b83bb44d394af0be44e8f2ff0 create mode 100644 geo-cache/geoassign/objects/e70cc7b5d3a84b91997a51d334434297 create mode 100644 geo-cache/geoassign/objects/e72421cc90014540ae711057994676d6 create mode 100644 geo-cache/geoassign/objects/e78e8ed23c4845f4a413879d64ddafb6 create mode 100644 geo-cache/geoassign/objects/e79e9db79cdd4d77a3dfd8cf26eb95da create mode 100644 geo-cache/geoassign/objects/e7a75886270148b6801a74f99db6bcc5 create mode 100644 geo-cache/geoassign/objects/e7b16d5e37a04be9970dbbeb531831b3 create mode 100644 geo-cache/geoassign/objects/e7b6c2e790154654bcfd567809bb2126 create mode 100644 geo-cache/geoassign/objects/e7cd02e088ec47f48b656d81b94c48aa create mode 100644 geo-cache/geoassign/objects/e822ab42d0c74278b4acf3b6ba9ebd3b create mode 100644 geo-cache/geoassign/objects/e84608f5ebb140a4a795d6dfc155519d create mode 100644 geo-cache/geoassign/objects/e85402e38020448f8cd655e4e8aa038d create mode 100644 geo-cache/geoassign/objects/e8569cc75e834351b2bd644d7a726b75 create mode 100644 geo-cache/geoassign/objects/e85e81ef4dd1474c9c0fe5e36fbef11a create mode 100644 geo-cache/geoassign/objects/e87d3a13f5704e3a9817cc2af01bfe07 create mode 100644 geo-cache/geoassign/objects/e89e16c9f39344a2b6af222e2cd4a957 create mode 100644 geo-cache/geoassign/objects/e8a9854a509b43d5af051cd57ef00ee9 create mode 100644 geo-cache/geoassign/objects/e8c6ffdec1224ccc9bcd568a14c79d80 create mode 100644 geo-cache/geoassign/objects/e8d12031cd19490f828143c34dae3ab3 create mode 100644 geo-cache/geoassign/objects/e8ddd2026c7647e68072b2cecf576224 create mode 100644 geo-cache/geoassign/objects/e938411c203d4c9fbc94da544a7e37e0 create mode 100644 geo-cache/geoassign/objects/e99171b5187f4c63b58a77a1d79f4b4b create mode 100644 geo-cache/geoassign/objects/e9ab844542144466a188902485fa6698 create mode 100644 geo-cache/geoassign/objects/e9b14206c76a49598cbf986294f6c45e create mode 100644 geo-cache/geoassign/objects/e9f7adb555c1429c8ca222061da54864 create mode 100644 geo-cache/geoassign/objects/e9f830ba548d465a895e8a6e165fcbee create mode 100644 geo-cache/geoassign/objects/ea15a4e7051044f98361e4f29d1ad23d create mode 100644 geo-cache/geoassign/objects/ea496daa435a4a44abb106c95e86aba5 create mode 100644 geo-cache/geoassign/objects/ea5b8393a0d1444f8ab741f1f9717d93 create mode 100644 geo-cache/geoassign/objects/ea5d8607a3484e5894860a77b5927d0e create mode 100644 geo-cache/geoassign/objects/ea6a86ee1e87410990206e2559b66539 create mode 100644 geo-cache/geoassign/objects/ea92dfbba36f4d768b5429630b53bfa3 create mode 100644 geo-cache/geoassign/objects/ea9f0c4987724d4295705798d34f4063 create mode 100644 geo-cache/geoassign/objects/eafe32ef33eb4aee9d1b273aff2bd533 create mode 100644 geo-cache/geoassign/objects/eb28e1dae62348ce9febecdc8ba9c94b create mode 100644 geo-cache/geoassign/objects/eb2e64e88e07440fa887054a4be8ddb8 create mode 100644 geo-cache/geoassign/objects/eb34841ef1174ce888c795ee0c688f06 create mode 100644 geo-cache/geoassign/objects/eb36ce05b8ad4dd3bf7c4a03d8c511f8 create mode 100644 geo-cache/geoassign/objects/eb420594c778451ba279046760054049 create mode 100644 geo-cache/geoassign/objects/eb4726613b39496892ad298bc0a555c7 create mode 100644 geo-cache/geoassign/objects/eb542d1562ae41a79d4d9d7a08ac5e67 create mode 100644 geo-cache/geoassign/objects/eb87c79fb7d34d64b7123adce48b10a1 create mode 100644 geo-cache/geoassign/objects/eb8edb45315b46deb99dd6db1018cd9c create mode 100644 geo-cache/geoassign/objects/eba280afc3fd4b928fcb8c4d3a58c838 create mode 100644 geo-cache/geoassign/objects/eba54ca07ce64063a976c30e53df647c create mode 100644 geo-cache/geoassign/objects/ebbae898121b4b6790833f598b8d5442 create mode 100644 geo-cache/geoassign/objects/ec09c8b2f3064d28adcbd1e05777bf48 create mode 100644 geo-cache/geoassign/objects/ec0b034357994cc2b06bca043938877d create mode 100644 geo-cache/geoassign/objects/ec4a4ee35234416bac71e4fc8da016a4 create mode 100644 geo-cache/geoassign/objects/ec6cbb7ec7b84b7c8b87f71ab1079dd8 create mode 100644 geo-cache/geoassign/objects/ec7b51a0302d4efa85a55e06c4ce043f create mode 100644 geo-cache/geoassign/objects/ec991771dcb2445081fe6aa091036fe3 create mode 100644 geo-cache/geoassign/objects/ecb2c3eef88d4d2495d5049eb4251e83 create mode 100644 geo-cache/geoassign/objects/ecba76821ac84108bc158d1b7fd81814 create mode 100644 geo-cache/geoassign/objects/eccb6c09a6894d608cbc6c99b747d1bf create mode 100644 geo-cache/geoassign/objects/ecce85d43fea4273ba94f2ae0e066ea6 create mode 100644 geo-cache/geoassign/objects/ecd90c7589f044f3bc016177b44bcbbb create mode 100644 geo-cache/geoassign/objects/ecfea76d47274ae183d37186b8a370c6 create mode 100644 geo-cache/geoassign/objects/ed0a6b891c2f44df81520634e5dfcf32 create mode 100644 geo-cache/geoassign/objects/ed3ce1d19af64d5b958725b71e01b8a8 create mode 100644 geo-cache/geoassign/objects/ed46adf356284041a0fc023e0238acbb create mode 100644 geo-cache/geoassign/objects/ed4a6276cdc44f03bfcb9e63c02b5a3b create mode 100644 geo-cache/geoassign/objects/ed6879adf7254da0ac3d0689b32632fa create mode 100644 geo-cache/geoassign/objects/ed8ad0c09cfd41209ef22656863ca870 create mode 100644 geo-cache/geoassign/objects/ed9a16d83d204865a76b27336e58a78d create mode 100644 geo-cache/geoassign/objects/ed9bcf6a210d4352976aabc97a7503e6 create mode 100644 geo-cache/geoassign/objects/edab2f15f2cc469aada3aaf15e5770a0 create mode 100644 geo-cache/geoassign/objects/edaccfe1662a410cb1d8099cf619f17c create mode 100644 geo-cache/geoassign/objects/edb5cd56daad4c59bf4ac4e3a266e0be create mode 100644 geo-cache/geoassign/objects/edcb30dbd9f44153a7ab9ea1f28a662f create mode 100644 geo-cache/geoassign/objects/edd6c594dd494f9b99a34d8551902f51 create mode 100644 geo-cache/geoassign/objects/ee57b1a54bf14a23b0197e4c281c62be create mode 100644 geo-cache/geoassign/objects/ee677397bb2c47268e80bf3504a8e4ed create mode 100644 geo-cache/geoassign/objects/ee6b8c1601794a0b9bd244204b701be9 create mode 100644 geo-cache/geoassign/objects/ee6e51ae4a81444b83734ce8e84850d5 create mode 100644 geo-cache/geoassign/objects/ee7a9aa4b3e94d88a89e7d94b7f8552b create mode 100644 geo-cache/geoassign/objects/eeae7251a25349f8aae175f931ad22e8 create mode 100644 geo-cache/geoassign/objects/eecd63ecdb054ad48290103c5784e012 create mode 100644 geo-cache/geoassign/objects/eef1f6187c2a4f36bb86777581e996a0 create mode 100644 geo-cache/geoassign/objects/ef052509f61e498b9c6974db8cd4fde6 create mode 100644 geo-cache/geoassign/objects/ef4584e24d724267aa62c9db21931574 create mode 100644 geo-cache/geoassign/objects/efc1f2dbf1e345ba863189ef54e1c6a6 create mode 100644 geo-cache/geoassign/objects/efc8557b2edc4e418f9fa9364ba0ea4b create mode 100644 geo-cache/geoassign/objects/f04cd1a26ae84001a79d2e35cabe2270 create mode 100644 geo-cache/geoassign/objects/f05aef91cc6e4c0aba8f49da7a77668e create mode 100644 geo-cache/geoassign/objects/f05e374411f44fa7be0ec6a137a97b2e create mode 100644 geo-cache/geoassign/objects/f073354cbb4049f99ef0e700a97a6e39 create mode 100644 geo-cache/geoassign/objects/f080f26c802341a0986123c7c0a1b662 create mode 100644 geo-cache/geoassign/objects/f09d8cb734844be1b854b5e33e397a86 create mode 100644 geo-cache/geoassign/objects/f0a6835787044a709f989262eec78159 create mode 100644 geo-cache/geoassign/objects/f0d93ad3810b4b41a9a7f678227c4fc7 create mode 100644 geo-cache/geoassign/objects/f0eba872ad4d4748a00b409aa6672822 create mode 100644 geo-cache/geoassign/objects/f106415d5af44645b85c271f7e43e8cc create mode 100644 geo-cache/geoassign/objects/f1180824934b40c49003c4706cb96d91 create mode 100644 geo-cache/geoassign/objects/f13d029db128456c82505ec7f271b143 create mode 100644 geo-cache/geoassign/objects/f166b376ddb445b2bffcc88e7a96b427 create mode 100644 geo-cache/geoassign/objects/f1858c3d371148eab33e010136b58c27 create mode 100644 geo-cache/geoassign/objects/f19e154839c04cf1974081a09dab0ae8 create mode 100644 geo-cache/geoassign/objects/f1a359fba43b479b9f759bcc016e966d create mode 100644 geo-cache/geoassign/objects/f1c0676e017847619cbdce2935e3475f create mode 100644 geo-cache/geoassign/objects/f1cda069b424421f9a326ea8f92111de create mode 100644 geo-cache/geoassign/objects/f1e81826b3a54448a99c3b70f9971281 create mode 100644 geo-cache/geoassign/objects/f1fc132503724287b415af81b3e5f724 create mode 100644 geo-cache/geoassign/objects/f21127e919af4705925c4417e6398fd8 create mode 100644 geo-cache/geoassign/objects/f227796b21844ce2b3eee475c14c270e create mode 100644 geo-cache/geoassign/objects/f255eac093664548aefaed3a79f4e96b create mode 100644 geo-cache/geoassign/objects/f27c8606e9c14c1a914c77ea47eaca43 create mode 100644 geo-cache/geoassign/objects/f282368d4f0f46438c975f12def95111 create mode 100644 geo-cache/geoassign/objects/f289062e72f347bf98ec254d02779d83 create mode 100644 geo-cache/geoassign/objects/f295014901734e34ba8f8dd8e9bdff80 create mode 100644 geo-cache/geoassign/objects/f29533c7cbcd4721b7b665cd60d98322 create mode 100644 geo-cache/geoassign/objects/f2dfcae75c6e41108e9f85ed3259b562 create mode 100644 geo-cache/geoassign/objects/f2e9eea7c1b74c049b64c27a4135e18d create mode 100644 geo-cache/geoassign/objects/f30478d924e345c8bbb30084b058c6b8 create mode 100644 geo-cache/geoassign/objects/f30de1c9f9844e1abbc006ac96d09792 create mode 100644 geo-cache/geoassign/objects/f330a0c6a955409984747644c83ef2b2 create mode 100644 geo-cache/geoassign/objects/f36f229dd14e490c8d1ecc190f6fa55d create mode 100644 geo-cache/geoassign/objects/f39140e161b04774980f98ee3b12488d create mode 100644 geo-cache/geoassign/objects/f391601121cc40c2b3219498cf193875 create mode 100644 geo-cache/geoassign/objects/f3ba6e606e50464eb0455e7072d2c86c create mode 100644 geo-cache/geoassign/objects/f3c92fff8d264332b9c5a93f9051fc56 create mode 100644 geo-cache/geoassign/objects/f3d402f52f3648749f1c752bbfcc3c61 create mode 100644 geo-cache/geoassign/objects/f3d7e16af4064bbe934314060c234cce create mode 100644 geo-cache/geoassign/objects/f3e9f0482f88489ab0aaf6d83c2bb02f create mode 100644 geo-cache/geoassign/objects/f401ab0e17a349df9836c936dbd41629 create mode 100644 geo-cache/geoassign/objects/f45a84219f794712afe92299acaae6dd create mode 100644 geo-cache/geoassign/objects/f4667a963a544b198c050d1c581b3367 create mode 100644 geo-cache/geoassign/objects/f46bc1980b444ccbbd2ab887a3e8a571 create mode 100644 geo-cache/geoassign/objects/f472c130ef2842bcb30080f1f9ade83d create mode 100644 geo-cache/geoassign/objects/f4836083dc484e9692250824a7d9f2f1 create mode 100644 geo-cache/geoassign/objects/f48e4398458947e29478789e9c0ceda1 create mode 100644 geo-cache/geoassign/objects/f4ec6ec175f547ebb4cea81c68fe037b create mode 100644 geo-cache/geoassign/objects/f4ee16e24d0c4406afa3ac7627c551b1 create mode 100644 geo-cache/geoassign/objects/f4f3c2d8054e432d813adfbd5535b935 create mode 100644 geo-cache/geoassign/objects/f4fbac1901504a0a93bee0e149a6f2e7 create mode 100644 geo-cache/geoassign/objects/f4fd222b8a624ef2be3dab67f1153146 create mode 100644 geo-cache/geoassign/objects/f5318290b8f644e0a4fc5b1154e4318a create mode 100644 geo-cache/geoassign/objects/f539c0e39f8747e483a993ada4b1355b create mode 100644 geo-cache/geoassign/objects/f54306190a854b338378f92d14322d7f create mode 100644 geo-cache/geoassign/objects/f5515505be1641a0b39383ec80a7c329 create mode 100644 geo-cache/geoassign/objects/f551f2fb26ce45a991cfb1a9a3c013be create mode 100644 geo-cache/geoassign/objects/f569d22811054cfeaa4edf075affe5ba create mode 100644 geo-cache/geoassign/objects/f57e58e0ad5a4bb095d1ea6bbf8ce644 create mode 100644 geo-cache/geoassign/objects/f57f7919c689452a96f3a42f44eae182 create mode 100644 geo-cache/geoassign/objects/f58b1fc2d48440619a3ead210678b2df create mode 100644 geo-cache/geoassign/objects/f5a7f7afbdf14e719ba7fe4bd3a84486 create mode 100644 geo-cache/geoassign/objects/f5b43ac207f349ac83e44790d8f3db08 create mode 100644 geo-cache/geoassign/objects/f5c19f04188549c6a3b61317908dcbb0 create mode 100644 geo-cache/geoassign/objects/f5e58520dac14f689ad05ceb5e7c809c create mode 100644 geo-cache/geoassign/objects/f5e5f32313d842ee86aae31d3cf0b698 create mode 100644 geo-cache/geoassign/objects/f5eefddd2a024cef985e785b19d7607d create mode 100644 geo-cache/geoassign/objects/f5f79df9fabf4e9fbf2d20dfb42ba85e create mode 100644 geo-cache/geoassign/objects/f60ffe2362344c199ae5d462e769b8ce create mode 100644 geo-cache/geoassign/objects/f613db790a184e6f8829964a6b07a8d8 create mode 100644 geo-cache/geoassign/objects/f64f3317a42b4eddb7b4e5503d101f62 create mode 100644 geo-cache/geoassign/objects/f668e1295e5f4a96b4a8cc4bbba969e4 create mode 100644 geo-cache/geoassign/objects/f671a21777174c94b0f5dcd2479b8ef1 create mode 100644 geo-cache/geoassign/objects/f67b0dc0cef44987b6f0d4ddbe95f667 create mode 100644 geo-cache/geoassign/objects/f689035ebadb4610a57ce0a0dbea8a4c create mode 100644 geo-cache/geoassign/objects/f6bc171560f64a40813be1bdf7f52165 create mode 100644 geo-cache/geoassign/objects/f6c8d0c73f164c24893e4b1b324b2d70 create mode 100644 geo-cache/geoassign/objects/f6d24dc936204b679c4a03f49bf3095d create mode 100644 geo-cache/geoassign/objects/f6d679c65c3c4abc8d81a6e5eda22db6 create mode 100644 geo-cache/geoassign/objects/f70e03272e8d42b08b12d191fc81b863 create mode 100644 geo-cache/geoassign/objects/f73f3b7b01074a4f86064bb42dab1539 create mode 100644 geo-cache/geoassign/objects/f7472138d3f64fcaa8c8384417e71aa4 create mode 100644 geo-cache/geoassign/objects/f748a1d31f34426f97cda5ae9cd70df9 create mode 100644 geo-cache/geoassign/objects/f75b3763d1614a408dd11742dc8f6b3b create mode 100644 geo-cache/geoassign/objects/f76de825e6174b8dacf379c2ea6a3a8e create mode 100644 geo-cache/geoassign/objects/f76eb7b55328437aaa6d6c8c3669d0ff create mode 100644 geo-cache/geoassign/objects/f77cdd745178480ea6df9be43f63f3b9 create mode 100644 geo-cache/geoassign/objects/f789730b9a0e438d8062cda663144ace create mode 100644 geo-cache/geoassign/objects/f78fda47350f41a48692ced12e62d829 create mode 100644 geo-cache/geoassign/objects/f7989f60fde4439794b6d606289cdb3b create mode 100644 geo-cache/geoassign/objects/f79a9d3ac4ab4ac097dc020d038b83dd create mode 100644 geo-cache/geoassign/objects/f7a4660dee0d4d35850e4d01b185210b create mode 100644 geo-cache/geoassign/objects/f7c8ee17261447c0bf676e1f5b394c81 create mode 100644 geo-cache/geoassign/objects/f7dabfe9b5e640be9109ecb2ed214bc5 create mode 100644 geo-cache/geoassign/objects/f7f5ae34078c42569825debabb052a41 create mode 100644 geo-cache/geoassign/objects/f8044fb814da4e6b8cefbfdb6cec2f1f create mode 100644 geo-cache/geoassign/objects/f83aa9ce6c5c47fb929e4c256b441673 create mode 100644 geo-cache/geoassign/objects/f8557abe1d944adc921dc80b4abfef57 create mode 100644 geo-cache/geoassign/objects/f859bdb26732444f81420a170da6baf3 create mode 100644 geo-cache/geoassign/objects/f8d27f85052043ae8988c4574248701a create mode 100644 geo-cache/geoassign/objects/f8e6ba45b21a450998751ca6604d7145 create mode 100644 geo-cache/geoassign/objects/f918493989014b06b9edc8e6f00888f2 create mode 100644 geo-cache/geoassign/objects/f9465cc9601045af81536c0c961fb8f4 create mode 100644 geo-cache/geoassign/objects/f9911eca289345b7810bec446f4674f9 create mode 100644 geo-cache/geoassign/objects/f993d646cd9349b49722cbaa8b6248fd create mode 100644 geo-cache/geoassign/objects/f9a3d80379634b358ef09df07ede3c5d create mode 100644 geo-cache/geoassign/objects/f9ad589cd68f4f758f98162ff6514b37 create mode 100644 geo-cache/geoassign/objects/f9e0577ba2644b9f825bc794b812ab90 create mode 100644 geo-cache/geoassign/objects/f9f37b57d6f14df5b53f9488c9917330 create mode 100644 geo-cache/geoassign/objects/fa15804db6fc4f80a0368adac57e1349 create mode 100644 geo-cache/geoassign/objects/fa17a799713e438bb5b98598baccd814 create mode 100644 geo-cache/geoassign/objects/fa25a4ae5ad54d7ebe31d04ddd97d554 create mode 100644 geo-cache/geoassign/objects/fa2668f8d6c241e18531115109e44eb6 create mode 100644 geo-cache/geoassign/objects/fa3314aea77c404e8c82c90868c4fad2 create mode 100644 geo-cache/geoassign/objects/fa347a3d48064e49a1a5ca2bd917e879 create mode 100644 geo-cache/geoassign/objects/fa8370e0b961451f975d4679a4468943 create mode 100644 geo-cache/geoassign/objects/fa92855ab3be4727958056e2c0f94584 create mode 100644 geo-cache/geoassign/objects/fa93a2bd9e8e49a8894bdbff3619821a create mode 100644 geo-cache/geoassign/objects/fa9b8e0dff4a437099a95b1b9be952f0 create mode 100644 geo-cache/geoassign/objects/faad565a97f44ef08d318c6de22d74fc create mode 100644 geo-cache/geoassign/objects/fac8a0c92688497fa84e8f61b9614260 create mode 100644 geo-cache/geoassign/objects/fad521e4207043dfb79226f011e51cdd create mode 100644 geo-cache/geoassign/objects/fae79ef437eb434e8d2c07cdba7afe4c create mode 100644 geo-cache/geoassign/objects/faea2aa5901c45c3b8dc1dfdcd0b6c58 create mode 100644 geo-cache/geoassign/objects/fafd8a8f6a974c74bfda25a188308f9c create mode 100644 geo-cache/geoassign/objects/fb3f6a6a6aef4da6aa4c1087a017efaa create mode 100644 geo-cache/geoassign/objects/fb49c9ce07f5444cbfbb20d949135b06 create mode 100644 geo-cache/geoassign/objects/fb67217b821041ea8651e2053e7d229f create mode 100644 geo-cache/geoassign/objects/fb6d5f14eace420784ae70399ec6ab9f create mode 100644 geo-cache/geoassign/objects/fb7b2e2102e84dc3b31c2b46d3ff2422 create mode 100644 geo-cache/geoassign/objects/fb823023b5534fdba52db4380040ac56 create mode 100644 geo-cache/geoassign/objects/fba40144c85a494aba107db75feb8d8c create mode 100644 geo-cache/geoassign/objects/fbaf5a5f938c4d35afa3491d09220b26 create mode 100644 geo-cache/geoassign/objects/fbb6956717cc42af9d2688d967f59e0d create mode 100644 geo-cache/geoassign/objects/fbdf76a9ecf04d9c9bd6c7e4de38d548 create mode 100644 geo-cache/geoassign/objects/fbfd1dd4fa6c40159f1ab60a7d8c62e6 create mode 100644 geo-cache/geoassign/objects/fc01a35301604d24aead60eae937c05b create mode 100644 geo-cache/geoassign/objects/fc06177f3a0343ceba34b71d5b523472 create mode 100644 geo-cache/geoassign/objects/fc0d0932d6374c5299988c4f10cdfad2 create mode 100644 geo-cache/geoassign/objects/fc0f655d39e84d6d9fb6073855c6c73d create mode 100644 geo-cache/geoassign/objects/fc1432cc3b084f2bb8684d08ef3b5a0b create mode 100644 geo-cache/geoassign/objects/fc24416949a34ecca88ee65e7c374fd3 create mode 100644 geo-cache/geoassign/objects/fc6c7d5eec864261ab0b6ffc4ff8a7bb create mode 100644 geo-cache/geoassign/objects/fc716cac59fe424d827b47faadde8d62 create mode 100644 geo-cache/geoassign/objects/fc862cee8e6a4b4888126e895e290140 create mode 100644 geo-cache/geoassign/objects/fc90994ad78b40c7beaf842974de1c6a create mode 100644 geo-cache/geoassign/objects/fca0189672974ae186a2e3e1f4ffa39d create mode 100644 geo-cache/geoassign/objects/fca265af82564bb48ef33ff91de4a617 create mode 100644 geo-cache/geoassign/objects/fcc651d135d44dd7b480873a1fad8cf6 create mode 100644 geo-cache/geoassign/objects/fce19a80e49f4fc89dd700029edf1e0c create mode 100644 geo-cache/geoassign/objects/fce3a9f973964e039cf71168bc05adf2 create mode 100644 geo-cache/geoassign/objects/fce41a11f02b4260a01c34c61866be3f create mode 100644 geo-cache/geoassign/objects/fce6ce0e96ea4bb481566cba6a7b5d00 create mode 100644 geo-cache/geoassign/objects/fd290642719d4247a679bfd3125388e6 create mode 100644 geo-cache/geoassign/objects/fd367c3d48c94c60b0d19e4b53bb293f create mode 100644 geo-cache/geoassign/objects/fd4204d8724a4022955bd89cf91ea242 create mode 100644 geo-cache/geoassign/objects/fd8cf00ab1b541f69f8c5cfbbcc7fe2b create mode 100644 geo-cache/geoassign/objects/fd8f283ae5ac4d79bcb1ffcbd31116e7 create mode 100644 geo-cache/geoassign/objects/fd939c7bcaf04aea8129a472066dc98c create mode 100644 geo-cache/geoassign/objects/fd96d650d7344a5480a01b11dc70b375 create mode 100644 geo-cache/geoassign/objects/fda25189eaec4e6199d9af97b2dd33d6 create mode 100644 geo-cache/geoassign/objects/fdb9ecd3090749f3972cef3d293321d9 create mode 100644 geo-cache/geoassign/objects/fdc4303b5b1445dd8b052084d0589d97 create mode 100644 geo-cache/geoassign/objects/fdcc80f38e73462898ec0f82cba9799c create mode 100644 geo-cache/geoassign/objects/fe280e1272254cad82660657f4614175 create mode 100644 geo-cache/geoassign/objects/fe6e24138a4e4b52ab10ad160a410409 create mode 100644 geo-cache/geoassign/objects/fe6f84c5c5024eae8e64412868f33f45 create mode 100644 geo-cache/geoassign/objects/fe75831a49384664808a8c3a3329e809 create mode 100644 geo-cache/geoassign/objects/fe7fc30328af448a822ff060f4dbf5d5 create mode 100644 geo-cache/geoassign/objects/fea85f62952a46ef9c2219b887029e87 create mode 100644 geo-cache/geoassign/objects/feaa6d32a8b845469e37516470f60bb4 create mode 100644 geo-cache/geoassign/objects/feb08449bcb7480aa785aadbdd7cd88c create mode 100644 geo-cache/geoassign/objects/feba68a2a37042d3b943326f9f8b014e create mode 100644 geo-cache/geoassign/objects/fecce3b96ebf443285c67a787ee0a4c0 create mode 100644 geo-cache/geoassign/objects/fed3ef112e0f4492bb1729d223aad0a5 create mode 100644 geo-cache/geoassign/objects/fed78d33caf2436288ef8ce47c29af8e create mode 100644 geo-cache/geoassign/objects/fee19067728b4ceea0769f57c6767151 create mode 100644 geo-cache/geoassign/objects/fee5f6f60d6e4b678498976168917a01 create mode 100644 geo-cache/geoassign/objects/fef0d32c08be4c04ae0f793a268d6341 create mode 100644 geo-cache/geoassign/objects/fef330d9efeb44b6a7150ad12484aa39 create mode 100644 geo-cache/geoassign/objects/fefaf834003242d59510ca393110c130 create mode 100644 geo-cache/geoassign/objects/ff2485aa359442b3baca2a6311c337c9 create mode 100644 geo-cache/geoassign/objects/ff5a070d939d485691af90624b51e701 create mode 100644 geo-cache/geoassign/objects/ff71ac1f6f724a03939e4899d03158f9 create mode 100644 geo-cache/geoassign/objects/ff71f4e299244ce998b2608dd5b1cadd create mode 100644 geo-cache/geoassign/objects/ff7999b8dafb428caed30e3193f76b94 diff --git a/geo-cache/config.json b/geo-cache/config.json new file mode 100644 index 0000000..e628b7c --- /dev/null +++ b/geo-cache/config.json @@ -0,0 +1 @@ +{"autocommit": false, "serializer_class": "json", "store_class": "transactional", "index_class": "transactional", "indexes": {"geoassign": {"pk": {"id": "d15c07cca25f456db849dd578d35dd21", "key": "pk"}}}, "index_store_class": "basic", "version": "0.2.12"} \ No newline at end of file diff --git a/geo-cache/geoassign/indexes/d15c07cca25f456db849dd578d35dd21/all_keys_with_undefined b/geo-cache/geoassign/indexes/d15c07cca25f456db849dd578d35dd21/all_keys_with_undefined new file mode 100644 index 0000000000000000000000000000000000000000..1f87dd5bc61d9fc9bbef21b8a1f48d8eff8e0650 GIT binary patch literal 241779 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

v*lr+mCL5R^pVAbYn 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

vb(C#=BO9PW+ zv(%!W5Tk#ARhuTKm{=s?*$?p>Z1f+n;p=X5j1|CmYS4kW|3%=Xl!m^Vw7SGUJ7eu zmSzcB-Dzl&TEwUb8NUXrPBKgaoj(Jbxx=19m=zfqVvAV7ia}@ErKN(lUK=Nwq!=Yy zg0{J&fp%{jCW6kyE@Fik%?4JTXl$97Xo~0J33jm29AL#3pk+fQ=9UHq$w?-uNv4TL zhM>g&mdWO(MwX!SGC3hebAeTxrW&SNrh+?n*rSmfY%~v8F=%xU=&o#wWD`r1RC7?` zOG*Q+zA!OLOR`L|EaHV2%?DPUm}+WfW?}-$jo33fKiFsiuwpX{&;hV1=9Zu~pBdh|xk2)s_Z^peyBYo@6ErHd+L%*a&pxnnkKv8t4#*WOHNC z_G{45s>Z1X=0=H@iAACiqs1VqLCq>NGteqT>>Unqu+b7=#h~NuQb7aP$wrnYCTYnQ z#%ZaEmZ>I2si|gZX^G}Vk`SY%z^cuSO;gMvJ7z4gZncmG8!ZD?oM@h6W^4}HZf#;@ z0y^NzEYT>%Fe%N*#L_6qJTbLM7GksG*=8-rw=;HCpFQ`GRY_{EzJPb2Qf1+GBYUBgcz*_R&9_9+W2S* z8m`5j(Y3)w>wp!TCR&)9CK{w!f|kIVTBL%m{C&><_vCg6qi z*weK+*k}u|VpC8DBRLH;{$XKak(!v4l$>ailALOmW^8DloMKdD2{GCVtlBaq*%EZh z2+oryt-(gyKoo;6_y!GSrGW-TEDe&(4UCOI`#p_8H?3G07uiCLwu7j)G)+k~0QU+K zL5UAzcalBWXa}%jqofqj4m(RDvm`UnVTg%l2F7Wi)4?r`P0bRG4T~HhMms@NL#`FT z-M)4P8|?yCoR*wyW@?yXXbjq?nvw##z1G0O+&IxNEiuI+InAud6=Jj-SaqVQNwSe4 zc(NONMt27r?EzM7ZfIhZlxCEcY?5qbVq$2PWMY|SoNAn!l$dCiW^QI#MSg9FWe0V8yx~xY+z{sp3_RSNHI47-4UOZn3k3VI)2dzd^}xID8%S6u`;W(r#0Zl0KCYH4hqW?__)Xj~KtF**vY z+9=r^bTTif0>fUYMuUxx0V__jGzT3Hm1LA;Zf=rh0J<~I*c`O$I5oxG)YvSkC>COL z97J`Jr2+KTZtT@=JlN<2h~m^_V++t7m=>VR5KKVF%YwFWn3)g+ZFBMJniEvy?QGqEv{{ zX<*eRhKa_B7T{h1cB9k5MrVK(gYMc*HB3xNO|~#JNwG|{FiJK7Ee19>Hn#w+8!5_! z7@Y-HosyVlW@rH(#laqp*3XGK?lT{7?_zPrJ5L~nkJ^0B^iRw+cY&XGc`0% zEXsu#od;H(nqrocoCuzP#a^i9gN-f#D^3KR+G}cPl4N0NVq#`#Y++`SVr*<+Y+;gY zlx&$~UQ`G%x(KY=D9z9$*#NX26h{SC3^uw1tk~SZJT(z?T#K=#g$d|rRdd5cBf})i z8jG}SQC zD9OMe**LYR7GiWAShcBHvW1D6At*Ou59@lc(G6h5mPQ6X5-pRAj1o;v z%`J>mOpFpOEs7c;MmK>~CnuR2f)3=x*;r@>8{Gm{Y;J5|Xlam?l4u56A7X4_nPix3 zoMdDSI-@E%*)*-F6=HN7ShZ22fw3WEWgPagr*^Q>9bm=A#ulJ;frcg~2IeM4MrIaf z7G?$pW|oG=mS!fFh9*Uw5Tm=msx8e@%|Q3&;H(?F!AAFh6&t3RgLd7RC4$x$CYpja zR~Uo#q9mG`TbLV}8Wr_IjP3)gHa533Gytu3PQ`JRR6p402@u6;M#*L-DWI#Ej7^d( zKpXYVEkJW@hDH_!Nh!uf6Cp-V0;@JOPc=130Uvdby#kvIHhKzJv5A=(XiY8XoDWkI z1B*0EvowojON(T~6tiT|CXS-15TmDoRVSIJCM71Pf`(eKhxK%@(KEn`Qw%^GyOYfg zOiWWuKxgx(q$HXfB^f4z?i@3=uq>JhF?tqQwTXd6YDx-tg+BJgHydp99I#^0nQlhO z=Eoq87G4lkDH{W7A=Gry$Gz@#3U`v7;@A-_I~4Hu+dAvic=F! zQ!LC3%oB}49cfbwOA`w-&{;}Jrj|zLDF&%UOCd%t1FKFifiDWLlc4U&yPm!_GSnk8BmZG{-U4XirF%n)?zDQMIk zdj+-~Z1fJWVv`h0&|&mu=AgYH$!4aBNybSgNoMBBDP|@HCP@}WJ0V8z0;@JNNd_IH z1}apsSG&8xM(+VDPD`-_^}3Rh6VnV#5>pdF`|Uuh!VJvJQb4(~XfMR*ePGp=#)+We zT_c>cr2D}}9{?)`HOLYZ4b0Ol6Aes~%@Y%iO-u|76H`Gay(JnZr4=277<~w=I?Wig zLew0zdkuRu9tInI1gzN5!Z^{`APsb{y@d&=CuW!g+T4<4VQ6AukY-?6bQEIrF|g_+ z!{j7WOK@WWdu}`qHu?luF=*GnnMn%hmU$DCR8Vsfyn73@v&AUI)YzctB*f@bVAV#( z=0+w)#>P0y>(gMP&wv#tnx{f`f2EmOm{=xRT7b^zPcgSN09_=Nl4?VP}nx>c;m>Q&}CWFrIGBqo@ z3NiW`Saq^_ax&-&A)LolUk4j~1FYD{z|7dvB*oAu&BVmSEX~l;EX~9;Inl`6)I1Ti z)VAm*#OPaK)hVWlplfb%9~E>PZ1f$lVoOl}&=7PO0%+Tlc_L^aFD=!~EHy1DISDiv zcNb#xJ&0-}6VQHVQ1OJlw|gIK^aHSB^OO{$Uj&$%AI6m6O+_ri?kF=bE8Bf zQ`02ya7)osh|$l$s?8w7TA&UG_H_LmZ1fATV#6de!z2Uqlw`wHW0Ry5a|=rggCtYX zQMm@@#wmtLMK2*nzXGdH1zjg(mIf-Gu=izNgN=RzQ4HPzXKt91oCMk?ZD3)TmTCst zR%K`aTC-qW^cG_DJFsdCLla9-Z3Nom0ZM!ref0NWqd$NZr&uPNfhM{wQ_Vo9-KQj_ zB^rV*U`tI)votlfuqgTnG5Ql&wNZ*0XdDMLMUTBk{|q+z3s`X)r2lMbVwq@ck_tKt z%OW+^%rwlP+y zW~oW0#zuz52B15GL8&3B=qJSJUtraVNlB^Z;N@L7wvGP=8~q2Y*x0}Tbc{}lVM=16 zNs@UQXh_i{4RnF<1R1{ut4=gCOffM7kGf+|e9TJV@oTW+Boh;p6f@9y z?P-Z7pbOW`Q;bYaLDRj-CgzF8#zm|UquIc!4U&vOXOV+)BlZf69c(lQSh1OzQEF0h zno(+^S)z%liJ^sgvSpf4YAR?|dy=J5N)ac-XfCkoWJ4p+QfE*K!Cs?tgN^0^D>g|= z0UcWgT2KJ05fT%V5-luJlP!}?K(hu$X+^vcqxrz9EmG2wOj1)oMq@8S_`yaCfEAm9 zP9aV-G%+wR2Q9P(ZNN`9HZd>+9gGRO`m0C~VzdxMwSl>%K~fT^VTL_j3xkao0V{?a z^b8t|GdDCzGc~ZVOf>=>@ndFYX=H4YYFs1=F%-Sh1;v zfr+t&rG=@fX{w2(k+}uv=&O{}#FP}!u3baZB3X#ha$wb|<`x#FW+|YO5Bu1YJlJRj zu;L^OQ_%5>sRl`)OU4t8EKEVI9COeqj)~x{?urnjmB6aa%|X`h+tLr6ndB8JHTHS{j;}q#9Tzo0}KuLX6e}t2Q(No#vke zYF}dyYkjcM1`x%j=7uS0ps`33V-ri`WD9dsQ;ReUQ%gfj(6pv`ks-urBe3dJi{vEG z+Gm{2Nn^0lCSb+M#wiAtsb+~uW)|k4!wM}xCnF}Bm|B>CS9_-vnL>;<1FJSlNlP?O zO2S=+n1hYB04q)dow}K5k!F?%J{sI4DJ><@$TZQ=!onETK}{~QgcxlFR-J4Dx+^0M z)Fs8wLX36-t2Q+= zGBr#EFDAvF_?*E;yMPs&nHqsk+qFzhNwYLb1r0ixnu0D(N-{GuGEXu!FLH$#?FLqD znGD*v1Rlk~ZnQhtXb-SrQ{%*>)MU`5L!h~-6bp+~!!$!<<0R13v$3gha*-#*XfLp8 z!^9*@15*o7$!ChSvEU6h+6Sx{bOvOKnMsM5}+F)yvm}FpL47yLnuqYH_bQoAQ^tuet zLNM&E4hI_@0agq;K@fa(GHCyld1A5!=z<{wLjwZ?^E5;AwA7+Vh|y7C)uv{q2B6DU zarV)p!A8e`6gCEBqy6CB^ntg8Kx9vLX6G= zt4;;o>|$;Nibm|N&ITKu16G`3kZNgZY-C`Ol4fjTW|;=stz}@EmS|~e2wn?NlnXIB z53Je*6nqBYL(;HknS8L(1z^RX1k6W6inVFdv6+(KB+w8gsNa@sX<=k(YLpC`ZZoj7Ofya? zs)QI_1y-G!YG9C(Xo0)Dt_B-j16FKmmSSWGS|e(hW(GR&IWf^J(a1b0#n2!bbo{bm zQ7y#iI(^5bOWhN&lTco6dTNtUP#zsb| zX~spJ5Tm=ms?*Gj6D2r8aTEDbG;K=&mZ85o*c zn1GsUMZFNC`@pI#O+l?K@GVu?1Ee2p^aQZt#AML2C(!166C)F2!z7DDi^N3G-9ezO zye4TTMH3-LPXen>u}n=gGyoq1gFQD+1{*yEtk?{6Ae~8yMT$jgiixRZie*}|VXCFE zaf(@rWwN1#VbN5G(bK@Hp;JDfbPWzRjNa~au+cNXicO4D3=)k@jm%QO3+j`TOw7TD zVyC4ff$sk^E1C&0dKOr=7t7ohM<`eaNU(; zVrmGwOx4m1lweGZidI65UIkH|Yz{h$5mcjNkH*ztqt}2HC#QgS7bjb!nWdP3b_^yO zrI;Bf8d#*IrllsDB^9lO7`+ax+5%LqnVW-hBX*!jot!QY;IzjY+wdDe=RW? zbi+)dabjw6VseTxC{ojm4U4uyjNS%Tonn}hWRwP80*gI`YzG^?1FSgJ!qm(%IoaGa z)xy}s*wiq|C@ICv#3aQ$5p+qIxoOc(h|#;isx3j613*r%#a=w^1{=Kxtk~Gn*xb_8 zBGt$MG{R?`nrN1sWSN|1VrrHMx+=}QXfMR*ePGqlYr8-z^s$#A`@u#Z04q*31TFBf zFiSHvGBz7NF5-3(%r$gVZz=W8Gi%vp}J_S~7V3BHQVrT>!zs7F#X|T~}z=};Q zK*zb6n45tvl}SlTwKO(Q0bOC7oR(~vWMFPtbQWUtIk0N8L~!dHRPAE#6`ThfeF3aE zIVma8JQ=jB%rw~qbcM8$MN*=XxrK>QDky8D6~ODb38%!~#4zi9PXM1{-|^ zq8M~#wJ(%oMa1=PJbLYhcxuNy(ri96;qYcB8L@jlKa< zYzaD^&p0L3(9GDxGQ}{-$jm4?6?6`krE#KxsZr5Qh|#yesx1;NQ;k4F@3`jCZ-b4# z16G`zlw@LP2D(ln*~|oVOSwUcaay90rBRZB1?bS-qPq~I?}1etnp#+FJ%kwj2&~#7HQB(}2z>4&_AK)l zZ1fYbV$dOXCI-fdmL{OVxHKaR&^Bh!S@&s17Rf1wrbSO7Mn40qHc2!!106Vub0qjV z*ytBv#h^U`7KX{msg{;0CT5_qY!lF`SW|;U&;f}CNkuOqM!y29PD(a4NH#VE4aQ+F zR9}OQegjr)2tIbh)WkeB$=Jli1hghNH5GI)qJ;%$jM=Q{EyU<|VAZJxre>g%NpPOk z@*ZsT2e4vuL(rw=Y32q-<|!t|CW(m_mX?O8W+p}kDapo3iAhBtAx3`!s|Fq24?0^8 z=g}me!A5@pD^5!Vo%?HOWNu_+YLc9oVqs)vW&pal+r-S!#L(Qd=qtqNZ(!A_W~r&> zmf&$d?78tf*ytZ%#h^pWEe%am6HQXgL1)G#S*C(cWi~K3Gcz|&HMA)D2{HN?Shcxn zT3QNd8V=W?@xQ@F{{bsDOENSu104frVFKE1Y-tG!_SCc_qhu3vgS3>SqQ4NM|AAE- zT3CY4G5{5-*qb>2!A3JEgT}ATK^Ib`fR=Kb8k(e~nOT^D&H+j^FfdIrPD!({C}LEG zj9-IQTbQJP)-B;~Uo$I%$FISPEe%XTyUGlbK_^2d8H0*zQ&Z6HBU2O54cKNytPrEw zz^YSHOhE^5gUS%>Jur5#(HvmK=HR*o+>c8#F|Y(3Ds7l-Vw?;bu1!v|G%DhR7|jJ% zZIWh`Y6j}C;tFeSu+cnV#h^PG4N@!(4M2NIlR@XBn;C+xD@Zg;vM@?BPAlSt7|jP( zZIWzcnq*`KYPw^u3i!cB3xE}a#$-~`64T5QO)O1}Qw$T$4J=bk63q=0jm<&BFGYe7 zqlLh#%|O?!g3jc@c>*@rXc4etV>8nv(5et)!_-t03j>2h0|U?!IaAP#Bk1J5B2kFZ zVqn#V7KW*o=HL-C?8TEf*k}o`Vv{7()I%{<94%@n+R4SRD^8f>%-STSf>h=~#CZY|3s6JyI%3!^m9A|VTNL+}7HLJQ z5Tn(=s*O!RN6LeT#<7R_Waz=};$(m+k=G|(+GCPqmn7KX`|NlB)r7UoGN#)+w> zMVb(!wZN)D$2A#)uIYsF#4a+07;Oeton&B;Y+#-ODxR<#Z4Nft0<1VW%^=MLbR3mwlDUb2A?RGeq|`Lf zjnO6sMu|!0MV1hwt-z{{5))I6EWm9(>^(4Ru+cVP#h@eYK({QWS{PcIB!X_-1+837 zG)gtKFg6A)EU<+bZ3kAJYL;qXVhCPAguU9e2OI4GR%~uzl$K&(X>4wmW@ch$kerxe zo@!*04C;%U8Cw{c6*)qTb^@z5Hc2!EMU4Tj(;=L}M!SF&Tbdapn;DuKr=@~cd>UIO zr6!vj8YP<=zyu@6k`*kB2S3XUSQSc2B1B=;2p5o!`d5cv=3NuqJg1VqNOpYX<%+* zYHnfyTE>xLWNHYyDA&>?t;iQ*v>#YCbi*g8mcgDI{lP{DfE9xd5Hz$f0$oI!W@2V& z3SJ|fY?Nqb0%|{)Bo_rjj1B^;PBb?#HZ=iv?yv_)Fxco2h+@#4bLMHFYrd0AlFd^r zER)OWCkDnAhN++n z%*<0kgUv}s21Th5qtn2u&C-lPmnDM28hbRRgN@DrD+V3DnPg;OUk`cj4bzGWAx0O0RfA?x%?yn}DFk~Hrx30N`cu)I`Di&S$n(Ebc#(6MF~ zW+^5~rYWfg7O58IMWqm<%fPBZcN>6Cs=&EHzZ`6I1z2%%N|Ld$sfBT(St_XH1I=++ zCYyrhHxfpL}Dj`N!fmNp%fwsCN<35zB8fSw# zNsN;$lgz-!^(7e=HA0MT0;^83G&M^B9eoDgADe21G4R<8Ho66@*woC#GTF?)%-8}n zR{&Z#ZwNZ!EhRY#bQy=Sc~L9G=r*uw6VOo_Cg44H*j?QYHo60>*uu!r#MA(E4T+(t ziBXCnXmZNP%pwi64Js+s*tDn0k!ZNX_7h-fDSanLWc@jtm&I+s_Z1e=MV$c;T21bb{X`sWW zQ^943p`khG=8x25OJmc-qKOcrCxKOi4&h2n2G12>Z{kb_8$AW0*fcp6G~1E{+Cgca zYGjcL%8y2ApcZM0g}G7DREW{jz^aYR4AKk@jX~S_u+M=_2OB*DqS(mL#N5Qx$kNEr z$i&3RFww*SbbW!L5vZGFW@b_}6Jqo%uxb;F)D+MR7S4|JY_QRDz=~7MOpOvjt09s= z1KG)zmY`!ZlM_vhKsP%lS{fG3g%~{#tQyplG)x9>WX4{G%m*920IWF8)I81H(h$7T z%*50v(Gql@pb2PAVrpWlp@mV=LWt3ez^apz)67yqE&RfSAZ3prW%-} zq=4GCMu{fIDXEs`DJBLc24+Uasb(h0pz&*n(W}6!L3_B8&5UvHs9Fs+dJR~yxkX~C zNt(H#u|;a431~(KboFyeYO=9qqM3=gsd3R-h|%l7s#8spKu0Qp3RUdwko91rH-Hse zn41_IrWqz17#oHF*LI@O*1Uo2r+sSSaqVMNs?JA_~az)&B@JR zqql$+o2Dh2Bv~dITBaH&nWR}HS|(b8?u9clNCwSMn;I5vg&4gJtlH4rzyQ?8#<_5J zJJ{$QV8x~u7Ut$=Mk&Ui3$QGbjgl;l43g7KL5E?dnI;;V7wv=?y$h_`B-t=2E!h&Z zb`pD=Z?`gNWML0ju|;yKQA%oxk)<){v}%(yOH0tWLYhgMacWA6xmi-tUWn2Az^aW? zj8c*;(?A3I*p1!~Hu?ZqahkbtnsJhOl7XRtxk;i)8t8~tlO)hRUWrMDrpA^<2O&lu z0;>j{gJJ->6WkETD#XKJqmO_U8yHwvS|*wqnwc3IniyDGCW4M^F*i$1GcqzXNi$C? zItnrR7+AFlXplI?2zN{MIN0bDV8y8^CW&T7=4PP7bifwhKUZbA|8+`_>IK{xwD8Z z!&J+nvk;@tfmNp^B^jj}f(upbt*7%~qc4CJo0?jHHa(;m8>Ob0q?(x|nkO13B^sKh z7#Nv=juI`p2r>E+Shbl^ib<+P3TUVWdo*4K8+`?=*wiG&0<=@y0yG&0iholh@IEDT z&^j~26qBN>5TmbwRi`9dfaVH8VU69@*TF{L04p{#HZ-vSO^$*N9WgdYN;EVuvam2n zGY1_$ZfKNPbQ5CqEwE~6>j~5_!yeYR!A9Q!D>k(>NHPSS4`*nRW@371gzN5EG^O80yLvM6pG(Nn)B&S|aFNbTgx* zM9{&ihRK%ZDTbDy`LLq55ToCLRi}Vfx*J%6jK&@y@4-fY04p{CbzRMjlR@i;LHD|Y z_H$TRq$VaB8-s=x%!@ukjQ#{xZJKD7WN4U%JMn!68~p{WIMLY5$kNOx$;2Qr3ACrl zA}Ki~+1xla6|`Y6$;hJUE5zt;VAY_l`6i(AT5)y%zk`kb0ak2bk(id2Y?x*UIwCF2 z2y_N`Vset9A*j?&PPH&B`Ux@m7g%+gS*l55GI)&{_AK)oZ1f+9;zY8YGz|8zozqn3#gD z7Dxo`00CVuV47xbZfI;)#Ha!pzXq#LvoJABHZ=w9;lRGHfLR4p%dmhIn&nI)N;ni-m!fF`esSRqEUfmJ6NSR^J}B!Oyl?9EAbu+bb~#m0#i z$!2DzX@;o=pmk4)pi9^jEsQ}2q#38CB&QZ}LX74Dt4^~tF$8Vm#5u#k4K|twtk}fZ zA~D6#+{7%+IK>2XS)8T0L6V_yim9PRN|Kq0X%R2PXg;uNi)3SiWCJr$wTr#Y#}77I z0IV2P!6qA}SQvnghBP)xu>c)yl$MlYY6?1N%h=+7J}~TwPa15r z3|O&QT1u*6a#EtDv5~2XnQ>C0WlEZ*fw@VNVJc|nLSm6D#ArFNYD;rVW0N#+d5t}V z$b*em04p|2GchnVO|vjGGEX!~wy;P_O)*Y0Pf1ENNi+hT)>5PhF)YvdBB{|g?RQx3tsX~la1FKF;0ktK- z$KqmdPO5{A)&MIuO-@WSH8L?X2i=KlV3d|*m}s5^x*5{cFwH2{JgG<%Vzd@mwNY}C z1?T`8oP8N>u+chT#b$;ErUu4oCI)Gs)7O%W5)CcV(m-3}j6oN;SQ-@RLX6e}t2Q@C zNlXJBY=vvzu0Ggk1F&MyfQ_Z4F=#EK5$LGuq!d&06jKW`v&2M83-c7CB14GLMqt$@ z#-@phkSpV{2Z%A)XcLHHQzH{lBi+=(*a&povt??kfr$yIHEL#IWNDOEWC}6b46HiQ zG6}Rb4pj1C&obsZen7bW?-3SVVIhnVr*eC7YQgCYzgDm>8LuSR{jH$`cclQ_Pah z3=9knjEg)WMtgx(C!3p_n5HCwNbiX{kmg<|g3T9?-3U zCgz|Mv<#Drd?7~rfmK_Ym|2>eCW8*I!QOiE2OAv#R%~W&keHNgmtL|aAz;PkprK#WB%_oxOG}gFR8vdPcJ4$& z3j?DR%M@c{i=t47(P3cKspd(kMoFf)n>gWMqa(nI%?*vr5{->56VpKFmZhdynwuFI znj{;WCK?zg8k?sUMM8{@0;^6ow=_332A_0?eON0RY;+7*v4y3P0qD{YL-5MoWJ3$k z-i^eR!A6&W6@v*c)cmV54im zij$HPjZKp+%`B45L7Vx^5-pOF6D`e?(oDdUrAbA#5TonBs?#hiQ`3yhLAeoo;;RQ6 z-2hf>X_RW21UkemE!D&%*(}A<$Ov?il8J$tv6*p_iAhl-#ONll>ZH_^Bn!(#&`=BZ z;;9*IbPHIqsY#-trCDlHT1s-Fi6LlJaAJxnXbwKb+$_b!IJKx1Vssl=wS}3nNwP&M z?o}=AV52+0icM233_%CEr5Ku~nxq(*gAQa$0WESgw=_;mNi;3$gc#igR-Ke;k(3PD z_>F56ryFc^4_Gm1rX(4B*n$!0;N+CVG|(yeX69*0DMm)diDpH;5TpCRs!fdylhcgB zhu2`Q3i`oDPXH@UGfy-zGc!m@O$BWyFg68gGf6QpOfs|pjjksZO@tUd39Q-xbTXE4 zGAPSnuNxVVrXKSYLaMdmIPY9VFW(ZGA$Xjhhr+l=xJcppi?z1 zjlstXV2{S>V54V%6`O#zpo5MOO-V5^F*P!^G)hfNHc3iJ1KsLomXcI76Jqo%uxd+V z(6%Lu6rA&ov%yBs0V__k1SQbqL?a7JV-wRP&@C@XpmW&G(m+kjG|Qs75ToaTRhycF zstoX5KG*|fKG^65V8v#}1|}9spv4oW7AByL*G7g$DJf}2pd6H%oRUQ&K@wCMlMnGxQTd-7C=feCFonpdz$rDa7byP}P>8;ubVO zguM(|4mNrPSaDiXl9{EcnYp2PGU&{)G|LntGYg9pOEdE{Q_EC?l%kaoqgO#xgIYtN zIXGOiNvpv|uK_DINJ%v{u&^*lO))SvF*dgZ^-xn2lgyLNP0UhEQWA^SLX2JqRt;+5 zn;LW@2QKVw98&y2{kT+`>E+bQwM9a1(QjWYGB`5Tmz&Ra=;V z7Epr^RKZ@OZwDK_1FSeP4YcDBv`#H`wSsV8xckhUTV5$!RGjMn)zEmIk1M#|%@GEiEh)EmO@?lZy62jNS)U z4L$!FRLfuw>-}J(4}cY0fXC6zQ$bsdO^lL_EKN;QOf3zQ3_;@zW+^5`2O&lu0;@Jm z1uaSeckZw^f)9g@J_1&3X_A_1kd_Ks+HPu+k_cL|WnyR!>VPC08Kk9{79E8ceGIJH z%+TDx&k4mSD(Sg~nZ5@?^bk&!`aiiwehrG-UmvXQY#qIs$%Xv<7W(MgEW zr@*Q~yD<#SQ$ZCN_TuR@*yuB0#Rf)(Nv0+iDP|_7pi5v9EmDmQ4GoeLEfdW_ZOpWy zvk;@tK~$TWnu0F&#<{xoJlN<9V8x&z*4GdGw%~Q;a zE<%jH1XgX7W|nH10-oUjm1>xCyO+U6UjZuyUD;!30NSgNY6zO;O|&pHNCr(yr=%Jh zm>O9YU47W}y1o2sD|JIe%08( zxac9o=tp4H$%Y20#^&ICyVx`OW3bUrz=|!B6Acs1laov=%*{+vLEBKwOjFEKjVvq; z4ULUbEsLH)jD7}IooH@oYHVPDJ3yX;jeY@EYyp}8Gcijx2aR7_8YfyNn;Kb~nSpY> zg}ITrWzkEB(XYU&Qw$PKQ!T-pTCn$JUW1K(16FKgZfI<5o}6f6k_OsaZJuOoX=-Eu zT6U3S0lIIf=q<$PcVN|)MiwcC7G|Ing1roR4>tM(M6n@gEIiR7#njBy#1M4vuCaxA zQnEoJXf>E|ieb@5h|!pU%z42;apQ&K=juo)IHszS!E!Ky*aXpEE1agQu8tAfX`!HSIx5{)gBQ!GqC zmzXD7npj$zrde7hnkS_hTPA{b(X&E~W&^8+p5O>t#DP6P*uh3~fE9yIL<4sdL5IMm zm>5_XSz4y07+Zo4l1el-N-N@o7|jJ%otR{7XpxqRd(eU#Y%~v8v4w?6VzQ-WqOrLV zXqhzV#!916YRy4IM`?juwu|SzJXDisZkoJ z<~295Ofv)>GoF-`mYi&yY-U&_2{Bp5{nceMk|3;8-R|zgq(|mJ*<_%Myr4orHS;WJ@rp`;WaHq7F7%1FYE6AO*A$Cne1s)KW|} zO-wVhNCqv`urxI{F*i#q(u5eT1y&8ZCo$0+)Jwy0v9>nYXdSR(^VAdrlcZEjOH*?L z6AMew{pg8_W@d)wpc^qQO)QFZAx7(gRi|2jw#tGxYhe#-eX!96V8v#MM#+hwo9+w@ z5X#HU=AQ0#Le2bLnCwW;w0>i1#7U;HekiZ#)cM_=E)YO zCZOgd=&0Q^(yM#)+0GMxbR` z;Ip-jQY=!^EXYz(R!u@_I?V55D&ijB=I49tyF zQ_MkEH<(yjS{j0mxJx!RFg8dtwlp;^@`V`f2UcxvmI|7@1_cQACXPSY=m4-{&^{L9 zWD`T9v?OzrG(&?#3(#IF<5bI(BqOsFW0Rslh|xh{)hQ`vNvW3L#sApb*TG<;L%@oS zQVmT^O%u)2OhG5BrCB5z8yciof{qIUwcOJzib5eqhk;caCxMPz0gYPXNFm{1qa(nI z%`MH%EQ~EIEmF)9O+cI8l9P-r4J=YD4Ga>E42)BYA|XacfmNp^TN;=qC#MCOL99VUtrMVgCGzpv+ zIK+dEP5>(g-FTLk0&1V8q?(u-CnY8sf_8iwfEGw5r6eX5B|?l&0;@I#Z9y|L295J! zkH%!M(J5fXhRL8487z{LK^subEt4#g3{sLUQp^p_QY{nBj4X;$Ax5WxRVN!-CWDUr z!MP?l9c*+4L@}sgmSkdXmS|vTl9Fs-VPs@zYM7X8kPNyCFeRlZ6Jm50Sha<@Wnzkj z3GQ`I*FxA8a z+>yp!?UsX$t^g|r9hGUGmSSmUY+($#gUK=#bltr{a++b9nVGRkVo@c;=qj*k(_{-{ zGc)k7#kRw6xBkEt^=!1 zGfFnJNCeN^VRv;s*yskZVuLg@(6Cl2DAG(4&C)E)Q$d4srl0}rR7(@HqDF|(O%T=Q zMoFM;Dmb%DGuY@Bu;LW+G&7?VLqkiWG)t3YQ_Dotv{duN#MG3;{+HAY;*@$F=(2^%*XU0~G~ zpo=M!z_kqaZc;bc=pL|QWAI7wNl7W7ZOqBZrip2$MoFL!h`E_ra+kKCo(# zuRs+L?)BGTqbEQWnTbL$-y3%HrrWPqCrfJEbVR8#oGXskxGjq`PfuflZqi2Ct zgRV3%fZSq+y+)r6HhKqw|7KVvM z3n4}?0;{%2GB>m|0`Hf>oYST6?~y#lP*z`!Wk1ay6knPsAhsTugbMKjQ`wW**B zu#MA-Rzi$k1y-F1+Wcq)9uL8u(N}|wUISKaVUc2-WMY;G>W`aPm|7$no13L38K)W< zC4p+Iw4${Tqt}5|8-rKbgSV+-kH+<2qc?yR8(5fIn34^a-%yZC-&G)vGW=czdQ=%>L(p8+cdU(;@EkYt%?kZNLV zkz!$BW|W+gXa-t_Y?7FqT67j-^f|EV)I=lGBm;0QgFPD0gN?obRt#EmlV)O>lw_1* zVPcS+0y>Dz5_GT$Xa%-GYI4yB$^l|CK{(18-XrQDtZbr`WaZYc~Y`raw2#w z4t7^R2OIqYtQdTtr-7*jXvG_NZ&FH9YNC;`p#|uGfmDOkqL&b(Ux8IyrY4%0fsSTR z#j!r*HQ4AkV8s@uMoC6SM&{ z$e@cIaJc$2*yt}{#h{tjG^3PcGn2F=P-UK&m}UaHgxJ#30<@LfsOT%i=x<=vCP}8I zMv$Aeu#dWb2OIqZtQd3!n4zJu1$d2?0cfkZ3Fxw8i)3R%T5&;oQuL~>eU(O-zs|G=sZ zlgty1EWw9VV|Vp`u+a=^pz&)<6Jzsa&2CKjnhjB1ea zYp`nLG|;*+@Ng~m#K)`#9=`@FHZ%kuWNe%aYEBv&8e3XgCV{p{n;RP$8JHPZ6tO~# zW&^7RosMW=W(exsVQ)RLgN^0@D+ZN92Fd1zX(>ja#f!-nphJ_5OpHuT(+tg0EK`a& zAx3k7RhuOy8-bz%=b8m>u+cnV#h{Z@EX)&4jFM7PP14c~EX)jyQj&}l(~^=?OwBC} zig+PL^MO^HC0kmU8Cl>So#Y1_EdW-WXqK3koNQ`l4!Sqi%oH?I4!WHRRJ0izBpMkP z2||n(0;^6nurM-AGy|m&>;WPSHd+L%*uucv+&C4qV#vtQB*i>6DK!~%lrQ+|R&(Q2 zgCbFg(PCiLMv2Lwi~wq1W3Oez!A47f6@#{@q@on&BSnqp{)dnL0p*k~EBVoSs1l(b}H(=_umBNL;<)I^gM(`0jtR8Uow zW^7zE_8MItY_tMcu?4791udLUwFKRAkdkC#VPRrynwFGo zYHV(7W?rNSF=|7fY_twov57?r=;k~VVL5G$}R7 z($v%-DbXm|(y&MuVzizbs8}#HO)^a~1TSC1-Z0Y#8*Knq3_7*eEG0G7+$aq+*_{G9 z>l1Xu78a%!X+@?Gqs_poEewo|P0S5&FHSNC8*KqrY+{sXZf=lhXlY<-XkuoV znwV^1kYto%V3-El6=-f*WC=0a3alEs3egZ}8Db4K+6JuH(8xU5(7-e`+0Zz}BrPc^ z5meqKnx%j)x=c(?Gbyr#7;OhuZJLyvY6M#JoobFfH`;@Zb^t3jvrIBGvrI7touY4I zWSW?0m}F^gXl!a}YMEqYl9X2D2r=3TtUB2u#SC;c5l&Y-gN=3pD>h9tF#>H#w@5a% z0IjaJOiD{i1RXhNW?*iSWRh6q3NhLZtlB)q(lXW55_iex4mR2Ytk^OsCD{x#&}jfV zq}n{qA~nsx+$_l~8MMR1#L}Y36JoR%Saq6_rD0k!c#0l->&Y8zv=3NuqJ^bJ66hdU zi{vyDBZE}SG!rv3bBk1q#5B;g!6rq%5TpITs#8IQNE&z*BKAVnA8d30SaDjaIcN#6 zG3ZhY6BCO>3nQbnGz0LC#H2LS6w{(Wh|xh{)u|>a$)M{jaSpWvgN+UWD>gGT0iEOy zI!@cn#MIOjbjy=zqH%I6s99iOkW>^3F**#a+SnY_a0egZfIT;cgN=>=D^4=8G*30L zv@|!e0NoXkmS|y~WB}^3TY@&zCmR(-LX3_At4>WewJ%j5+Oz>fmJ6bCnu+xgO>_oZ-*pKrT?1BZ zU}kQZVw{qkY-D0!l5Am_Xq04bm{#r-Jst6*WSPZUU<|FttcAH?shZhhUG! zX0XvMV8yBCpq-Pc=9UJApgTQ5ClaKXnweV|fJOuijm(N#Ax5`>Ri}V%2msw*ifhoK z9c*+5Sg}b;QZi^GccM`W=%j-b(9s#7k+Y;kGlLW}lcb_fh|yhO)u4TTCYIne!Pwg& z-C(18z={pbQ3zJj}GfU8rWMXoniKV4QBIuBhUWn0sVAUx}DTb!z;02D@ z8w>qlqbGnBo28hirI>^EjVGpn?h6KAik^~Ul9XtgmSmokS~L-2^dyLCQ_#XwJO?LF z1{*yEtQfRT+rlC>$plm}CZ(o!Yx$c#NV zE(ROD1gzND*w`!)bbN&Y=)M9&6VS@{)YKHyB$Gr7V*_K;qNNa{mw{EAm>Qac4*$Tp zT5CDj=oMhaM#*N0=BdUehDIi7CPt>I7M7`?IW*7~D-+O7fJG}IMy~>^2JIM0F-`+5 z?Z)ov)nKF7fE9yk0FyM(Wqc`#CaGpg7Rjk;NogrbX343^Mrnp=MQb5OuLG+#PqVZ% zGD!gq5Mdu0Uk^5V16XmYVX{eTno&}c0cgXdsR`)t>_p2n6GPB#bf&4PMH?YTZvv|} zu`o_CGf2bT2;K}fdJ9;wMM{b#=%_9OQ{xnqq_o6D(9!Fl6N$_XEsTv*42rfwjNS%T zooWm^VhOy61G}rYgN@z+R-BY%35ptH6GM{}@L@!t!v#Q>wxpO^m>OCd6zzlC)*nwlr48YCKk2F@%JO_GZa zLX18HR&AMTmTU^yn}j_;4ug$80#*#VD;Bh?$1vFxG}&!vk(82{Vq%eOVUUuPXkn6E zbQEIrF|cZ5V^j0wH1HBw?5;izHu?luahh3DvZ1-5shL5VnMtCFfrX(l=&*>CG;`3M ztY)S~Cm}|k0;^6*G)goD?@qz7LjN?_=rdr&M#ibBM&?H524?1gC@Ik#T!CR9);bS1`T|%nXkmAnaWbfvYhjXNVrgNT0!rqf zMKLCz1s6pZAx2*UtA<{^j=M&`3^w`-STX40^;C;Q(2Zl3CW&bVp#A7Z1{TSNre-Fo zMrM{pS0P4U1FJSjG%z(yF$YbaU{8G4!A9QzD>k*XOtCaiO94$0n;4`fTbQS%fYJ(R zHo^>aq2*18(YL^=%}mVA4NSl*EwGm%x4}l=0V@XGPhpsB4mwxX!oA?}X!eX!9Fz=}av&>N?M&LK@PHAyxwNHjDvw=hpM zG*3;mG&4vsD0&Dn`Vm;QIq0+t&`d3^;o8Swqo05k8<-`TB!hNwCMAK6drqE-ShaCVvVmy|XowQWg*%_YMt=b-26bc1Kqn?! zfM%1D6G6MA(~Qgv4M5wEjV(=zzCw)t23DPvYGRZOT1k!T;N_<5K1{?hctQd5K zk+E5-u|cw_iHW(9Sz@B0d16vxGN_Sc20AX|FU077VAUy>X33^W;DJxJ_kq zjphI=Ha0g+O-Z&eGD|fwG)V^cz(B``S{PV@ZVFB_EaHS1%>`DSXqb{_Zeau}p0L+4 z++d@5z=}bOSd0zKEmP7`j7&f`CYxKDB$}nBrWhn!7#gRf74brh<^!uXN;EbHjSt|= zGW=kp1;C0y=e>X$PpP2I7O5%bNhY8pRZWr;jSUPzr$ZJALW~vyt2RwCHUceI#JLbm z7;Ll%Sh0z@u|ZNwTB3218E7Y#VUn3es>Unqu+b7=#i=GH=H{kJ7G{YCW+sM~;KjDamgeT5G;Ww=YFs15e_DrNKtafE6dDm>VZrSQ?vIBqf^|Bqk?W7^ImQCR>^$rhwWCsYS97qvgP=lanpX zLFX#r3=ny+(F$P2iAgDGDXE~GZUj0##w5`&4YbP@bT+?{NwTRyks`!sC9rDC6mt{f zMDVSX*aJivY_tkkabl{GDR^lQ=$up&GZPC_1CvzCG&4g(@Q$9;B2|ddYGBo%S$t66 z4CfG{I@o9pu;Nrp&@qrEpaXh9mm8abZWFXLFfy?)O-nR0v$QDEgcz*_R&A7+nwAP$ zK8-8OXoHQ`0V_^QHcK`)w6L%+OfoVtGzT4ronmMRKCK|lJk`LWNEc$X9#}PW6(a80 zBz>^a24KaOX~veIo|btc=sp$8R7+FP9Uo~asg^0A0TPoULx|BvVAaV6CTXUigSc@W zmthPx+61CFF~uy=z}zg+A~DUx1e7X_lMM`w&C*Ok7rk4U6`4YeHUq0pG__1kP6VG! ziaqg}gN?QTD^3QTZ0k#Aqk5>J;NN z%cK+o-2Fypu+c7H#l|T{2B3LePz%(=B+(o+Hf@+@WSDGeW}a-3Xj$Y6G1?8RIwj3G z*~}C?bB8^w-N8nCfE9y|D+b+`l?s~SFf}nuGP1NtHL|oY1|1!2mY7=P2{GCWtU4Jq zlwqC>8dJrd8@<6s`+yZ28kwdhn}N3TgYI`SGEXu|HZwFcOfpI~NCe&RSL6#Z+7GPS z(!jvTG#NZ-fjt`i!A1vw6&qTlnxv+fS(=$zCYgW^K(#P6FfaiP7lBS4voI(MgcuzJ zR&8#cXa>5j8Ry}U!C<39z={ox5|csaJzJ(&n44G{nk1Q98YNqTPW?-@Of@o1D++}e z9R^kn-82qbi-Wx{6Am^y0-`u2EzK|ybi}ivg-J5#blIdNi)6!O1JEw%wA9q1NQlu< zVAZK+pd0)wK9QlfFZOVHU0#;Kse`lPfZv!oOYqh!!FniPv93yY#e zh|x)4)h4DXM#)L0xSQ_DV53vOip`QNjZ9Najf_)GO-u~a(vlJlK~1St;}nBrbE6cq zqEv{{X<*ex2HpigF=F=Ydt58>FS0rGVGsU{BZiV51AbiW5Og`BKfnC+wIcnkFWifzIl&FiTA} zHZ?OdPb(^f7+nNboo0}h2yK{Q&*;Tqqf5Yw%`A;lKsU-5nSsVb%nU7zl2SmYZ5vox zq@<;$nH7~nj4lJKPDuvse*y1D$DXds!A4hr6(^e+gVsWun;RM!nt%?y2QNJ~NwYLd zu`n<+O)08`7+nQcod!C8+X%dM5_?!zgN?2MD>g_pHZm|uGX#y5nxt76S%41h0^Pr9 zW|CrTnwV5n3o*J5tlHGn1T@4AYEEJg>w2)!4PeCFarbghc(k7sL*FoFX42;t( z(?ILZQjCfkAx1ZWRU4(Gnk6SDf);{d?-ewIjcx%e2GzP|2B1@tl9Npgl8us#jSMYK zEG?4L3@wc<%uS10Ax5`>RU23)85U0~Hlrbd<)CZ?ddUF^MrZm`ikV8!N1X2yo*iD`*u#;GQT zDWE$_lafF;4S-y2oMK$m3o*J6tlGdZ5p-W2s0_hwbU)bW31G#Rsh|UmjEzzg%}q@} zExlx83o~=j(Q8KLX_n>|MH3-LPXep9FiJKwwoJqA>d9cEr+^iwS{hrJ7#b!U85pOS zBwMB>C0m-LfQCmv!=dJ>21QdLMo$B)HV2KDSbz?bz_F5fI@stLV8teeDQRXYX(pg6 zoJ~y4l0i2Wq@{r_oJcb^G)_w^nh7y_7FczXVXCQ_nF(lfE%x$yHrVJnV8tmZ<`(9l zvs4T$jZDlE%`A*kEewo6r!*#-7^GO57tMtjJrArp(aKQ-*ysgd#YSe9 z#)*jrpiWzwiLr&bg+Y=@qKUC_Vxn;(XcbD)LWt3ez^ao#XX03bCk3%r1&hH(F99n~ z1FgC^Ha1F11>ehnD?nC*ja~y* zY?y3dYLRGQWNK`ZYywJupw?8Hfsv7gsfDSzNpjIzh|%l7s#DC(Of3zJKujSSOFOe{c$%A|tUP9|HLo12_j4hIkl9MeBK$n>%CnqH(7wv@@y$`G!dWm@w&P^@* z!A2hdD^4{uF*YzsP6G|3nxqY7jM5CuK|@d}MMoh<9|NmSGP6iYNd})E zg5BujV53if6(@pbTtPkbwB!^M!_=h2WY8rlhAAeANfs8#NohqVAx579t4=X9Ft$tv zulU4Xqn`#FeFm&JIXTtD$k@^Zbi9)ZXgNCQ2&pt9)6`V+6ywy?)S|NxqtAg=8=0CI zK+jpg?&|Ykqc4CJn^-298kr|1o0+DhfySOdJD$u93{y-@%nXb`$Mau=7<~z>I@#P9 zw6Gi0CB@!YxC}P>3RtnRk#VY_Ws-qWTB5N@QmP5)gkeJqBhZ~)X=av|mPJ<~MqdM~ z2DO1f+qH3y;#>zCeFLmGDaq2vBFQ+>B+bCm#KOotG08a9(!>yS4j<^Snbe}25TkEF zR9mDOq@{w}A=m@tHrVJpV8xc8b&>{#mT4(Q<|Y;?21!X~ptUog3}j|%X=z+^7h?21 zuxb+v3qu3Y$!@7QX8-SljeY=DoNAV0V3?ekVw?in)M9Cpn4DssVwMJ47;a%?W^P*a z5MuNruxd*q^Tfn7W85=$kHJPi0V_5$PBAh`O*OJKv`8{ZNdv7MN-|3_GO}G2{HN=Saph_WpY{~_)H7z1D~(KM!x|owoI{1NwG*xO#?aA0<@UQ#K_1f zB{?lQHO<^I&8+Ax#OQZm)v2Z_;H}^|J9qEFMt=Y+PD?a0GqXqouN^ZnOf|GHH8wOf zG&MA^Of@k{O)@L`2r>E-Sam9BlFHN^G!l%xD)O@O3(AG0h;=|tN`wupnK?5{?ZElog0y<0} z88r50ZfckW(wb;#Y>^5YTu8GlV$^_)UxQVHmcknwf!AMSPkhW8;PGp)V&k+_(2_D! zQ{yxflVqb*P<>;ZW@(;eYMf?}l44lI3Ne}uqS`nGbbKSI+QnX|vV)E004q*1O-=)) z1oPw+P#43@GSvjMDlsuF#n>##)Ht<>6Jj(MST$%FuB9osn}od#;RYMc16B+^q{7_P z%+fr`zy!2*HYp`BImIy9z|b7je6=j%g&55TRt=i|N=`}vO?G2w} zi~xQZuXu+bu5#YTon=4qh0 z5>Vo^Ff_3+0WJAY0(EaJ4O0zMibNqsi-A=q87G=sCMKug+%zr@Hd+F#*wDnn3{)_g zr-DwHF;7ZLGc>g@v$Qa@NHk40HnS*_gcvOaQEg~uZfjlqR5)jV%mJEz*pOWFbb&fmJ74rdk+7RuEw?p5(zsD}WW78z-5k zrWhGmf;Pq(C7W7WS|)<-w=)Jccg<3aiWDJ6D}hxf8XKA>8-ct3*rQPyY_tkku|b-l ziE)a7xw%oYF=T+qz{1olF*V6B6|@r8tVk7Nv>I5ose!qHK?-;=DfTR*4mMf?tQfT7 zBMo#ENs6hViD?q(N=rkFq-4{i6k{V3i^S9-O^DH2VAZK6#)jrbpp9Li?LJs;d(s9Q ztpibPXkl!b47wk}(A>n_$UM<3IVHu^)WXm*DaFJrEwM-!VzeGuwUJ?RvXPMqsLhAH zc+v+OZ2(qmVriai23m5Ml$>S)x`8^y6m*u8nMD$4W4EDMks-urBd}^q$OZNbHH5iknn{vLQjsOZXe+R4V?(3llvE>7 zM#nyAVGTCg2CUe~GAYf>&=PbWq=kuP3TV_I$t=w<5wv%}($q4g$QEL>9auGJIL*); zd@L?@qwT>)J3tgCCR-SqCYdK285o*anj2ZBCW8+5v@kXT#ifBkkt4)tC$Q>N1JEeF z31}o3dz;T0Y_tnlu_0*7vY8R+{y8HP6B8qgWQ$}2!^9+mRHIa5)0C7VSBTMWVAW=z z3fBlc7>7MKx`U1O04p|6OExqDo%C#KZfXL$?%vQ4bWmgx=)_qgGjqctPl(Z8VAUx` zMkXoANw`-bdV`JjfhsmgH8nIaumoK@VV;s^nF<0I*`iq}0^JMAMX1GxJ0f^AwAuWV6I1V++G%^CY7r0~7P2 zK#0*nVAaqL2Pmwu*D}FiqeH-ojZBO{mvE+6!IwHPI)rJ9&pCR>2cPD(LLGf6VAG%++z zD@ueIodi~$nrfbAoSX<+i-XXz>3Whlgtb(4M1y34L}9Ag(>LVjHF~^vqaO> z6f^UpREW`OVAas^YfuG--RN|%(HRiMCI)GiW~oNT$)?FBX$GKG!HH>><_1P-W+_Rj z2Bt-s5TmoeszHNNX-VMaYuJmYY_QQeV8x()qn4>A#>SwfzQ$?hiAE{rsmA8UDVAvl zriq3IMY#~8^T4W;LER*C@VpH6;o5w#(FI_|mY|Y7(byo>(!jzbH7O;@(8SonFcGv~ z-oU~v&Ag}(VssH$wE<`cykQckVTL^#i@`>hfE61Wg6?NYNdlcbX<}}gXlaxJTJ~>j zW(rzGZ)QC=nAmnB+#9nMkdCFX33x<-V7|$j4Vxzj10{U z%`MF=lTC{%Ax2k$RfC3PEDe)!8(j@Hx(2M+EGacL#n{-=)Wj&+#3Ieq(lpsT#SC=R zkfDV|Qc`MBEyUk!7N#MNuQf=q9l0WCL?^Gc)i!I`;Cq8EkY5Sh1y%i4o{z$RtBEGZO>DL<_^j zWb+gglVn5VWMgBCq@q@c(QRPWi6%*)BUN!?3o*J6tQvIf0O&MtoMTV@V52916&srwC#RU2CRu>)s7eK` zBnB0NsivlBiRQ)@$p%FeAx2LEt4_2`wMa@$!=2G5gN>d7R-BS%kz`?PZkm{4o@@d- z(>x`~+&Ia|$il?XATh-_v1ls9=xJcpX^?}HL33c()Ae+)(KEn`jSNB8mYGJGm}(MXUR0x+`!x@#VFarEV*bQ#OOs})y9UYMy8gamDxB>ELaRSdI?yuMKWl; zXR?uHl7WdyqFGu}nx&x$=m1`$L<`WJszpm7MlS=ahMtxQ8VSZe<+B`Y^a_aLL{sDB z6thI|LCyw-sfm_`rirGY&aQb8(3 zEnvlI$%&xLLe0#LEX_gd{lV*+j6q}6X=#bZmMKMBAx3WltF|;WHZ(R!2F=`I@7!$% z8@&Up*u)?Obp5iiDd;*AOOv$3w4@}1R1-_Xq%?CQ3(J(Eoe-mUfmMTUATl=tEtxRK zUWV)j8@>I5{mjEzJ_VWzh(9oSB8Gxv8<4QKB*El5m40i=w>{qxXSTgO*?zC8mO! zIM^Fz`@u#ZfGAE%OfyY1O|vw%NCr<{rX?DiSQ@4nSQ;4_BpI0%9fTNt2&~$~EZH*I z1U$%$y>2`VHu?xyvAJ2A323%4$ryCau8{@kW_r-!Txn*>Miz+{W<^IKMjr#K1}zRq z0$tgOtNVW(Z1f4R;#A{Q^Tg!jRAbPRV*_JD%hV(bqeM`D$ucFy#KNfPB*f@bVAYl; zX{Kg|;Aq4iAg94bp8+dQPBk{LFf#!iZDDF+YHXBfU~ZXcX`XBfI;zPu(Y)v^#OQNi z)rRJ2so)kAuDzt^!A4&ID>gSYFiA86ElM&1)lP|t=4PhJMyckh2FV7N21({c7a>Mp z0;^6;HcbYd321<81JPx$(O1BVjm$vnAJU9LcXgW>B_=0Ym?RpRf^wpfnIUN5?p27< z*TAYl$CsoSf*fv+y?uQhZ1fGNVo**29V=sOVPcV%YH4Z-TJ~g;WM*JwnUZQ$bQ5Cq zEwJh&(2g{NWYBOe_A=x)*yuZ8#fb*S#-`vKoD!2vEYm5``(UFVfE9y!qp6^iPC(NG25F{A$;qHQLk&O|lqOjk85KQ* z82t#WI?*D{Fe%XlbOAB;G1bRlqo05ko0u6JnVNwnUd=%VWPs10Offe~HnT{wOinel zD0&Jp`WaX?Xd|D233vxAc2_?K8~p;T7&QN4U}^!ny)G4W2vH(+4Pb|Q_g6K2Y=r3T!iDt&;pgXA&%`7ZTKoiH7CdP?LiJ;xD2Ik4h zX+>WlMt=jVPD?W}Hiz7sgx%HO!AAc8E4ECwG&D6xPBct125mY_1+6hlF|sg7OEfXJ zFf&go`Ux@m7g)84p`nQpXrVT)x!vDjqyK;vr&^er7#O7*TYxsDf_5P$rIG!IyD8n_8(06Kru)Wi_9YTP2( zG&wB^bVE&As!>uAFT`j*i0U+x)D!~?P~C{VrOFRBS^%ur0JLoseD#{Ck%?)NCFszn zWMflH%Os;j3(%$(L5R^pVAY@~H?lASxf;9C!eFCCz=}cJzzocdzylN}hQ^7OX-0;L zhNh`zhQ_I8Y3Aldq7b9Sz^aohQ_M|`zyqJyyGi0;qb0zKL0g=REK*HPlTA!bKs!Q= z%uJKgOw2)tw-}pSniWYxjFtkcHcv7&1zk{ybD~NbY_tqmaY~Z8Wnz-4g=uP3Y&(oz$RER52?%{^0# zL{n2EV>2^jv*aX03uD8SB1MSNN?_H-$%&Shso?E=*jrD^V53#QicM2ZlGD5+^7yVS_7=uIK|AuC?(0v9CSB{ zWtvH%saa~Og-LQ!qG2MaoGQ|U7_9|XoorwXIsgmz*|pkWqjkWF&5caW(@YI4KwIZc z3``S22Vj{Sm>QcIm>C&an5P!$LX6e}tF}xtG60=Tg0r!p4>sBWtk}TJ#LU>lC z(Igdg(X)|-p(*IjYD?o(v!ui#Lx|BvVAY0+sb-0wBQro_+=f_A1TzL3Z30%DY@D2A zXqIG{YHVl@+JFt}e;8R98d!i%{V+%~FEWJ~Z3b2iJp~q&Ww2*-bFk4CV8sTeNhao& zDTc`wCMG6^;I1fW9fWyWYMO;*nyGn_CB$eeuxjX1LD0}R_AFx!HrfWP*d)y|5p?QF zYI2&Xi7Dt1aL_###^x3#DappEW`;$!5TotDszE!b6D=)p_X_O6MmvBN8(EknrJ5&M z8XBe~f^Nc0GD$JEFth~C)*D$ESsD~MLX36-t4=jAO*2bN!d*8ygN=59C^j-pvIJeJ z2)d^>$;{FMG@p}fk(Oj=20HW5sK^y!v>QY=AeBA zX=aIrmL{f2CKjND;YmiR=7y%AbM?)Nd?7~rfmItMo0u9Ifp-dGPa*zbqXQs{QxlDi zl8wwjo9Rp}EG!e#%q^3Qj4aJe)66YWQVfa$Aw~y*RhwEEf{tAQjpAT;buifI5U^qc zV{;QziU z*aFljH8wE=-O+1eW@MHGT8nOxoMvpAY@Cu}YFU&BF**sX+9=V$*f0fr&mH#iIvH$q z3RrPUqDf*(B4`gb38O!g@WdWsYR&}qtn2u4b74)OwGUtf@2>KNe3I9 z0ak2cYHSL+al+KdGR-785!4z>1P$OMnVBS}m|IvDWkQV30;^6jN-{D7UrvsrkDd)S zItQ%S+$hP=#K_RdBqhn*B+1k`5j0I@QuV$uiXtcM2&6 z8(jicY?PdA1iC83!qnW{B-u34!Yny8#ULdm)yU8?DcQ`ls1#y!8CbQ6xmk*t0eJER z`*=t>*yswdVpC9K7qkx1G}RI`G;U#NV3w8)TH>7oIt|UJs1jmy6-xLH%`uWHTenB+$|%bK_*oqE3j>U0~Hl zDTbz&puN4ghFZG8M)!afnjP3)g zPBKnQO*Y3<^7Vs_o&Z*CY;0W@(fP+FW31YHSJGAZeUpnqp*RU{Ev>V)P`i zYQvO73)4h1P}3cIfJ_D(Jq4`TzyNeat(l=^BIt%v%R~!P10zcd!=zM;loZgldPP$q zMo$B)235?7pz8r}m3-5|M$Z5%Ha9dhPcbnxvM@|dGf6TA^&&wRwpf}P8l_oUq$U;3 zgcv;wtUA%aGR-^%GzfrWsAV?T=s94;pyO1`&5csh(h^fm3_*w3CRv!985<|1nHw6L zBpMXWg%~{#tUA>MwD%_sltQpKapr@KUI12XlmZ%sOG!&f1f7m!l$vN^m}-#-TEuLY zVws$5TC@;i^dhio=v)D)VTL`+ECw6B1gtnU(a Date: Sat, 28 May 2016 14:15:13 +0200 Subject: [PATCH 18/43] - Stadttypen aktualisiert --- targets.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/targets.json b/targets.json index d8b5c9b..98be57c 100644 --- a/targets.json +++ b/targets.json @@ -95,7 +95,7 @@ {"town" : "Emsdetten"} ], "domaene_18" : [ - {"city" : "Greven"} + {"town" : "Greven"} ], "domaene_19" : [ {"town" : "Neuenkirchen"} @@ -104,32 +104,32 @@ {"town" : "Emsdetten"} ], "domaene_21" : [ - {"city" : "Rheine"} + {"town" : "Rheine"} ], "domaene_22" : [ - {"city" : "Steinfurt"} + {"town" : "Steinfurt"} ], "domaene_23" : [ - {"town" : "Altenberge"}, + {"village" : "Altenberge"}, {"town" : "Horstmar"}, - {"town" : "Laer"}, - {"town" : "Metelen"}, - {"town" : "Nordwalde"} + {"village" : "Laer"}, + {"village" : "Metelen"}, + {"village" : "Nordwalde"} ], "domaene_24" : [ - {"town" : "Wettringen"} + {"village" : "Wettringen"} ], "domaene_25" : [ - {"city" : "Ibbenbüren"}, - {"town" : "Ladbergen"}, + {"town" : "Ibbenbüren"}, + {"village" : "Ladbergen"}, {"town" : "Lengerich"}, - {"town" : "Lienen"}, + {"village" : "Lienen"}, {"town" : "Tecklenburg"} ], "domaene_26" : [ - {"city" : "Borken"} + {"town" : "Borken"} ], "domaene_27" : [ - {"city" : "Selm"} + {"town" : "Selm"} ] } From e425d81f37b14f5ee1c3ad10004fa66b394f0840 Mon Sep 17 00:00:00 2001 From: brokenbike Date: Sat, 28 May 2016 14:40:04 +0200 Subject: [PATCH 19/43] Update README.md typos --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 053f1c6..f19130e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Im einfachsten Fall wird das Programm dann wie folgt aufgerufen: ./node_hierarcy.py --all ``` -Sollen spezielle ``nodes.json`` und ``graph.json`` Dateien verwendet werden, so kann der Datenpfad wie folgt angegeben werden (dabei kann es sich um einen lokalen Dateipfad als auch um eine http oder https URL handel): +Sollen spezielle ``nodes.json`` und ``graph.json`` Dateien verwendet werden, so kann der Datenpfad wie folgt angegeben werden (dabei kann es sich sowohl um einen lokalen Dateipfad, als auch um eine http oder https URL handeln): ``` ./node_hierarcy.py --all --json-path https://service.freifunk-muensterland.de/maps/data/ @@ -29,13 +29,13 @@ Eine Limitierung auf eine Auswahl an Targets aus der Targets-Datei kann mit dem ./node_hierarcy.py -t domaene_01 domaene_02 --print-status ``` -Weitere Hilfestellungen erhält mann mit ``-h`` oder ``--help``: +Weitere Hilfestellungen erhält man mit ``-h`` oder ``--help``: ``` ./node_hierarcy.py ``` ### Ein- und Ausgabe -Standardmäßig wird eine Datei ``targets.json`` erwartet. Soll diese Datei von einer anderen Stelle aufgerufen werden kann das ``--targets-file``-Argument verwendet werden: +Standardmäßig wird eine Datei ``targets.json`` erwartet. Soll diese Datei von einer anderen Stelle aufgerufen werden, kann das ``--targets-file``-Argument verwendet werden: ``` ./node_hierarcy.py --targets-file /root/targets.json ``` @@ -43,4 +43,4 @@ Standardmäßig wird eine Datei ``targets.json`` erwartet. Soll diese Datei von Standardmäßig erfolgt die Ausgabe der generierten nginx-Konfigurationsdateien in das Verzeichnis ``./webserver-configuration/``. Das kann mit dem Schalter ``--out-path`` geändert werden: ``` ./node_hierarcy.py --out-path /root/config/ -``` \ No newline at end of file +``` From 0b845a0a5266dd6a3c52788dd51524c9ddb4d5a2 Mon Sep 17 00:00:00 2001 From: Matthias Walther Date: Sat, 28 May 2016 19:40:58 +0200 Subject: [PATCH 20/43] - Ochtrup korrigiert --- targets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets.json b/targets.json index 98be57c..aa6c6c8 100644 --- a/targets.json +++ b/targets.json @@ -101,7 +101,7 @@ {"town" : "Neuenkirchen"} ], "domaene_20" : [ - {"town" : "Emsdetten"} + {"town" : "Ochtrup"} ], "domaene_21" : [ {"town" : "Rheine"} From ff7105eedce8167e7cc94841d624961223cdd711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 29 May 2016 18:56:50 +0200 Subject: [PATCH 21/43] Initial commit of version 2 --- .gitignore | 7 +++ LICENSE.txt | 21 +++++++ NodeHierarchy.py | 78 +++++++++++++++++++++++ README.md | 105 +++++++++++++++++++++++++++++++ cloud/Domaene.py | 23 +++++++ cloud/GlobalGraph.py | 46 ++++++++++++++ cloud/Graph.py | 45 +++++++++++++ cloud/Link.py | 52 +++++++++++++++ cloud/LocalGraph.py | 118 +++++++++++++++++++++++++++++++++++ cloud/Node.py | 4 ++ cloud/NodeInit.py | 54 ++++++++++++++++ cloud/__init__.py | 0 exceptions/HieraException.py | 3 + exceptions/__init__.py | 0 generator/Filter.py | 28 +++++++++ generator/NginxConfGen.py | 44 +++++++++++++ generator/__init__.py | 0 parser/GraphParser.py | 34 ++++++++++ parser/JsonParser.py | 25 ++++++++ parser/NodesParser.py | 20 ++++++ parser/ShapesParser.py | 12 ++++ parser/__init__.py | 0 webserver-configuration | 63 +++++++++++++++++++ 23 files changed, 782 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100755 NodeHierarchy.py create mode 100644 README.md create mode 100644 cloud/Domaene.py create mode 100644 cloud/GlobalGraph.py create mode 100644 cloud/Graph.py create mode 100644 cloud/Link.py create mode 100644 cloud/LocalGraph.py create mode 100644 cloud/Node.py create mode 100644 cloud/NodeInit.py create mode 100644 cloud/__init__.py create mode 100644 exceptions/HieraException.py create mode 100644 exceptions/__init__.py create mode 100644 generator/Filter.py create mode 100644 generator/NginxConfGen.py create mode 100644 generator/__init__.py create mode 100644 parser/GraphParser.py create mode 100644 parser/JsonParser.py create mode 100644 parser/NodesParser.py create mode 100644 parser/ShapesParser.py create mode 100644 parser/__init__.py create mode 100644 webserver-configuration diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6461a9f --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.project +.pydevproject +./webserver-configuration +*.pyc +*.pyo + + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8093f13 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Simon Wüllhorst + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/NodeHierarchy.py b/NodeHierarchy.py new file mode 100755 index 0000000..376594e --- /dev/null +++ b/NodeHierarchy.py @@ -0,0 +1,78 @@ +#!/usr/bin/python3 +import argparse +from parser.NodesParser import NodesParser +from parser.GraphParser import GraphParser +from cloud.Node import Node +from cloud.Link import Link +from cloud.GlobalGraph import GlobalGraph +from parser.ShapesParser import ShapesParser +from cloud.Domaene import Domaene +from generator.NginxConfGen import NginxConfGen + +class NodeHierarchy(object): + def __init__(self): + self.__args__ = self.__parseArguments__() + self.__nodesJson__ = NodesParser(self.__args__.json_path) + self.__graphJson__ = GraphParser(self.__args__.json_path) + self.__shapesJson__ = self.__parseShapes__() + self.nodes = self.__createNodeObjects__() + self.links = self.__createLinkObjects__() + self.globalGraph = self.__createGlobalGraph__() + self.domains = self.__createDomains__() + self.nginxConf = NginxConfGen(self.domains, self.__args__) + self.nginxConf.writeNginxConfigFile() + + def __parseShapes__(self): + shapesJson = {} + for targetName in self.__args__.targets: + shapesJson[targetName] = ShapesParser(self.__args__.shapes_path, targetName) + return shapesJson + + def __createDomains__(self): + domains = {} + for k, v in self.__shapesJson__.items(): + print('Create Domain object #',len(domains), '\r',end = '') + domains[k] = Domaene(k,v, self.globalGraph) + print('') + return domains + + def __createNodeObjects__(self): + nodes = {} + for nodeID, nodeValue in self.__nodesJson__.nodes.items(): + print('Create Node object #',len(nodes), '\r',end = '') + nodes[nodeID] = Node(nodeValue) + print('') + return nodes + + def __createLinkObjects__(self): + links = [] + for link in self.__graphJson__.links: + try: + srcNode = self.nodes[link['source']['node_id']] + except: + srcNode = None + try: + dstNode = self.nodes[link['target']['node_id']] + except: + dstNode = None + + print('Create Link object #',len(links), '\r',end = '') + links.append(Link(link, srcNode, dstNode)) + print('') + return links + + def __createGlobalGraph__(self): + return GlobalGraph(self.nodes, self.links, self.__args__.debug) + + def __parseArguments__(self): + parser = argparse.ArgumentParser(description='This Script generates a hierarchical nodes list for node migration using nginx geo feature.') + parser.add_argument('-j', '--json-path', required=False, default='https://service.freifunk-muensterland.de/maps/data/', help='Path of nodes.json and graph.json (can be local folder or remote URL).') + parser.add_argument('-s', '--shapes-path', required=False, default='https://freifunk-muensterland.de/md-fw-dl/shapes/', help='Path of shapefiles (can be local folder or remote URL).') + parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...') + parser.add_argument('-o', '--out-file', required=False, help='Filename where the generated Output should stored.', default='./webserver-configuration') + parser.add_argument('-v', '--debug', required=False, action='store_true', help='Enable debugging output.') + parser.add_argument('-f', '--filters', nargs='*', required=False, help='Filter out nodes and local clouds based on filter rules') + + return parser.parse_args() + +NodeHierarchy() diff --git a/README.md b/README.md new file mode 100644 index 0000000..18eddd9 --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ +# Node Hierarchy +Dieses Tool generiert auf Basis einer graph.json und nodes.json des [Meshviewers](https://github.com/ffnord/meshviewer/) sowie (Multi-)Polygonen (im [geojson](http://geojson.org/) Format) der einzelnen Zieldomänen eine [nginx](http://nginx.org/) Konfigurationsdatei (auf Basis des [Geo-Moduls](http://nginx.org/en/docs/http/ngx_http_geo_module.html)), um Knoten in der richtigen Reihenfolge umzuziehen. + + +## Vorgehensweise +Das Tool zerteilt den (globalen) Graphen in viele lokale Graphen, also die Menge an Knoten (und Links), die vor Ort ein Mesh bilden. Diese werden auf Basis der Shapefiles den einzelnen Zieldomänen zugeordnet (es werden die GeoPositionen der einzelnen Knoten "gemittelt"). Hier wird nun geprüft, welche Knoten keine Abhängigkeiten besitzen, also kein anderer Knoten über diesen Knoten gehen muss um einen Gatewayserver zu erreichen. Diese werden dann in die Konfiguration geschrieben. Sind diese Knoten aktualisiert, fällt die Abhängigkeit des Knoten weg, der zuvor benötigt wurde um das Gateway zu erreichen. +Daher muss das Tool regelmäßig ausgeführt werden und die Ausgabe jeweils in die nginx Konfiguration übernommen werden. + + +## Abhängigkeiten +Das Tool läuft ausschließlich mit **Python >= 3**. +Folgende (Python-)Abhängigkeiten werden benötigt: + +- [shapely](https://pypi.python.org/pypi/Shapely) + +Diese lassen sich wie folgt via [pip](https://pypi.python.org/pypi/pip) installieren: + +``` +pip3 install shapely +``` + + +## Bedienung +Das Tool wird ausschließlich über Argumente beim Aufruf konfiguriert. + +Die Hilfe liefert folgendes: + +``` +$ ./NodeHierarchy.py --help +usage: NodeHierarchy.py [-h] [-j JSON_PATH] [-s SHAPES_PATH] -t TARGETS + [TARGETS ...] [-o OUT_FILE] [-v] + [-f [FILTERS [FILTERS ...]]] + +This Script generates a hierarchical nodes list for node migration using nginx +geo feature. + +optional arguments: + -h, --help show this help message and exit + -j JSON_PATH, --json-path JSON_PATH + Path of nodes.json and graph.json (can be local folder + or remote URL). + -s SHAPES_PATH, --shapes-path SHAPES_PATH + Path of shapefiles (can be local folder or remote + URL). + -t TARGETS [TARGETS ...], --targets TARGETS [TARGETS ...] + List of targets which should be proceeded. Example: -t + citya cityb ... + -o OUT_FILE, --out-file OUT_FILE + Filename where the generated Output should stored. + -v, --debug Enable debugging output. + -f [FILTERS [FILTERS ...]], --filters [FILTERS [FILTERS ...]] + Filter out nodes and local clouds based on filter + rules +``` + + +### Anmerkungen + +- ``--targets`` Gibt die Namen der Ziele (Zieldomänen) an. Der Geo-Schalter in der nginx Konfiguration wird ebenfalls diesen Namen tragen. +- ``--json-path`` Gibt das Daten-Verzeichnis eures Meshviewers an. Default: ``https://service.freifunk-muensterland.de/maps/data/`` +- ``--shapes-path`` Verzeichnis an dem die Shapefiles der einzelnen Ziel-Domänen liegen. Default: ``https://freifunk-muensterland.de/md-fw-dl/shapes/`` + - *Anmerkung:* Es werden Dateien in Abhängigkeit mit den Target-Namen im Verzeichnis erwartet. + - *Beispiel:* Bei ``-targets domaene01 domaene02`` werden die Dateien ``domaene01.geojson`` und ``domaene02.geojson`` erwartet. + - Falls ihr hier mehr Anpassbarkeit benötigt, eröffnet ein Issue, dann baue ich da was ein. +- ``--filters`` Siehe Abschnitt *Filter*. + +Der Rest ist trivial. + + +### Filter +Standardmäßig werden alle Knoten ausgefiltert, die offline sind. +Außerdem werden alle lokalen Wolken ausgefiltert, in denen sich mindstens ein Knoten mit deaktiviertem Autoupdater befindet. + +Weitere Filterungen lassen sich über das ``--filters`` Attribut aktivieren. + +Folgende Filter sind derzeit implementiert (zukünftig folgen noch weitere): + +- ``exclude_clouds_with_lan_links`` bzw. ``no_lan`` Filtert alle lokalen Wolken aus, in denen sich mindestens ein Mesh-on-LAN Link befindet + + +## Nginx Konfiguration +Das Tool generiert nur Konfigurationscode, der Schalter auf basis von IPv6 Adressen beinhaltet. Die Auswirkungen, die diese Schalter haben sollen müsst ihr noch selbst definieren. Typischerweise möchte man auf Basis der Schalter einen Rewrite machen. + +Beispiel: + +``` +if ($domaene01) { + rewrite ^/site-ffms/(.*)$ /domaene01/$1; +} +``` + +*Anmerkung:* Bei $domane01 handelt es sich um den generierten Schalter, entspricht also ``--targets domaene01``. + + +## Bekannte Probleme +Wenn es sich bei der Quell-Domäne um eine L2TP Domäne handelt, läuft das Tool derzeit nur, wenn [alfred](https://github.com/ffnord/ffnord-alfred-announce) auf allen Gateway-Servern läuft. + +*Anmerkung:* Wenn in der ``nodes.json`` und ``graph.json`` mehrere Domänen vorhanden sind und dort teilweise L2TP Domänen vorhanden sind (dieses aber nicht das Gebiet eurer Zieldomäne betrifft), kann das sehr negative Auswirkungen auf die Laufzeit haben (> 30 Sekunden). + + +## Lizenz +Dieses Tool unterliegt der MIT Lizenz. +Solltet ihr Probleme mit dieser Lizensierung haben, schreibt mich einfach an. ;) + +2016 - Simon Wüllhorst diff --git a/cloud/Domaene.py b/cloud/Domaene.py new file mode 100644 index 0000000..b8795a3 --- /dev/null +++ b/cloud/Domaene.py @@ -0,0 +1,23 @@ +from cloud.LocalGraph import LocalGraph +class Domaene(object): + def __init__(self, name, shapes, globalGraph): + self.name = name + self.__shapes__ = shapes + self.__globalGraph__ = globalGraph + self.localGraphs = self.__getLocalGraphsInDomaene__() + + def __getLocalGraphsInDomaene__(self): + graphs = [] + for localGraph in self.__globalGraph__.localGraphs: + if self.isLocalGraphInDomaene(localGraph) == True: + graphs.append(localGraph) + return graphs + + def isLocalGraphInDomaene(self, localGraph): + return self.isPointInDomaene(localGraph.getGeoCenterOfNodeCloud()) + + def isPointInDomaene(self, point): + for shape in self.__shapes__.shapes: + if point.within(shape): + return True + return False diff --git a/cloud/GlobalGraph.py b/cloud/GlobalGraph.py new file mode 100644 index 0000000..d5c42d1 --- /dev/null +++ b/cloud/GlobalGraph.py @@ -0,0 +1,46 @@ +from cloud.LocalGraph import LocalGraph +from cloud.Graph import Graph +from exceptions.HieraException import HieraException +class GlobalGraph(Graph): + def __init__(self, nodes, links, debugPrint = False): + super().__init__(nodes, links) + self.__enableDebugPrinting__ = debugPrint + self.localGraphs = self.__buildLocalGraphs__() + + if self.__enableDebugPrinting__: + self.__debugPrint__() + + def __buildLocalGraphs__(self): + nodeIDs = self.getListOfNodeIDsOnline() + localGraphs = [] + while len(nodeIDs) > 0: + connectedNodes = self.__getConnectedNodes__(nodeIDs[0]) + try: + localGraphs.append(self.__createLocalCloudByNodesList__(connectedNodes)) + print('Create LocalGraph object #',len(localGraphs), '\r',end = '') + except HieraException: + print('Was not able to add local cloud, because no VPN link was found.') + nodeIDs = [x for x in nodeIDs if x not in connectedNodes] + print('') + return localGraphs + + def __getConnectedNodes__(self, nodeID, trace = []): + neighNodeIDs = self.getNeighbourNodeIDsForNodeID(nodeID) + trace_new = trace[:] + [x for x in neighNodeIDs if x not in trace] + for neighNodeID in neighNodeIDs: + if neighNodeID not in trace: + trace_new = trace_new + [x for x in self.__getConnectedNodes__(neighNodeID, trace_new) if x not in trace_new] + return trace_new + + def __createLocalCloudByNodesList__(self, nodesIDList): + nodes = {} + links = [] + for nodeID in nodesIDList: + nodes[nodeID] = self.__nodes__[nodeID] + links = links + [x for x in self.getLinksByNodeID(nodeID) if x not in links] + return LocalGraph(nodes, links, self.__enableDebugPrinting__) + + def __debugPrint__(self): + for localGraph in self.localGraphs: + for node in localGraph.getNodesWithNoDependencies(): + print(node.hostname, node.publicIPv6Addresses) diff --git a/cloud/Graph.py b/cloud/Graph.py new file mode 100644 index 0000000..6f7b9e1 --- /dev/null +++ b/cloud/Graph.py @@ -0,0 +1,45 @@ +from oauthlib.oauth1.rfc5849 import endpoints +class Graph(object): + def __init__(self, nodes, links): + self.__nodes__ = nodes + self.__links__ = links + + def getListOfNodeIDs(self, getGateways = False): + nodeIDs = [] + for k, v in self.__nodes__.items(): + if getGateways == True or v.isGateway == False: + nodeIDs.append(k) + return nodeIDs + + def getListOfNodeIDsOnline(self, getGateways = False): + onlineNodeIDs = [] + nodeIDs = self.getListOfNodeIDs(getGateways) + for nodeID in nodeIDs: + if self.__nodes__[nodeID].isOnline == True: + onlineNodeIDs.append(nodeID) + return onlineNodeIDs + + def getNeighbourNodeIDsForNodeID(self, nodeID): + neighNodeIDs = [nodeID] + endpoints = [] + for link in self.__links__: + if link.isVpn == False: + endpoints = link.getEndpointNodeIDs(getGateways = False) + if nodeID in endpoints: + neighNodeIDs = neighNodeIDs + [x for x in endpoints if x not in neighNodeIDs] + return neighNodeIDs + + def getLinksByNodeID(self, nodeID): + links = [] + for link in self.__links__: + endpoints = link.getEndpointNodeIDs() + if nodeID in endpoints: + if link not in links: + links.append(link) + return links + + def getLinkCount(self): + return len(self.__links__) + + def getNodesCount(self): + return len(self.__nodes__) diff --git a/cloud/Link.py b/cloud/Link.py new file mode 100644 index 0000000..25be9f3 --- /dev/null +++ b/cloud/Link.py @@ -0,0 +1,52 @@ +class Link(object): + def __init__(self, LinkJsonObject, srcNode, dstNode): + self.__jsonObject__ = LinkJsonObject + self.__srcNode__ = srcNode + self.__dstNode__ = dstNode + self.linkType = self.__getLinkType__() + self.isVpn = self.__getLinkVpnState__() + + + def __getLinkType__(self): + if self.__srcNode__ != None: + for k, v in self.__srcNode__.interfaces.items(): + if self.__jsonObject__['source']['interface_mac'] in v: + return k + if self.__dstNode__ != None: + for k, v in self.__dstNode__.interfaces.items(): + if self.__jsonObject__['target']['interface_mac'] in v: + return k + return 'unknown' + + def __getLinkVpnState__(self): + if self.__jsonObject__['vpn'] == True: + return True + for node in self.getEndpointNodes(getGateways = True): + if node.isGateway == True: + return True + return False + + def getEndpointNodes(self, getGateways = False): + nodes = [] + if self.__srcNode__ != None: + if getGateways == True or self.__srcNode__.isGateway == False: + nodes.append(self.__srcNode__) + if self.__dstNode__ != None: + if getGateways == True or self.__dstNode__.isGateway == False: + nodes.append(self.__dstNode__) + return nodes + + def getEndpointNodeIDs(self, getGateways = True): + nodeIDs = [] + for node in self.getEndpointNodes(getGateways): + nodeIDs.append(node.nodeID) + return nodeIDs + + def isNodeIDinLink(self, nodeID): + for endpoint in self.getEndpointNodes(): + if endpoint.nodeID == nodeID: + return True + return False + + def isNodeInLink(self, node): + return self.isNodeIDinLink(node.nodeID) diff --git a/cloud/LocalGraph.py b/cloud/LocalGraph.py new file mode 100644 index 0000000..eb3ac93 --- /dev/null +++ b/cloud/LocalGraph.py @@ -0,0 +1,118 @@ +from cloud.Graph import Graph +from shapely.geometry import MultiPoint +from exceptions.HieraException import HieraException +class LocalGraph(Graph): + def __init__(self, nodes, links, debugPrint = False): + super().__init__(nodes, links) + self.__enableDebugPrinting__ = debugPrint + if self.__enableDebugPrinting__: + self.__debugPrint__() + + def getNodesWithVpn(self): + nodes = [] + for link in self.__links__: + if link.isVpn == True: + nodes = nodes + [x for x in link.getEndpointNodes() if x not in nodes] + return nodes + + def getCountOfNodesWithVpn(self): + return len(self.getNodesWithVpn()) + + def getDeptOfNode(self, node): + return self.getDeptOfNodeByID(node.nodeID, []) + + def getDeptOfNodeByID(self, nodeID, trace): + if self.getCountOfNodesWithVpn() == 0: + raise HieraException('No VPN Node in LocalCloud was found!') + new_trace = trace[:] + new_trace.append(nodeID) + lowestDepth = None + currentDept = None + links = self.getLinksByNodeID(nodeID) + endpoints = [] + for link in links: + endpoints = endpoints + [x for x in link.getEndpointNodeIDs() if x not in endpoints] + if link.isVpn == True: + return 0 + for childNodeID in endpoints: + if childNodeID not in new_trace: + currentDept = self.getDeptOfNodeByID(childNodeID, new_trace + endpoints) + if currentDept != None: + currentDept = currentDept + 1 + if lowestDepth == None or currentDept < lowestDepth: + lowestDepth = currentDept + return lowestDepth + + def getMaxDepth(self): + maxDepth = 0 + for k,v in self.__nodes__.items(): + nodeDepth = self.getDeptOfNode(v) + maxDepth = nodeDepth if nodeDepth > maxDepth else maxDepth + return maxDepth + + def getAllNodesWithDepthEquals(self, depth): + nodes = [] + for k,v in self.__nodes__.items(): + if self.getDeptOfNode(v) == depth: + nodes.append(v) + return nodes + + def getNodesWithNoDependencies(self): + #TODO: Implement smarter selection + return self.getAllNodesWithDepthEquals(self.getMaxDepth()) + + def isAutoupdaterEnabledOnAllNodes(self): + for k, v in self.__nodes__.items(): + if v.isAutoupdaterEnabled == False: + return False + return True + + def getLanLinksInCloud(self): + links = [] + for link in self.__links__: + if link.linkType == 'other' and link.isVpn == False: + links.append(link) + return links + + def areLanLinksInCloud(self): + for link in self.__links__: + if link.linkType == 'other' and link.isVpn == False: + return True + return False + + def getBranchesThatExistsInCloud(self): + branches = [] + for k, v in self.__nodes__.items(): + if v.autoupdaterBranch not in branches: + branches.append(v.autoupdaterBranch) + return branches + + def getGeoCenterOfNodeCloud(self): + geoPoints = [] + for k, v in self.__nodes__.items(): + if v.geo != None: + geoPoints.append((v.geo['lon'], v.geo['lat'])) + return MultiPoint(geoPoints).representative_point() + + def __debugPrint__(self): + print('nodes:') + for k,v in self.__nodes__.items(): + print('>',v.hostname) + + print('nodes with vpn:') + for node in self.getNodesWithVpn(): + print('>',node.hostname) + + print('nodes with no dependencies:') + for node in self.getNodesWithNoDependencies(): + print('>', node.hostname) + + print('maxdepth:', self.getMaxDepth()) + print('isAutoupdaterEnabledOnAllNodes:', self.isAutoupdaterEnabledOnAllNodes()) + print('areLanLinksInCloud:', self.areLanLinksInCloud()) + print('BranchesThatExistsInCloud:', self.getBranchesThatExistsInCloud()) + print('lan links in cloud:') + for link in self.getLanLinksInCloud(): + if link.__srcNode__ != None and link.__dstNode__ != None: + print(' ', link.__srcNode__.hostname, '<--->', link.__dstNode__.hostname) + print('=====') diff --git a/cloud/Node.py b/cloud/Node.py new file mode 100644 index 0000000..6eff33b --- /dev/null +++ b/cloud/Node.py @@ -0,0 +1,4 @@ +from cloud.NodeInit import NodeInit +class Node(NodeInit): + def __init__(self, NodeJsonObject): + super().__init__(NodeJsonObject) diff --git a/cloud/NodeInit.py b/cloud/NodeInit.py new file mode 100644 index 0000000..2f96d62 --- /dev/null +++ b/cloud/NodeInit.py @@ -0,0 +1,54 @@ +class NodeInit(object): + def __init__(self, NodeJsonObject): + self.__jsonObject__ = NodeJsonObject + self.nodeID = self.__jsonObject__['nodeinfo']['node_id'] + self.interfaces = self.__getInterfaces__() + self.hostname = self.__jsonObject__['nodeinfo']['hostname'] + self.isGateway = self.__jsonObject__['flags']['gateway'] + self.geo = self.__getGeo__() + self.isAutoupdaterEnabled = self.__getAutoupdaterStatus__() + self.autoupdaterBranch = self.__getBranch__() + self.isOnline = self.__jsonObject__['flags']['online'] + self.publicIPv6Addresses = self.__getPublicAddresses__() + self.domID = self.__getSiteCode__() + + def __getInterfaces__(self): + try: + return self.__jsonObject__['nodeinfo']['network']['mesh']['bat0']['interfaces'] + except: + return {} + + def __getAutoupdaterStatus__(self): + if 'autoupdater' in self.__jsonObject__['nodeinfo']['software']: + return self.__jsonObject__['nodeinfo']['software']['autoupdater']['enabled'] + else: + return False + + def __getBranch__(self): + if 'autoupdater' in self.__jsonObject__['nodeinfo']['software']: + return self.__jsonObject__['nodeinfo']['software']['autoupdater']['branch'] + else: + return None + + def __getGeo__(self): + geo = {} + if 'location' in self.__jsonObject__['nodeinfo'] and 'latitude' in self.__jsonObject__['nodeinfo']['location'] and 'longitude' in self.__jsonObject__['nodeinfo']['location']: + geo['lat'] = self.__jsonObject__['nodeinfo']['location']['latitude'] + geo['lon'] = self.__jsonObject__['nodeinfo']['location']['longitude'] + return geo + return None + + def __getPublicAddresses__(self): + addresses = [] + if 'addresses' in self.__jsonObject__['nodeinfo']['network']: + for address in self.__jsonObject__['nodeinfo']['network']['addresses']: + #TODO: make more generic + if address.startswith('2a03'): + addresses.append(address) + return addresses + + def __getSiteCode__(self): + try: + return self.__jsonObject__['nodeinfo']['system']['site_code'] + except: + return None diff --git a/cloud/__init__.py b/cloud/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exceptions/HieraException.py b/exceptions/HieraException.py new file mode 100644 index 0000000..07008ff --- /dev/null +++ b/exceptions/HieraException.py @@ -0,0 +1,3 @@ +class HieraException(Exception): + def __init__(self, message = ''): + super().__init__(message) diff --git a/exceptions/__init__.py b/exceptions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/generator/Filter.py b/generator/Filter.py new file mode 100644 index 0000000..fad49c6 --- /dev/null +++ b/generator/Filter.py @@ -0,0 +1,28 @@ +class Filter(object): + def __init__(self, args): + self.__args__ = args + self.__filters__ = self.__getFilters() + + def filterLocalGraphs(self, localGraphs): + filteredGraphs = [] + for localGraph in localGraphs: + if localGraph.isAutoupdaterEnabledOnAllNodes() == False: + continue + if self.__allowCloudsWithLanLinks__() == False and len(localGraph.getLanLinksInCloud()) > 0: + continue + filteredGraphs.append(localGraph) + return filteredGraphs + + def __allowCloudsWithLanLinks__(self): + if 'exclude_clouds_with_lan_links' in self.__filters__ or 'no_lan' in self.__filters__: + return False + return True + + def __getFilters(self): + return [] if self.__args__.filters == None else self.__args__.filters + + def filterNodes(self, nodes): + filteredNodes = [] + for node in nodes: + filteredNodes.append(node) + return filteredNodes diff --git a/generator/NginxConfGen.py b/generator/NginxConfGen.py new file mode 100644 index 0000000..2f827a6 --- /dev/null +++ b/generator/NginxConfGen.py @@ -0,0 +1,44 @@ +from exceptions.HieraException import HieraException +from generator.Filter import Filter +class NginxConfGen(object): + def __init__(self, domains, args): + self.__domains__ = domains + self.__args__ = args + self.__filter__ = Filter(self.__args__) + self.__generatedDomains__ = self.__genDomains__() + + def __genDomains__(self): + domains = {} + for k,v in self.__domains__.items(): + domains[k] = self.__genDomain__(v) + return domains + + def __genDomain__(self, domain): + nodes = {} + for localGraph in self.__filter__.filterLocalGraphs(domain.localGraphs): + try: + for node in self.__filter__.filterNodes(localGraph.getNodesWithNoDependencies()): + nodes[node.nodeID] = { + 'hostname' : node.hostname, + 'ipv6_addresses' : node.publicIPv6Addresses + } + except HieraException: + print('Was not able to add local cloud, because no VPN link was found.') + + return nodes + + def writeNginxConfigFile(self): + f = open(self.__args__.out_file,'w') + f.write(self.__genNginxConfigFileContent__()) + f.close() + + def __genNginxConfigFileContent__(self): + content = '' + for k, v in self.__generatedDomains__.items(): + content += 'geo $' + k + ' {\n default 0;' + for ksub, vsub in v.items(): + for address in vsub['ipv6_addresses']: + content += '\n ' + address + ' 1; #' + vsub['hostname'] + content += '\n}\n' + return content + \ No newline at end of file diff --git a/generator/__init__.py b/generator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/parser/GraphParser.py b/parser/GraphParser.py new file mode 100644 index 0000000..ed99602 --- /dev/null +++ b/parser/GraphParser.py @@ -0,0 +1,34 @@ +from parser.JsonParser import JsonParser + +class GraphParser(JsonParser): + def __init__(self, filePath): + super().__init__(filePath.rstrip('/')+'/graph.json') + self.links = self.__prettyFormGraph__() + + def __prettyFormGraph__(self): + links = [] + for link in self.__jsonData__['batadv']['links']: + prettyLink = link + prettyLink['target'] = self.__getEndpointData__(self.__jsonData__['batadv']['nodes'][link['target']]) + prettyLink['source'] = self.__getEndpointData__(self.__jsonData__['batadv']['nodes'][link['source']]) + links.append(prettyLink) + return links + + def __getEndpointData__(self, endpoint): + data = {} + if endpoint: + if 'id' in endpoint: + data['interface_mac'] = endpoint['id'] + if 'node_id' in endpoint: + data['node_id'] = endpoint['node_id'] + return data + else: + return None + + + def getLinksForNodeID(self, nodeID): + links = [] + for link in self.links: + if link['target']['node_id'] == nodeID or link['source']['node_id'] == nodeID: + links.append(link) + return links diff --git a/parser/JsonParser.py b/parser/JsonParser.py new file mode 100644 index 0000000..8ba4db2 --- /dev/null +++ b/parser/JsonParser.py @@ -0,0 +1,25 @@ +import json, urllib.request +from exceptions.HieraException import HieraException + +class JsonParser(object): + def __init__(self, fileName): + self.printStatus = True + self.__jsonData__ = self.__getFile__(fileName) + + def __getFile__(self, fileName): + if fileName.startswith('https://') or fileName.startswith('http://'): + if self.printStatus: + print('Download', fileName.rsplit('/', 1)[1] , 'from URL:', fileName) + resource = urllib.request.urlopen(fileName) + else: + if self.printStatus: + print('Open', fileName.rsplit('/', 1)[1] , 'from file:', fileName) + resource = open(fileName) + try: + data = json.loads(resource.read().decode('utf-8')) + except: + raise HieraException('Error while parsing a json file (perhapes misformed file): ' + fileName) + finally: + resource.close() + + return data diff --git a/parser/NodesParser.py b/parser/NodesParser.py new file mode 100644 index 0000000..97d2d53 --- /dev/null +++ b/parser/NodesParser.py @@ -0,0 +1,20 @@ +from parser.JsonParser import JsonParser + +class NodesParser(JsonParser): + def __init__(self, filePath): + super().__init__(filePath.rstrip('/')+'/nodes.json') + self.nodes = self.__jsonData__['nodes'] + #print(self.nodes) + pass + + def getNodeByID(self, nodeID): + if nodeID in self.nodes: + return self.nodes[nodeID] + else: + return None + + def getListOfNodeIDs(self): + IDlist = [] + for k, v in self.nodes.items(): + IDlist.append(k) + return IDlist diff --git a/parser/ShapesParser.py b/parser/ShapesParser.py new file mode 100644 index 0000000..a0748b4 --- /dev/null +++ b/parser/ShapesParser.py @@ -0,0 +1,12 @@ +from parser.JsonParser import JsonParser +from shapely.geometry import shape +class ShapesParser(JsonParser): + def __init__(self, filePath, targetName): + super().__init__(filePath.rstrip('/') + '/' + targetName + '.geojson') + self.shapes = self.__createShapes__() + + def __createShapes__(self): + shapes = [] + for feature in self.__jsonData__['features']: + shapes.append(shape(feature['geometry'])) + return shapes diff --git a/parser/__init__.py b/parser/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webserver-configuration b/webserver-configuration new file mode 100644 index 0000000..e2e1cc9 --- /dev/null +++ b/webserver-configuration @@ -0,0 +1,63 @@ +geo $domaene21 { + default 0; + 2a03:2260:115:400:62e3:27ff:fe81:fd08 1; #Mesum-0009-Schuhhaus-Franke + 2a03:2260:115:400:c66e:1fff:fefe:c0c2 1; #R.h.eine_Raeder + 2a03:2260:115:400:62e3:27ff:fe82:156 1; #Steinfurt-Elte-Britta-Buelter-0018 + 2a03:2260:115:400:32b5:c2ff:fe82:8b2b 1; #Mesum-0025 + 2a03:2260:115:400:c6e9:84ff:feb5:f052 1; #Steinfurt-Elte-0004 + 2a03:2260:115:400:62e3:27ff:fe59:e0ae 1; #Steinfurt-Elte-Ferienhaus-Wueller-0008 + 2a03:2260:115:400:c66e:1fff:fe2e:14fe 1; #klick.news + 2a03:2260:115:400:62e3:27ff:fe57:4a4a 1; #Fahrschule_Hinzmann + 2a03:2260:115:400:62e3:27ff:fe9f:5c82 1; #freifunk-RheineTFH + 2a03:2260:115:400:62e3:27ff:fe82:194 1; #Steinfurt-Elte-Jays-Pizza-0020 + 2a03:2260:115:400:c6e9:84ff:fe5a:fefc 1; #www.ev-jugendhilfe.de-13 + 2a03:2260:115:400:62e3:27ff:fe59:d494 1; #Elte-Landgasthaus-Hotel-Eggert-0013 + 2a03:2260:115:400:62e3:27ff:fe5f:fe68 1; #Mesum-0011-Blumenhaus-Behnen + 2a03:2260:115:400:32b5:c2ff:fe0e:aa6c 1; #Freifunk_NetZwerg + 2a03:2260:115:400:62e3:27ff:fe60:50c2 1; #Steinfurt-Elte-Hellhuegel + 2a03:2260:115:400:62e3:27ff:fe2a:573c 1; #Mesum-0020-LVM-Schipp + 2a03:2260:115:400:62e3:27ff:fe2a:55ea 1; #Mesum-0018-Haarstudio-Baglivi + 2a03:2260:115:400:32b5:c2ff:feb0:42e2 1; #Connys-Koeppken + 2a03:2260:115:400:62e3:27ff:fe2a:6552 1; #Mesum-0021-Johannes-Apotheke + 2a03:2260:115:400:f6f2:6dff:fe3e:7118 1; #Restaurant_Kreta + 2a03:2260:115:400:c24a:ff:fe8c:726c 1; #Steinfurt-Mesum-0002 + 2a03:2260:115:400:62e3:27ff:fe60:4f7c 1; #Mesum-0024 + 2a03:2260:115:400:62e3:27ff:fe59:e38e 1; #Steinfurt-Elte-0015 + 2a03:2260:115:400:62e3:27ff:fe22:ccd2 1; #Steinfurt0271-Pizzeria-Valentino + 2a03:2260:115:400:f6f2:6dff:fed5:3926 1; #Steinfurt0270-Trattoria-La-Rustica + 2a03:2260:115:400:62e3:27ff:fe82:130 1; #Steinfurt-Elte-Ferienwohnung-Waldblick-0021 + 2a03:2260:115:400:32b5:c2ff:fe81:2320 1; #Steinfurt-Elte-0001 + 2a03:2260:115:400:62e3:27ff:fe59:ff96 1; #Steinfurt-Mesum-0003 + 2a03:2260:115:400:16cc:20ff:fecd:1086 1; #Steinfurt-Mesum-0005 + 2a03:2260:115:400:c66e:1fff:fefe:4e6a 1; #Steinfurt-Elte-Bauernkate + 2a03:2260:115:400:32b5:c2ff:fed9:feb2 1; #Steinfurt0046 + 2a03:2260:115:400:c66e:1fff:fe97:629a 1; #Bronco + 2a03:2260:115:400:32b5:c2ff:feb3:a7b6 1; #Eschendorf6 + 2a03:2260:115:400:32b5:c2ff:feee:8b06 1; #Eschendorf_02 + 2a03:2260:115:400:16cc:20ff:fe63:8374 1; #Hardy_Schmitz_Rheine_02 + 2a03:2260:115:400:62e3:27ff:febd:fdcc 1; #Steinfurt-Mesum-0028-Gabriels-Gartenmarkt + 2a03:2260:115:400:f6f2:6dff:fe40:370a 1; #Steinfurt-Mesum-0031-Wilp + 2a03:2260:115:400:c24a:ff:fe84:8c2e 1; #Freifunk_Reitstall_Schulte_Mesum + 2a03:2260:115:400:62e3:27ff:fe2a:567c 1; #Mesum-0019-Fleischerei-Ende + 2a03:2260:115:400:62e3:27ff:fe57:6b40 1; #Freifunk-Elte-Wortmann + 2a03:2260:115:400:32b5:c2ff:fe81:2822 1; #Steinfurt-Elte-0003 + 2a03:2260:115:400:32b5:c2ff:fe81:25ba 1; #Steinfurt-Elte-0002 + 2a03:2260:115:400:62e3:27ff:fe5f:fece 1; #Steinfurt-Mesum-0001 + 2a03:2260:115:400:62e3:27ff:fe59:ff00 1; #Steinfurt-Elte-0010 + 2a03:2260:115:400:62e3:27ff:fe76:8850 1; #DieZauberfee + 2a03:2260:115:400:12fe:edff:feb7:49a0 1; #steinfurt-elte-ls1478 + 2a03:2260:115:400:62e3:27ff:fece:f9e8 1; #BroncoRepeater + 2a03:2260:115:400:c6e9:84ff:fef0:7df4 1; #Best_Pizza_Doepihaus + 2a03:2260:115:400:62e3:27ff:fe59:d7f4 1; #Steinfurt-Elte-SGELTE-0018 + 2a03:2260:115:400:62e3:27ff:fe5f:ff0c 1; #Steinfurt-Elte-0025 + 2a03:2260:115:400:62e3:27ff:fe5a:314 1; #Steinfurt-Elte-Zum-Splenterkotten-0023 + 2a03:2260:115:400:62e3:27ff:fe59:ff52 1; #Steinfurt-Elte-0012 + 2a03:2260:115:400:f6f2:6dff:fe3e:7108 1; #Hueseck + 2a03:2260:115:400:62e3:27ff:fe59:ff6e 1; #Steinfurt-Elte-Fachwerkhofanlage-Poepping-0009 + 2a03:2260:115:400:c66e:1fff:feaf:6002 1; #Mesum-0050 + 2a03:2260:115:400:62e3:27ff:fe5f:ff06 1; #Mesum-0012-Provinzial-Huesing + 2a03:2260:115:400:62e3:27ff:fe60:512c 1; #Steinfurt-Elte-0026 + 2a03:2260:115:400:16cc:20ff:fe63:809a 1; #Hardy_Schmitz_Rheine_03 + 2a03:2260:115:400:c66e:1fff:fec9:e6de 1; #Freifunk-Schlifski + 2a03:2260:115:400:f6f2:6dff:fe3f:e2fe 1; #BS.NetworX.Rheine +} From c9d3f89716e4fc6cf4b07d72a6bb44a0356f8545 Mon Sep 17 00:00:00 2001 From: brokenbike Date: Sun, 29 May 2016 19:52:53 +0200 Subject: [PATCH 22/43] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kleine, inhaltlich nicht relevante, Änderungen --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 18eddd9..6f5e86a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Node Hierarchy -Dieses Tool generiert auf Basis einer graph.json und nodes.json des [Meshviewers](https://github.com/ffnord/meshviewer/) sowie (Multi-)Polygonen (im [geojson](http://geojson.org/) Format) der einzelnen Zieldomänen eine [nginx](http://nginx.org/) Konfigurationsdatei (auf Basis des [Geo-Moduls](http://nginx.org/en/docs/http/ngx_http_geo_module.html)), um Knoten in der richtigen Reihenfolge umzuziehen. +Dieses Tool generiert auf Basis einer ``graph.json`` und ``nodes.json`` des [Meshviewers](https://github.com/ffnord/meshviewer/) sowie (Multi-)Polygonen (im [geojson](http://geojson.org/) Format) der einzelnen Zieldomänen eine [nginx](http://nginx.org/) Konfigurationsdatei (auf Basis des [Geo-Moduls](http://nginx.org/en/docs/http/ngx_http_geo_module.html)), um Knoten in der richtigen Reihenfolge umzuziehen. ## Vorgehensweise -Das Tool zerteilt den (globalen) Graphen in viele lokale Graphen, also die Menge an Knoten (und Links), die vor Ort ein Mesh bilden. Diese werden auf Basis der Shapefiles den einzelnen Zieldomänen zugeordnet (es werden die GeoPositionen der einzelnen Knoten "gemittelt"). Hier wird nun geprüft, welche Knoten keine Abhängigkeiten besitzen, also kein anderer Knoten über diesen Knoten gehen muss um einen Gatewayserver zu erreichen. Diese werden dann in die Konfiguration geschrieben. Sind diese Knoten aktualisiert, fällt die Abhängigkeit des Knoten weg, der zuvor benötigt wurde um das Gateway zu erreichen. -Daher muss das Tool regelmäßig ausgeführt werden und die Ausgabe jeweils in die nginx Konfiguration übernommen werden. +Das Tool zerteilt den (globalen) Graphen in viele lokale Graphen, also die Menge an Knoten (und Links), die vor Ort ein Mesh bilden. Diese werden auf Basis der Shapefiles den einzelnen Zieldomänen zugeordnet (es werden die Geopositionen der einzelnen Knoten "gemittelt"). Hier wird nun geprüft, welche Knoten keine Abhängigkeiten besitzen, also kein anderer Knoten über diesen Knoten gehen muss, um einen Gatewayserver zu erreichen. Diese werden dann in die Konfiguration geschrieben. + +Sind diese Knoten aktualisiert, fällt die Abhängigkeit des Knoten weg, der zuvor benötigt wurde, um das Gateway zu erreichen. Daher muss das Tool regelmäßig ausgeführt und die Ausgabe jeweils in die nginx-Konfiguration übernommen werden. ## Abhängigkeiten @@ -56,7 +57,7 @@ optional arguments: ### Anmerkungen -- ``--targets`` Gibt die Namen der Ziele (Zieldomänen) an. Der Geo-Schalter in der nginx Konfiguration wird ebenfalls diesen Namen tragen. +- ``--targets`` Gibt die Namen der Ziele (Zieldomänen) an. Der Geo-Schalter in der nginx-Konfiguration wird ebenfalls diesen Namen tragen. - ``--json-path`` Gibt das Daten-Verzeichnis eures Meshviewers an. Default: ``https://service.freifunk-muensterland.de/maps/data/`` - ``--shapes-path`` Verzeichnis an dem die Shapefiles der einzelnen Ziel-Domänen liegen. Default: ``https://freifunk-muensterland.de/md-fw-dl/shapes/`` - *Anmerkung:* Es werden Dateien in Abhängigkeit mit den Target-Namen im Verzeichnis erwartet. @@ -68,8 +69,7 @@ Der Rest ist trivial. ### Filter -Standardmäßig werden alle Knoten ausgefiltert, die offline sind. -Außerdem werden alle lokalen Wolken ausgefiltert, in denen sich mindstens ein Knoten mit deaktiviertem Autoupdater befindet. +Standardmäßig werden alle Knoten ausgefiltert, die offline sind. Außerdem werden alle lokalen Wolken ausgefiltert, in denen sich mindstens ein Knoten mit deaktiviertem Autoupdater befindet. Weitere Filterungen lassen sich über das ``--filters`` Attribut aktivieren. @@ -79,7 +79,7 @@ Folgende Filter sind derzeit implementiert (zukünftig folgen noch weitere): ## Nginx Konfiguration -Das Tool generiert nur Konfigurationscode, der Schalter auf basis von IPv6 Adressen beinhaltet. Die Auswirkungen, die diese Schalter haben sollen müsst ihr noch selbst definieren. Typischerweise möchte man auf Basis der Schalter einen Rewrite machen. +Das Tool generiert nur Konfigurationscode, der Schalter auf Basis von IPv6-Adressen beinhaltet. Die Auswirkungen, die diese Schalter haben sollen, müsst ihr noch selbst definieren. Typischerweise möchte man auf Basis der Schalter einen Rewrite machen. Beispiel: @@ -93,9 +93,9 @@ if ($domaene01) { ## Bekannte Probleme -Wenn es sich bei der Quell-Domäne um eine L2TP Domäne handelt, läuft das Tool derzeit nur, wenn [alfred](https://github.com/ffnord/ffnord-alfred-announce) auf allen Gateway-Servern läuft. +Wenn es sich bei der Quell-Domäne um eine L2TP-Domäne handelt, läuft das Tool derzeit nur, wenn [alfred](https://github.com/ffnord/ffnord-alfred-announce) auf allen Gateway-Servern läuft. -*Anmerkung:* Wenn in der ``nodes.json`` und ``graph.json`` mehrere Domänen vorhanden sind und dort teilweise L2TP Domänen vorhanden sind (dieses aber nicht das Gebiet eurer Zieldomäne betrifft), kann das sehr negative Auswirkungen auf die Laufzeit haben (> 30 Sekunden). +*Anmerkung:* Wenn in der ``nodes.json`` und ``graph.json`` mehrere Domänen vorhanden sind und dort teilweise L2TP-Domänen vorhanden sind (dieses aber nicht das Gebiet eurer Zieldomäne betrifft), kann das sehr negative Auswirkungen auf die Laufzeit haben (> 30 Sekunden). ## Lizenz From db0800c5c7bca47588c735a805e0ee20194183ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 29 May 2016 20:12:47 +0200 Subject: [PATCH 23/43] Made detection of the propper ipv6 addresses more generic. --- cloud/NodeInit.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cloud/NodeInit.py b/cloud/NodeInit.py index 2f96d62..2ad9a16 100644 --- a/cloud/NodeInit.py +++ b/cloud/NodeInit.py @@ -42,8 +42,7 @@ class NodeInit(object): addresses = [] if 'addresses' in self.__jsonObject__['nodeinfo']['network']: for address in self.__jsonObject__['nodeinfo']['network']['addresses']: - #TODO: make more generic - if address.startswith('2a03'): + if not address.startswith('fe80'): addresses.append(address) return addresses From a1e26d32d35b6cf246eec4a0cf72adf4d895cac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 29 May 2016 20:33:40 +0200 Subject: [PATCH 24/43] Updated dependency detection. --- cloud/LocalGraph.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/cloud/LocalGraph.py b/cloud/LocalGraph.py index eb3ac93..e81eaf8 100644 --- a/cloud/LocalGraph.py +++ b/cloud/LocalGraph.py @@ -58,8 +58,20 @@ class LocalGraph(Graph): return nodes def getNodesWithNoDependencies(self): - #TODO: Implement smarter selection - return self.getAllNodesWithDepthEquals(self.getMaxDepth()) + nodesWithNoDependencies = [] + for k,v in self.__nodes__.items(): + depth = self.getDeptOfNode(v) + hasDependencies = False + for link in self.getLinksByNodeID(k): + for node in link.getEndpointNodes(): + if depth < self.getDeptOfNode(node): + hasDependencies = True + break + if hasDependencies == True: + break + else: + nodesWithNoDependencies.append(v) + return nodesWithNoDependencies def isAutoupdaterEnabledOnAllNodes(self): for k, v in self.__nodes__.items(): From 55a9b5035eb1cd51ee6447fbf70a98adf318cc7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 29 May 2016 20:40:45 +0200 Subject: [PATCH 25/43] Fixed Issue #1 --- NodeHierarchy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NodeHierarchy.py b/NodeHierarchy.py index 376594e..9d1c433 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -71,7 +71,7 @@ class NodeHierarchy(object): parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...') parser.add_argument('-o', '--out-file', required=False, help='Filename where the generated Output should stored.', default='./webserver-configuration') parser.add_argument('-v', '--debug', required=False, action='store_true', help='Enable debugging output.') - parser.add_argument('-f', '--filters', nargs='*', required=False, help='Filter out nodes and local clouds based on filter rules') + parser.add_argument('-f', '--filters', nargs='*', required=False, choices=('exclude_clouds_with_lan_links', 'no_lan'), help='Filter out nodes and local clouds based on filter rules') return parser.parse_args() From 504a418e273a1ba98da64991625cd1a1004c471b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 29 May 2016 20:44:26 +0200 Subject: [PATCH 26/43] Print message after configfile has been written. --- generator/NginxConfGen.py | 1 + 1 file changed, 1 insertion(+) diff --git a/generator/NginxConfGen.py b/generator/NginxConfGen.py index 2f827a6..dce9581 100644 --- a/generator/NginxConfGen.py +++ b/generator/NginxConfGen.py @@ -31,6 +31,7 @@ class NginxConfGen(object): f = open(self.__args__.out_file,'w') f.write(self.__genNginxConfigFileContent__()) f.close() + print('Nginx configfile has been created. You can find it at:', self.__args__.out_file) def __genNginxConfigFileContent__(self): content = '' From adf3839da6bf89bc113eff09111a181a124456f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 29 May 2016 20:47:50 +0200 Subject: [PATCH 27/43] Updated README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6f5e86a..14a8545 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Die Hilfe liefert folgendes: $ ./NodeHierarchy.py --help usage: NodeHierarchy.py [-h] [-j JSON_PATH] [-s SHAPES_PATH] -t TARGETS [TARGETS ...] [-o OUT_FILE] [-v] - [-f [FILTERS [FILTERS ...]]] + [-f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]]] This Script generates a hierarchical nodes list for node migration using nginx geo feature. @@ -49,7 +49,7 @@ optional arguments: -o OUT_FILE, --out-file OUT_FILE Filename where the generated Output should stored. -v, --debug Enable debugging output. - -f [FILTERS [FILTERS ...]], --filters [FILTERS [FILTERS ...]] + -f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]], --filters [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]] Filter out nodes and local clouds based on filter rules ``` From b1303a76d92680ce7ce20eb521e4fffa1f43f167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 19 Jul 2016 16:31:53 +0200 Subject: [PATCH 28/43] Fixed issue #3. Content of generated nginx file is sorted now. --- generator/NginxConfGen.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/generator/NginxConfGen.py b/generator/NginxConfGen.py index dce9581..583ac4d 100644 --- a/generator/NginxConfGen.py +++ b/generator/NginxConfGen.py @@ -1,5 +1,7 @@ from exceptions.HieraException import HieraException from generator.Filter import Filter +from collections import OrderedDict + class NginxConfGen(object): def __init__(self, domains, args): self.__domains__ = domains @@ -35,9 +37,9 @@ class NginxConfGen(object): def __genNginxConfigFileContent__(self): content = '' - for k, v in self.__generatedDomains__.items(): + for k, v in OrderedDict(sorted(self.__generatedDomains__.items())).items(): content += 'geo $' + k + ' {\n default 0;' - for ksub, vsub in v.items(): + for ksub, vsub in OrderedDict(sorted(v.items())).items(): for address in vsub['ipv6_addresses']: content += '\n ' + address + ' 1; #' + vsub['hostname'] content += '\n}\n' From 985bf2f1151ef8b8814fc4798ac5d60acf998eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 19 Jul 2016 17:02:58 +0200 Subject: [PATCH 29/43] Fixed json parsing of local files. --- parser/JsonParser.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/parser/JsonParser.py b/parser/JsonParser.py index 8ba4db2..96f914f 100644 --- a/parser/JsonParser.py +++ b/parser/JsonParser.py @@ -11,15 +11,20 @@ class JsonParser(object): if self.printStatus: print('Download', fileName.rsplit('/', 1)[1] , 'from URL:', fileName) resource = urllib.request.urlopen(fileName) + try: + data = json.loads(resource.read().decode('utf-8')) + except: + raise HieraException('Error while parsing a json file (perhapes misformed file): ' + fileName) + finally: + resource.close() else: if self.printStatus: print('Open', fileName.rsplit('/', 1)[1] , 'from file:', fileName) - resource = open(fileName) - try: - data = json.loads(resource.read().decode('utf-8')) - except: - raise HieraException('Error while parsing a json file (perhapes misformed file): ' + fileName) - finally: - resource.close() + with open(fileName) as data_file: + try: + data = json.load(data_file) + except: + raise HieraException('Error while parsing a json file (perhapes misformed file): ' + fileName) + return data From 779087bb993da0a6ef21c51c02dbe37848d9bb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 19 Jul 2016 18:14:33 +0200 Subject: [PATCH 30/43] Sometimes there are mesh-links where the mac address from src is assigned to a wireless interface and the mac address from dst is assigned to a "other" interface. This seems to appear if the nodes do both: meshing via wireless AND meshing via LAN. The "exclude_clouds_with_lan_links" filter was not able to work properly therefore. This fix always returns the interface type that deviates from "wireless" if the interface types of src and dst node are different. This fix should fix the problem mentioned in issue #4. The fix needs to be testet, maybe there are a few false positive results. --- cloud/Link.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/cloud/Link.py b/cloud/Link.py index 25be9f3..214da49 100644 --- a/cloud/Link.py +++ b/cloud/Link.py @@ -8,15 +8,32 @@ class Link(object): def __getLinkType__(self): + type_src = None + type_dst = None if self.__srcNode__ != None: for k, v in self.__srcNode__.interfaces.items(): if self.__jsonObject__['source']['interface_mac'] in v: - return k + type_src = k if self.__dstNode__ != None: for k, v in self.__dstNode__.interfaces.items(): if self.__jsonObject__['target']['interface_mac'] in v: - return k - return 'unknown' + type_dst = k + + if type_src == type_dst: + if type_src == None: + return 'unknown' + return type_src + else: + if type_src == None: + return type_dst + elif type_dst == None: + return type_src + else: + #print(self.__srcNode__.hostname, type_src, '<-->', self.__dstNode__.hostname, type_dst) + if type_src == 'wireless': + return type_dst + else: + return type_src def __getLinkVpnState__(self): if self.__jsonObject__['vpn'] == True: From f617f3b2be54849f173a136fa96ed680a3fb5667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 19 Jul 2016 23:28:01 +0200 Subject: [PATCH 31/43] Added info module for generating info files about nodes, links, graphs and domains. Currently there is offline node info available only. Furthermore there is a attribute to append filters to info module --- NodeHierarchy.py | 12 +++++--- info/Info.py | 18 +++++++++++ info/InfoMeta.py | 75 +++++++++++++++++++++++++++++++++++++++++++++ info/OfflineInfo.py | 68 ++++++++++++++++++++++++++++++++++++++++ info/__init__.py | 0 5 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 info/Info.py create mode 100644 info/InfoMeta.py create mode 100644 info/OfflineInfo.py create mode 100644 info/__init__.py diff --git a/NodeHierarchy.py b/NodeHierarchy.py index 9d1c433..27b1331 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -8,6 +8,7 @@ from cloud.GlobalGraph import GlobalGraph from parser.ShapesParser import ShapesParser from cloud.Domaene import Domaene from generator.NginxConfGen import NginxConfGen +from info.Info import Info class NodeHierarchy(object): def __init__(self): @@ -21,6 +22,7 @@ class NodeHierarchy(object): self.domains = self.__createDomains__() self.nginxConf = NginxConfGen(self.domains, self.__args__) self.nginxConf.writeNginxConfigFile() + self.infos = Info(self.__args__.info, self.__args__.info_out_path, self.__args__.info_out_type, self.__args__.info_filters, self.nodes, self.globalGraph, self.domains) def __parseShapes__(self): shapesJson = {} @@ -69,10 +71,12 @@ class NodeHierarchy(object): parser.add_argument('-j', '--json-path', required=False, default='https://service.freifunk-muensterland.de/maps/data/', help='Path of nodes.json and graph.json (can be local folder or remote URL).') parser.add_argument('-s', '--shapes-path', required=False, default='https://freifunk-muensterland.de/md-fw-dl/shapes/', help='Path of shapefiles (can be local folder or remote URL).') parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...') - parser.add_argument('-o', '--out-file', required=False, help='Filename where the generated Output should stored.', default='./webserver-configuration') + parser.add_argument('-o', '--out-file', default='./webserver-configuration', required=False, help='Filename where the generated Output should stored.') parser.add_argument('-v', '--debug', required=False, action='store_true', help='Enable debugging output.') - parser.add_argument('-f', '--filters', nargs='*', required=False, choices=('exclude_clouds_with_lan_links', 'no_lan'), help='Filter out nodes and local clouds based on filter rules') - + parser.add_argument('-f', '--filters', nargs='*', required=False, choices=('exclude_clouds_with_lan_links', 'no_lan'), help='Filter out nodes and local clouds based on filter rules.') + parser.add_argument('-i', '--info', nargs='*', required=False, choices=('get_offline_nodes','offline'), help='Get infos about the graph, links and nodes.') + parser.add_argument('-if', '--info-filters', nargs='*', required=False, help='Filter info results. Currently supported: min_age:TIME_RANGE, max_age:TIME_RANGE. Examples: -if min_age:1d max_age:2w') + parser.add_argument('-iop', '--info-out-path', required=False, default='./', help='Folder where info files should be written. Default: ./') + parser.add_argument('-iot', '--info-out-type', nargs='+', required=False, default='csv', choices=('json', 'csv'), help='Defines the format of info output. Default: csv') return parser.parse_args() - NodeHierarchy() diff --git a/info/Info.py b/info/Info.py new file mode 100644 index 0000000..3aa23c6 --- /dev/null +++ b/info/Info.py @@ -0,0 +1,18 @@ +from info.OfflineInfo import OfflineInfo +class Info(object): + def __init__(self, infoTypes, infoOutFolder, infoOutType, infoFilters, nodes, globalGraph, domains): + self.__infoTypes__ = infoTypes + self.__infoOutFolder__ = infoOutFolder + self.__infoOutType__ = infoOutType + self.__infoFilters__ = infoFilters + self.__nodes__ = nodes + self.__globalGraph__ = globalGraph + self.__domains__ = domains + if self.__infoTypes__ != None: + if 'get_offline_nodes' in self.__infoTypes__: + self.__offlineNodes__ = OfflineInfo(self.__infoFilters__, self.__nodes__, self.__domains__) + print(self.__infoOutType__) + if 'csv' in self.__infoOutType__: + self.__offlineNodes__.writeCSVtoFile(self.__infoOutFolder__+'/offline_nodes.csv') + if 'json' in self.__infoOutType__: + self.__offlineNodes__.writeJsonToFile(self.__infoOutFolder__+'/offline_nodes.json') \ No newline at end of file diff --git a/info/InfoMeta.py b/info/InfoMeta.py new file mode 100644 index 0000000..7cb13f8 --- /dev/null +++ b/info/InfoMeta.py @@ -0,0 +1,75 @@ +import json +class InfoMeta(object): + def __init__(self): + self.resultNodes = None + self.resultGraph = None + + + def __generateNodesJson__(self): + if self.resultNodes == None: + return [] + result = [] + for node in self.resultNodes: + result.append(node.__jsonObject__) + return result + + def __generateNodesCSV__(self): + if self.resultNodes == None: + return '' + + result = '"hostname","site","nodeid","ipv6addresses","status","lastseen","firstseen","autoupdater","branch","firmware","hardware"\n' + for node in self.resultNodes: + nodeData = node.__jsonObject__ + nodeinfo = nodeData['nodeinfo'] + result += '"'+nodeinfo['hostname']+'",' + + try: + result +='"'+nodeinfo['system']['site_code']+'",' + except: + result += '"none",' + result += '"'+nodeinfo['node_id']+'","' + + #add array of public IPv6 Addresses + addresses = node.__getPublicAddresses__() + for i, address in enumerate(addresses): + if i == len(addresses)-1: + result += address + else: + result += address + ',' + result += '",' + + if nodeData['flags']['online'] == True: + result += '"online",' + else: + result += '"offline",' + + result += '"'+nodeData['lastseen']+'","'+nodeData['firstseen']+'",' + try: + if nodeinfo['software']['autoupdater']['enabled'] == True: + result += '"enabled",' + else: + result += '"disabled",' + except: + result += '"none",' + + try: + result += '"'+nodeinfo['software']['autoupdater']['branch']+'",' + except: + result += '"none",' + result += '"'+nodeinfo['software']['firmware']['release']+'",' + + try: + result += '"'+nodeinfo['hardware']['model']+'"' + except: + result += '"none"' + + result += '\n' + return result + + def writeCSVtoFile(self, filename): + with open(filename, 'w') as out: + out.write(self.__generateNodesCSV__()) + + def writeJsonToFile(self, filename): + with open(filename, 'w') as out: + out.write(json.dumps(self.__generateNodesJson__(), sort_keys=True, indent=4, ensure_ascii=False)) \ No newline at end of file diff --git a/info/OfflineInfo.py b/info/OfflineInfo.py new file mode 100644 index 0000000..2664461 --- /dev/null +++ b/info/OfflineInfo.py @@ -0,0 +1,68 @@ +from info.InfoMeta import InfoMeta +from shapely.geometry import Point +import datetime, re +from datetime import timedelta +class OfflineInfo(InfoMeta): + def __init__(self, filters, nodes, domains): + super().__init__() + self.__filters__ = filters + self.__nodes__ = nodes + self.__domains__ = domains + self.__minAge__, self.__maxAge__ = self.__parseFilters__() + self.resultNodes = self.__filterNodes__() + + def __filterNodes__(self): + + offlineNodes = [] + + for k,v in self.__nodes__.items(): + if v.isOnline == False: + if v.geo != None: + for dk, dv in self.__domains__.items(): + if dv.isPointInDomaene(Point((v.geo['lon'], v.geo['lat']))) == True: + nodeLastSeen = datetime.datetime.strptime(v.__jsonObject__['lastseen'],'%Y-%m-%dT%H:%M:%S') + if self.__minAge__ != None: + if self.__minAge__ < nodeLastSeen: + continue + if self.__maxAge__ != None: + if self.__maxAge__ > nodeLastSeen: + continue + offlineNodes.append(v) + + return offlineNodes + + + def __parseFilters__(self): + + if self.__filters__ == None: + return None, None + + regX = re.compile("([0-9]+)([a-zA-Z]+)") + minAge = None + maxAge = None + + for filter in self.__filters__: + attr = filter.split(':') + if len(attr) == 2: + if attr[0] == 'min_age' or attr[0] == 'max_age': + d = regX.match(attr[1]) + if d != None: + val = int(d.group(1)) + unit = d.group(2) + date = datetime.datetime.now() + if unit == 'd' or unit == 'day' or unit == 'days': + date = date - timedelta(days=val) + elif unit == 'w' or unit == 'week' or unit == 'weeks': + date = date - timedelta(days=val*7) + elif unit == 'm' or unit == 'month' or unit == 'months': + date = date - timedelta(days=val*30) + elif unit == 'y' or unit == 'year' or unit == 'years': + date = date - timedelta(days=val*365) + else: + date = None + + if attr[0] == 'min_age': + minAge = date + elif attr[0] == 'max_age': + maxAge = date + return minAge, maxAge \ No newline at end of file diff --git a/info/__init__.py b/info/__init__.py new file mode 100644 index 0000000..e69de29 From 84ae23118777c6ef111677236ffe839e2c7d9096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 19 Jul 2016 23:38:56 +0200 Subject: [PATCH 32/43] Updated README.md, added Info-Modul section --- README.md | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 14a8545..d533056 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ $ ./NodeHierarchy.py --help usage: NodeHierarchy.py [-h] [-j JSON_PATH] [-s SHAPES_PATH] -t TARGETS [TARGETS ...] [-o OUT_FILE] [-v] [-f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]]] + [-i [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]]] + [-if [INFO_FILTERS [INFO_FILTERS ...]]] + [-iop INFO_OUT_PATH] + [-iot {json,csv} [{json,csv} ...]] This Script generates a hierarchical nodes list for node migration using nginx geo feature. @@ -51,7 +55,17 @@ optional arguments: -v, --debug Enable debugging output. -f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]], --filters [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]] Filter out nodes and local clouds based on filter - rules + rules. + -i [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]], --info [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]] + Get infos about the graph, links and nodes. + -if [INFO_FILTERS [INFO_FILTERS ...]], --info-filters [INFO_FILTERS [INFO_FILTERS ...]] + Filter info results. Currently supported: + min_age:TIME_RANGE, max_age:TIME_RANGE. Examples: -if + min_age:1d max_age:2w + -iop INFO_OUT_PATH, --info-out-path INFO_OUT_PATH + Folder where info files should be written. Default: ./ + -iot {json,csv} [{json,csv} ...], --info-out-type {json,csv} [{json,csv} ...] + Defines the format of info output. Default: csv ``` @@ -92,6 +106,29 @@ if ($domaene01) { *Anmerkung:* Bei $domane01 handelt es sich um den generierten Schalter, entspricht also ``--targets domaene01``. +## Info-Modul +Über das Info-Modul ist es möglich Informationen über Knoten, Links, Graphen und Domänen zu erstellen. Diese Informationen können entweder in ``csv``-Dateien oder in ``json``-Dateien gespeichert werden. Derzeit ist nur das Modul ``get_offline_nodes`` verfügbar. Zusätzlich lassen sich an das Info-Modul Filter übergeben. + +### Offline-Knoten +Gibt Informationen zu Knoten aus, die offline sind. Dazu gibt es die folgenden beiden Filter: + + - ``min_age:TIME_RANGE``: Knoten, die eine kürzere Zeit als die angegebene Zeit offline sind, werden ignoriert. + - ``max_age:TIME_RANGE``: Knoten, die eine längere Zeit als die angegebene Zeit offline sind, werden ignoriert. + + Dabei setzt sich ``TIME_RANGE`` aus zwei Teilen zusammen: + - (Integer) Wert + - Einheit: + - ``d``, ``day`` oder ``days``: Der Wert wird als eine Anzahl von Tagen interpretiert. + - ``w``, ``week`` oder ``weeks``: Der Wert wird als eine Anzahl von Wochen interpretiert. + - ``m``, ``month`` oder ``months``: Der Wert wird als eine Anzahl von Monaten (30 Tage) interpretiert. + +Der Beispielaufruf + +``$ ./NodeHierarchy.py -t domaene01 -i get_offline_nodes -i -if max_age:2w min_age:1d`` + +schreibt in die Datei ``./offline_nodes.csv`` (default-Einstellung der Schalter ``-iop`` und ``-iot``) Informationen zu Knoten die länger als einen Tag aber kürzer als zwei Wochen offline sind (im CSV-Format). + + ## Bekannte Probleme Wenn es sich bei der Quell-Domäne um eine L2TP-Domäne handelt, läuft das Tool derzeit nur, wenn [alfred](https://github.com/ffnord/ffnord-alfred-announce) auf allen Gateway-Servern läuft. From cac097b242bd321a9d842ac788482e4b479b9caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Tue, 19 Jul 2016 23:40:09 +0200 Subject: [PATCH 33/43] Fixed typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d533056..dc5f9d1 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ Gibt Informationen zu Knoten aus, die offline sind. Dazu gibt es die folgenden b Der Beispielaufruf -``$ ./NodeHierarchy.py -t domaene01 -i get_offline_nodes -i -if max_age:2w min_age:1d`` +``$ ./NodeHierarchy.py -t domaene01 -i get_offline_nodes -if max_age:2w min_age:1d`` schreibt in die Datei ``./offline_nodes.csv`` (default-Einstellung der Schalter ``-iop`` und ``-iot``) Informationen zu Knoten die länger als einen Tag aber kürzer als zwei Wochen offline sind (im CSV-Format). From 666cd20c04c38c265179a5ff9c10e0027954afcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 23 Apr 2017 22:57:07 +0200 Subject: [PATCH 34/43] Wokring on support for hopglass server (raw.json). --- NodeHierarchy.py | 14 +++++---- parser/Hopglass.py | 74 ++++++++++++++++++++++++++++++++++++++++++++ parser/JsonParser.py | 4 +-- requirements.txt | 1 + 4 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 parser/Hopglass.py create mode 100644 requirements.txt diff --git a/NodeHierarchy.py b/NodeHierarchy.py index 27b1331..bd31eb9 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -1,7 +1,8 @@ #!/usr/bin/python3 import argparse -from parser.NodesParser import NodesParser -from parser.GraphParser import GraphParser +# from parser.NodesParser import NodesParser +# from parser.GraphParser import GraphParser +from parser.Hopglass import Hopglass from cloud.Node import Node from cloud.Link import Link from cloud.GlobalGraph import GlobalGraph @@ -13,8 +14,9 @@ from info.Info import Info class NodeHierarchy(object): def __init__(self): self.__args__ = self.__parseArguments__() - self.__nodesJson__ = NodesParser(self.__args__.json_path) - self.__graphJson__ = GraphParser(self.__args__.json_path) + self.__hopglass = Hopglass(self.__args__.raw_json) + # self.__nodesJson__ = NodesParser(self.__args__.json_path) + # self.__graphJson__ = GraphParser(self.__args__.json_path) self.__shapesJson__ = self.__parseShapes__() self.nodes = self.__createNodeObjects__() self.links = self.__createLinkObjects__() @@ -48,7 +50,7 @@ class NodeHierarchy(object): def __createLinkObjects__(self): links = [] - for link in self.__graphJson__.links: + for link in self.__hopglass.links: try: srcNode = self.nodes[link['source']['node_id']] except: @@ -68,7 +70,7 @@ class NodeHierarchy(object): def __parseArguments__(self): parser = argparse.ArgumentParser(description='This Script generates a hierarchical nodes list for node migration using nginx geo feature.') - parser.add_argument('-j', '--json-path', required=False, default='https://service.freifunk-muensterland.de/maps/data/', help='Path of nodes.json and graph.json (can be local folder or remote URL).') + parser.add_argument('-r', '--raw-json', required=False, default='https://karte.freifunk-muensterland.de/data/raw.json', help='Location of raw.json file (can be local folder or remote URL).') parser.add_argument('-s', '--shapes-path', required=False, default='https://freifunk-muensterland.de/md-fw-dl/shapes/', help='Path of shapefiles (can be local folder or remote URL).') parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...') parser.add_argument('-o', '--out-file', default='./webserver-configuration', required=False, help='Filename where the generated Output should stored.') diff --git a/parser/Hopglass.py b/parser/Hopglass.py new file mode 100644 index 0000000..aa11eef --- /dev/null +++ b/parser/Hopglass.py @@ -0,0 +1,74 @@ +from parser.JsonParser import JsonParser +import collections +import json + +class Hopglass(JsonParser): + def __init__(self, filePath): + super().__init__(filePath) + self.ifIDs = {} + self.links = collections.defaultdict(dict) + self.nodes = {} + self.__aggregateData__() + #print(self.ifIDs) + for k, v in self.links.items(): + print(k,v,'\n') + + def __aggregateData__(self): + for nodeID, nodeData in self.__jsonData__.items(): + + # let pass nodes that provide all required informations only + if not set(('nodeinfo', 'neighbours')) <= set(nodeData): + continue + + nodeInfo = nodeData['nodeinfo'] + neighbours = nodeData['neighbours'] + + if not 'batadv' in neighbours: + continue + + if not 'mesh' in nodeInfo.get('network', {}): + continue + + for batID, batVal in nodeInfo['network']['mesh'].items(): + if not 'interfaces' in batVal: + continue + for ifType, ifVal in batVal['interfaces'].items(): + for mac in ifVal: + self.ifIDs[mac] = { + 'type' : ifType, + 'nodeID' : nodeID + } + + self.nodes[nodeID] = nodeData + + for nodeID, nodeData in self.nodes.items(): + for iname, ivalue in nodeData['neighbours']['batadv'].items(): + if 'neighbours' not in ivalue: + continue + if not iname in self.ifIDs: + continue + for nname, nvalue in ivalue['neighbours'].items(): + if nname not in self.ifIDs: + continue + nifID = self.ifIDs[nname]['nodeID'] + partID = (nodeID, nifID) if nodeID > nifID else (nifID, nodeID) + linkID = (iname, nname) if iname > nname else (nname, iname) + + linkNode = { + 'nodeID' : nodeID, + 'type' : self.ifIDs[iname]['type'], + 'tq' : nvalue['tq'] + } + + if linkID in self.links[partID]: + self.links[partID][linkID].append(linkNode) + else: + self.links[partID][linkID] = [linkNode] + + + def getLinksForNodeID(self, nodeID): + links = [] + for link in self.links: + if link['target']['node_id'] == nodeID or link['source']['node_id'] == nodeID: + links.append(link) + return links diff --git a/parser/JsonParser.py b/parser/JsonParser.py index 96f914f..d9bed53 100644 --- a/parser/JsonParser.py +++ b/parser/JsonParser.py @@ -9,7 +9,7 @@ class JsonParser(object): def __getFile__(self, fileName): if fileName.startswith('https://') or fileName.startswith('http://'): if self.printStatus: - print('Download', fileName.rsplit('/', 1)[1] , 'from URL:', fileName) + print('Download', fileName, 'from URL:', fileName) resource = urllib.request.urlopen(fileName) try: data = json.loads(resource.read().decode('utf-8')) @@ -19,7 +19,7 @@ class JsonParser(object): resource.close() else: if self.printStatus: - print('Open', fileName.rsplit('/', 1)[1] , 'from file:', fileName) + print('Open', fileName, 'from file:', fileName) with open(fileName) as data_file: try: data = json.load(data_file) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..231726c --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +shapely \ No newline at end of file From 1a017185389afe0270f1d09f9b53ef1be8d66c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 23 Apr 2017 23:09:31 +0200 Subject: [PATCH 35/43] Wokring on support for hopglass server (raw.json). --- NodeHierarchy.py | 2 +- cloud/NodeInit.py | 9 +++------ parser/Hopglass.py | 12 +++++++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/NodeHierarchy.py b/NodeHierarchy.py index bd31eb9..8e2b574 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -42,7 +42,7 @@ class NodeHierarchy(object): def __createNodeObjects__(self): nodes = {} - for nodeID, nodeValue in self.__nodesJson__.nodes.items(): + for nodeID, nodeValue in self.__hopglass.nodes.items(): print('Create Node object #',len(nodes), '\r',end = '') nodes[nodeID] = Node(nodeValue) print('') diff --git a/cloud/NodeInit.py b/cloud/NodeInit.py index 2ad9a16..aa70ee9 100644 --- a/cloud/NodeInit.py +++ b/cloud/NodeInit.py @@ -4,11 +4,11 @@ class NodeInit(object): self.nodeID = self.__jsonObject__['nodeinfo']['node_id'] self.interfaces = self.__getInterfaces__() self.hostname = self.__jsonObject__['nodeinfo']['hostname'] - self.isGateway = self.__jsonObject__['flags']['gateway'] + self.isGateway = self.__jsonObject__['nodeinfo']['isGateway'] self.geo = self.__getGeo__() self.isAutoupdaterEnabled = self.__getAutoupdaterStatus__() self.autoupdaterBranch = self.__getBranch__() - self.isOnline = self.__jsonObject__['flags']['online'] + self.isOnline = self.__jsonObject__['nodeinfo']['isOnline'] self.publicIPv6Addresses = self.__getPublicAddresses__() self.domID = self.__getSiteCode__() @@ -25,10 +25,7 @@ class NodeInit(object): return False def __getBranch__(self): - if 'autoupdater' in self.__jsonObject__['nodeinfo']['software']: - return self.__jsonObject__['nodeinfo']['software']['autoupdater']['branch'] - else: - return None + return self.__jsonObject__.get('nodeinfo', {}).get('software', {}).get('autoupdater', {}).get('branch', None) def __getGeo__(self): geo = {} diff --git a/parser/Hopglass.py b/parser/Hopglass.py index aa11eef..8bca9f2 100644 --- a/parser/Hopglass.py +++ b/parser/Hopglass.py @@ -8,6 +8,8 @@ class Hopglass(JsonParser): self.ifIDs = {} self.links = collections.defaultdict(dict) self.nodes = {} + self.gatewayMacs = [] + self.gateways = [] self.__aggregateData__() #print(self.ifIDs) for k, v in self.links.items(): @@ -17,11 +19,12 @@ class Hopglass(JsonParser): for nodeID, nodeData in self.__jsonData__.items(): # let pass nodes that provide all required informations only - if not set(('nodeinfo', 'neighbours')) <= set(nodeData): + if not set(('nodeinfo', 'neighbours', 'statistics')) <= set(nodeData): continue nodeInfo = nodeData['nodeinfo'] neighbours = nodeData['neighbours'] + statistics = nodeData['statistics'] if not 'batadv' in neighbours: continue @@ -29,6 +32,9 @@ class Hopglass(JsonParser): if not 'mesh' in nodeInfo.get('network', {}): continue + if statistics.get('gateway', False): + self.gatewayMacs.append(statistics['gateway']) + for batID, batVal in nodeInfo['network']['mesh'].items(): if not 'interfaces' in batVal: continue @@ -42,9 +48,13 @@ class Hopglass(JsonParser): self.nodes[nodeID] = nodeData for nodeID, nodeData in self.nodes.items(): + nodeData['nodeinfo']['isGateway'] = False + nodeData['nodeinfo']['isOnline'] = True # Todo: implement detection for iname, ivalue in nodeData['neighbours']['batadv'].items(): if 'neighbours' not in ivalue: continue + if iname in self.gatewayMacs: + nodeData['nodeinfo']['isGateway'] = True if not iname in self.ifIDs: continue for nname, nvalue in ivalue['neighbours'].items(): From cce68e8da6ae7efe6a05bfe93d9e596ff563f1ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Mon, 24 Apr 2017 11:13:00 +0200 Subject: [PATCH 36/43] Wokring on support for hopglass server (raw.json). --- NodeHierarchy.py | 16 +++------ cloud/Link.py | 82 ++++++++++++--------------------------------- cloud/LocalGraph.py | 7 ++-- parser/Hopglass.py | 6 ++-- 4 files changed, 34 insertions(+), 77 deletions(-) diff --git a/NodeHierarchy.py b/NodeHierarchy.py index 8e2b574..7ae922f 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -50,18 +50,10 @@ class NodeHierarchy(object): def __createLinkObjects__(self): links = [] - for link in self.__hopglass.links: - try: - srcNode = self.nodes[link['source']['node_id']] - except: - srcNode = None - try: - dstNode = self.nodes[link['target']['node_id']] - except: - dstNode = None - - print('Create Link object #',len(links), '\r',end = '') - links.append(Link(link, srcNode, dstNode)) + for linkParID, linkPar in self.__hopglass.links.items(): + for linkID, link in linkPar.items(): + print('Create Link object #',len(links), '\r',end = '') + links.append(Link(link, (self.nodes[linkParID[0]], self.nodes[linkParID[1]]))) print('') return links diff --git a/cloud/Link.py b/cloud/Link.py index 214da49..c9915c1 100644 --- a/cloud/Link.py +++ b/cloud/Link.py @@ -1,69 +1,31 @@ class Link(object): - def __init__(self, LinkJsonObject, srcNode, dstNode): - self.__jsonObject__ = LinkJsonObject - self.__srcNode__ = srcNode - self.__dstNode__ = dstNode - self.linkType = self.__getLinkType__() - self.isVpn = self.__getLinkVpnState__() - - + def __init__(self, LinkJsonObject, nodes): + self.__jsonObject = LinkJsonObject + self.linkType, self.isVpn = self.__getLinkType__() + self.__nodes = nodes + def __getLinkType__(self): - type_src = None - type_dst = None - if self.__srcNode__ != None: - for k, v in self.__srcNode__.interfaces.items(): - if self.__jsonObject__['source']['interface_mac'] in v: - type_src = k - if self.__dstNode__ != None: - for k, v in self.__dstNode__.interfaces.items(): - if self.__jsonObject__['target']['interface_mac'] in v: - type_dst = k - - if type_src == type_dst: - if type_src == None: - return 'unknown' - return type_src - else: - if type_src == None: - return type_dst - elif type_dst == None: - return type_src - else: - #print(self.__srcNode__.hostname, type_src, '<-->', self.__dstNode__.hostname, type_dst) - if type_src == 'wireless': - return type_dst - else: - return type_src - - def __getLinkVpnState__(self): - if self.__jsonObject__['vpn'] == True: - return True - for node in self.getEndpointNodes(getGateways = True): - if node.isGateway == True: - return True - return False - + types = [x['type'] for x in self.__jsonObject] + ltype = types[0] + lvpn = False + for x in types: + if x != 'unknown' and x != 'other': + if x == 'l2tp' or x == 'tunnel': + lvpn = True + val = x + return ltype, lvpn + def getEndpointNodes(self, getGateways = False): - nodes = [] - if self.__srcNode__ != None: - if getGateways == True or self.__srcNode__.isGateway == False: - nodes.append(self.__srcNode__) - if self.__dstNode__ != None: - if getGateways == True or self.__dstNode__.isGateway == False: - nodes.append(self.__dstNode__) - return nodes - + return self.__nodes + def getEndpointNodeIDs(self, getGateways = True): - nodeIDs = [] - for node in self.getEndpointNodes(getGateways): - nodeIDs.append(node.nodeID) - return nodeIDs - + return [x.nodeID for x in self.__nodes] + def isNodeIDinLink(self, nodeID): - for endpoint in self.getEndpointNodes(): - if endpoint.nodeID == nodeID: + for x in self.__nodes: + if nodeID == x.nodeID: return True return False - + def isNodeInLink(self, node): return self.isNodeIDinLink(node.nodeID) diff --git a/cloud/LocalGraph.py b/cloud/LocalGraph.py index e81eaf8..29ff1f4 100644 --- a/cloud/LocalGraph.py +++ b/cloud/LocalGraph.py @@ -125,6 +125,9 @@ class LocalGraph(Graph): print('BranchesThatExistsInCloud:', self.getBranchesThatExistsInCloud()) print('lan links in cloud:') for link in self.getLanLinksInCloud(): - if link.__srcNode__ != None and link.__dstNode__ != None: - print(' ', link.__srcNode__.hostname, '<--->', link.__dstNode__.hostname) + hosts = link.getEndpointNodes() + if len(hosts) == 1: + print(' ', hosts.hostname, 'has unknown neighbour.') + else: + print(' ', hosts[0].hostname, '<--->', hosts[1].hostname) print('=====') diff --git a/parser/Hopglass.py b/parser/Hopglass.py index 8bca9f2..25b1736 100644 --- a/parser/Hopglass.py +++ b/parser/Hopglass.py @@ -11,9 +11,9 @@ class Hopglass(JsonParser): self.gatewayMacs = [] self.gateways = [] self.__aggregateData__() - #print(self.ifIDs) - for k, v in self.links.items(): - print(k,v,'\n') + # print(self.ifIDs) + # for k, v in self.links.items(): + # print(k,v,'\n') def __aggregateData__(self): for nodeID, nodeData in self.__jsonData__.items(): From 1c8600435e9ffaf46b99f464eec727b8cecf27dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Mon, 24 Apr 2017 15:29:54 +0200 Subject: [PATCH 37/43] Updated README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dc5f9d1..3d15f86 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Die Hilfe liefert folgendes: ``` $ ./NodeHierarchy.py --help -usage: NodeHierarchy.py [-h] [-j JSON_PATH] [-s SHAPES_PATH] -t TARGETS +usage: NodeHierarchy.py [-h] [-r RAW_JSON] [-s SHAPES_PATH] -t TARGETS [TARGETS ...] [-o OUT_FILE] [-v] [-f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]]] [-i [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]]] @@ -41,9 +41,10 @@ geo feature. optional arguments: -h, --help show this help message and exit - -j JSON_PATH, --json-path JSON_PATH - Path of nodes.json and graph.json (can be local folder - or remote URL). + -r RAW_JSON, --raw-json RAW_JSON + Location of raw.json file (can be local folder or + remote URL). Default: https://karte.freifunk- + muensterland.de/data/raw.json -s SHAPES_PATH, --shapes-path SHAPES_PATH Path of shapefiles (can be local folder or remote URL). @@ -72,7 +73,7 @@ optional arguments: ### Anmerkungen - ``--targets`` Gibt die Namen der Ziele (Zieldomänen) an. Der Geo-Schalter in der nginx-Konfiguration wird ebenfalls diesen Namen tragen. -- ``--json-path`` Gibt das Daten-Verzeichnis eures Meshviewers an. Default: ``https://service.freifunk-muensterland.de/maps/data/`` +- ``--raw-json`` Gibt den Ort der raw.json (hopglass-server) an. Default: ``https://karte.freifunk-muensterland.de/data/raw.json`` - ``--shapes-path`` Verzeichnis an dem die Shapefiles der einzelnen Ziel-Domänen liegen. Default: ``https://freifunk-muensterland.de/md-fw-dl/shapes/`` - *Anmerkung:* Es werden Dateien in Abhängigkeit mit den Target-Namen im Verzeichnis erwartet. - *Beispiel:* Bei ``-targets domaene01 domaene02`` werden die Dateien ``domaene01.geojson`` und ``domaene02.geojson`` erwartet. From 9c16434c0ec0da74522106156be61742964e2af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Fri, 18 Aug 2017 22:07:40 +0200 Subject: [PATCH 38/43] Improved handling of invalid nodes data. --- NodeHierarchy.py | 5 +++-- cloud/GlobalGraph.py | 9 +++++---- cloud/Graph.py | 2 +- cloud/NodeInit.py | 9 ++++++--- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/NodeHierarchy.py b/NodeHierarchy.py index 7ae922f..414bb19 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -43,8 +43,9 @@ class NodeHierarchy(object): def __createNodeObjects__(self): nodes = {} for nodeID, nodeValue in self.__hopglass.nodes.items(): - print('Create Node object #',len(nodes), '\r',end = '') - nodes[nodeID] = Node(nodeValue) + if nodeValue['nodeinfo']['node_id']: + print('Create Node object #',len(nodes), '\r',end = '') + nodes[nodeID] = Node(nodeValue) print('') return nodes diff --git a/cloud/GlobalGraph.py b/cloud/GlobalGraph.py index d5c42d1..f369cce 100644 --- a/cloud/GlobalGraph.py +++ b/cloud/GlobalGraph.py @@ -26,18 +26,19 @@ class GlobalGraph(Graph): def __getConnectedNodes__(self, nodeID, trace = []): neighNodeIDs = self.getNeighbourNodeIDsForNodeID(nodeID) - trace_new = trace[:] + [x for x in neighNodeIDs if x not in trace] + trace_new = list(set(trace + neighNodeIDs)) for neighNodeID in neighNodeIDs: if neighNodeID not in trace: - trace_new = trace_new + [x for x in self.__getConnectedNodes__(neighNodeID, trace_new) if x not in trace_new] + trace_new = list(set(trace_new + self.__getConnectedNodes__(neighNodeID, trace_new))) return trace_new def __createLocalCloudByNodesList__(self, nodesIDList): nodes = {} links = [] for nodeID in nodesIDList: - nodes[nodeID] = self.__nodes__[nodeID] - links = links + [x for x in self.getLinksByNodeID(nodeID) if x not in links] + if nodeID: + nodes[nodeID] = self.__nodes__[nodeID] + links = list(set(links + self.getLinksByNodeID(nodeID))) return LocalGraph(nodes, links, self.__enableDebugPrinting__) def __debugPrint__(self): diff --git a/cloud/Graph.py b/cloud/Graph.py index 6f7b9e1..03d7d48 100644 --- a/cloud/Graph.py +++ b/cloud/Graph.py @@ -26,7 +26,7 @@ class Graph(object): if link.isVpn == False: endpoints = link.getEndpointNodeIDs(getGateways = False) if nodeID in endpoints: - neighNodeIDs = neighNodeIDs + [x for x in endpoints if x not in neighNodeIDs] + neighNodeIDs = list(set(neighNodeIDs + endpoints)) return neighNodeIDs def getLinksByNodeID(self, nodeID): diff --git a/cloud/NodeInit.py b/cloud/NodeInit.py index aa70ee9..a7abf1e 100644 --- a/cloud/NodeInit.py +++ b/cloud/NodeInit.py @@ -19,13 +19,16 @@ class NodeInit(object): return {} def __getAutoupdaterStatus__(self): - if 'autoupdater' in self.__jsonObject__['nodeinfo']['software']: + try: return self.__jsonObject__['nodeinfo']['software']['autoupdater']['enabled'] - else: + except: return False def __getBranch__(self): - return self.__jsonObject__.get('nodeinfo', {}).get('software', {}).get('autoupdater', {}).get('branch', None) + try: + return self.__jsonObject__['nodeinfo']['software']['autoupdater']['branch'] + except: + return None def __getGeo__(self): geo = {} From 67da82fb3800a4bbf8cc5b180f0b075ce591b307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Fri, 18 Aug 2017 22:10:27 +0200 Subject: [PATCH 39/43] Updated README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3d15f86..1f34579 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Node Hierarchy -Dieses Tool generiert auf Basis einer ``graph.json`` und ``nodes.json`` des [Meshviewers](https://github.com/ffnord/meshviewer/) sowie (Multi-)Polygonen (im [geojson](http://geojson.org/) Format) der einzelnen Zieldomänen eine [nginx](http://nginx.org/) Konfigurationsdatei (auf Basis des [Geo-Moduls](http://nginx.org/en/docs/http/ngx_http_geo_module.html)), um Knoten in der richtigen Reihenfolge umzuziehen. +Dieses Tool generiert auf Basis einer ``raw.json`` des [hopglass-server](https://github.com/hopglass/hopglass-server) sowie (Multi-)Polygonen (im [geojson](http://geojson.org/) Format) der einzelnen Zieldomänen eine [nginx](http://nginx.org/) Konfigurationsdatei (auf Basis des [Geo-Moduls](http://nginx.org/en/docs/http/ngx_http_geo_module.html)), um Knoten in der richtigen Reihenfolge umzuziehen. ## Vorgehensweise @@ -131,9 +131,9 @@ schreibt in die Datei ``./offline_nodes.csv`` (default-Einstellung der Schalter ## Bekannte Probleme -Wenn es sich bei der Quell-Domäne um eine L2TP-Domäne handelt, läuft das Tool derzeit nur, wenn [alfred](https://github.com/ffnord/ffnord-alfred-announce) auf allen Gateway-Servern läuft. +Wenn es sich bei der Quell-Domäne um eine L2TP-Domäne handelt, läuft das Tool derzeit nur, wenn [alfred](https://github.com/ffnord/ffnord-alfred-announce) oder respondd auf allen Gateway-Servern läuft. -*Anmerkung:* Wenn in der ``nodes.json`` und ``graph.json`` mehrere Domänen vorhanden sind und dort teilweise L2TP-Domänen vorhanden sind (dieses aber nicht das Gebiet eurer Zieldomäne betrifft), kann das sehr negative Auswirkungen auf die Laufzeit haben (> 30 Sekunden). +*Anmerkung:* Wenn in der ``graph.json`` mehrere Domänen vorhanden sind und dort teilweise L2TP-Domänen vorhanden sind (dieses aber nicht das Gebiet eurer Zieldomäne betrifft), kann das sehr negative Auswirkungen auf die Laufzeit haben (> 30 Sekunden). ## Lizenz From 0632593675a548d8a570bc043654d33905a7fe8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Fri, 18 Aug 2017 22:27:00 +0200 Subject: [PATCH 40/43] Ignore links where not both sides are known. --- NodeHierarchy.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NodeHierarchy.py b/NodeHierarchy.py index 414bb19..c914c81 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -54,7 +54,8 @@ class NodeHierarchy(object): for linkParID, linkPar in self.__hopglass.links.items(): for linkID, link in linkPar.items(): print('Create Link object #',len(links), '\r',end = '') - links.append(Link(link, (self.nodes[linkParID[0]], self.nodes[linkParID[1]]))) + if linkParID[0] != 'null' and linkParID[1] != 'null': + links.append(Link(link, (self.nodes[linkParID[0]], self.nodes[linkParID[1]]))) print('') return links From 8d4021f122505602b6f7e7938fecb662907c2818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sat, 19 Aug 2017 23:25:30 +0200 Subject: [PATCH 41/43] Several updates: - Implemented option to translate sitecode to domainname. - Added filter: Skip nodes if they are already in the target domain. - Several minor changes. --- NodeHierarchy.py | 16 +++++++++++++--- README.md | 16 ++++++++++------ cloud/NodeInit.py | 19 +++++++++++-------- generator/Filter.py | 10 ++++++++-- generator/NginxConfGen.py | 4 ++-- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/NodeHierarchy.py b/NodeHierarchy.py index c914c81..aeb0721 100755 --- a/NodeHierarchy.py +++ b/NodeHierarchy.py @@ -45,10 +45,19 @@ class NodeHierarchy(object): for nodeID, nodeValue in self.__hopglass.nodes.items(): if nodeValue['nodeinfo']['node_id']: print('Create Node object #',len(nodes), '\r',end = '') - nodes[nodeID] = Node(nodeValue) + nodes[nodeID] = Node(self.__prepareNodeData__(nodeValue)) print('') return nodes - + + def __prepareNodeData__(self, nodeValue): + if self.__args__.site_to_target_prefix: + pref = self.__args__.site_to_target_prefix.split(',') + try: + nodeValue['nodeinfo']['system']['site_code'] = nodeValue['nodeinfo']['system']['site_code'].replace(pref[0],pref[1]) + except: + pass + return nodeValue + def __createLinkObjects__(self): links = [] for linkParID, linkPar in self.__hopglass.links.items(): @@ -67,9 +76,10 @@ class NodeHierarchy(object): parser.add_argument('-r', '--raw-json', required=False, default='https://karte.freifunk-muensterland.de/data/raw.json', help='Location of raw.json file (can be local folder or remote URL).') parser.add_argument('-s', '--shapes-path', required=False, default='https://freifunk-muensterland.de/md-fw-dl/shapes/', help='Path of shapefiles (can be local folder or remote URL).') parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...') + parser.add_argument('-sttp', '--site-to-target-prefix', required=False, help='Used to match site and target also when prefixes are different. Example: -sttp "ffmsd,domaene"') parser.add_argument('-o', '--out-file', default='./webserver-configuration', required=False, help='Filename where the generated Output should stored.') parser.add_argument('-v', '--debug', required=False, action='store_true', help='Enable debugging output.') - parser.add_argument('-f', '--filters', nargs='*', required=False, choices=('exclude_clouds_with_lan_links', 'no_lan'), help='Filter out nodes and local clouds based on filter rules.') + parser.add_argument('-f', '--filters', nargs='*', required=False, choices=('exclude_clouds_with_lan_links', 'no_lan', 'domain_transitions_only'), help='Filter out nodes and local clouds based on filter rules.') parser.add_argument('-i', '--info', nargs='*', required=False, choices=('get_offline_nodes','offline'), help='Get infos about the graph, links and nodes.') parser.add_argument('-if', '--info-filters', nargs='*', required=False, help='Filter info results. Currently supported: min_age:TIME_RANGE, max_age:TIME_RANGE. Examples: -if min_age:1d max_age:2w') parser.add_argument('-iop', '--info-out-path', required=False, default='./', help='Folder where info files should be written. Default: ./') diff --git a/README.md b/README.md index 1f34579..bdcbf1d 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,9 @@ Die Hilfe liefert folgendes: ``` $ ./NodeHierarchy.py --help usage: NodeHierarchy.py [-h] [-r RAW_JSON] [-s SHAPES_PATH] -t TARGETS - [TARGETS ...] [-o OUT_FILE] [-v] - [-f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]]] + [TARGETS ...] [-sttp SITE_TO_TARGET_PREFIX] + [-o OUT_FILE] [-v] + [-f [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} ...]]] [-i [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]]] [-if [INFO_FILTERS [INFO_FILTERS ...]]] [-iop INFO_OUT_PATH] @@ -43,18 +44,20 @@ optional arguments: -h, --help show this help message and exit -r RAW_JSON, --raw-json RAW_JSON Location of raw.json file (can be local folder or - remote URL). Default: https://karte.freifunk- - muensterland.de/data/raw.json + remote URL). -s SHAPES_PATH, --shapes-path SHAPES_PATH Path of shapefiles (can be local folder or remote URL). -t TARGETS [TARGETS ...], --targets TARGETS [TARGETS ...] List of targets which should be proceeded. Example: -t citya cityb ... + -sttp SITE_TO_TARGET_PREFIX, --site-to-target-prefix SITE_TO_TARGET_PREFIX + Used to match site and target also when prefixes are + different. Example: -sttp "ffmsd,domaene" -o OUT_FILE, --out-file OUT_FILE Filename where the generated Output should stored. -v, --debug Enable debugging output. - -f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]], --filters [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]] + -f [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} ...]], --filters [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} ...]] Filter out nodes and local clouds based on filter rules. -i [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]], --info [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]] @@ -90,7 +93,8 @@ Weitere Filterungen lassen sich über das ``--filters`` Attribut aktivieren. Folgende Filter sind derzeit implementiert (zukünftig folgen noch weitere): -- ``exclude_clouds_with_lan_links`` bzw. ``no_lan`` Filtert alle lokalen Wolken aus, in denen sich mindestens ein Mesh-on-LAN Link befindet +- ``exclude_clouds_with_lan_links`` bzw. ``no_lan`` filtert alle lokalen Wolken aus, in denen sich mindestens ein Mesh-on-LAN Link befindet +- ``domain_transitions_only`` filtert alle Knoten aus, die sich bereits in der richtigen Domäne befinden / die Firmware der richtigen Domäne besitzen ## Nginx Konfiguration diff --git a/cloud/NodeInit.py b/cloud/NodeInit.py index a7abf1e..131f10e 100644 --- a/cloud/NodeInit.py +++ b/cloud/NodeInit.py @@ -10,7 +10,7 @@ class NodeInit(object): self.autoupdaterBranch = self.__getBranch__() self.isOnline = self.__jsonObject__['nodeinfo']['isOnline'] self.publicIPv6Addresses = self.__getPublicAddresses__() - self.domID = self.__getSiteCode__() + self.domName = self.__getSiteCode__() def __getInterfaces__(self): try: @@ -31,19 +31,22 @@ class NodeInit(object): return None def __getGeo__(self): - geo = {} - if 'location' in self.__jsonObject__['nodeinfo'] and 'latitude' in self.__jsonObject__['nodeinfo']['location'] and 'longitude' in self.__jsonObject__['nodeinfo']['location']: - geo['lat'] = self.__jsonObject__['nodeinfo']['location']['latitude'] - geo['lon'] = self.__jsonObject__['nodeinfo']['location']['longitude'] - return geo - return None + try: + return { + 'lat' : self.__jsonObject__['nodeinfo']['location']['latitude'], + 'lon' : self.__jsonObject__['nodeinfo']['location']['longitude'] + } + except: + return None def __getPublicAddresses__(self): addresses = [] - if 'addresses' in self.__jsonObject__['nodeinfo']['network']: + try: for address in self.__jsonObject__['nodeinfo']['network']['addresses']: if not address.startswith('fe80'): addresses.append(address) + except: + pass return addresses def __getSiteCode__(self): diff --git a/generator/Filter.py b/generator/Filter.py index fad49c6..c141a9e 100644 --- a/generator/Filter.py +++ b/generator/Filter.py @@ -3,7 +3,7 @@ class Filter(object): self.__args__ = args self.__filters__ = self.__getFilters() - def filterLocalGraphs(self, localGraphs): + def filterLocalGraphs(self, domain, localGraphs): filteredGraphs = [] for localGraph in localGraphs: if localGraph.isAutoupdaterEnabledOnAllNodes() == False: @@ -21,8 +21,14 @@ class Filter(object): def __getFilters(self): return [] if self.__args__.filters == None else self.__args__.filters - def filterNodes(self, nodes): + def filterNodes(self, domain, nodes): filteredNodes = [] for node in nodes: + if 'domain_transitions_only' in self.__filters__: + try: + if domain.name == node.domName: + continue + except: + pass filteredNodes.append(node) return filteredNodes diff --git a/generator/NginxConfGen.py b/generator/NginxConfGen.py index 583ac4d..aedc895 100644 --- a/generator/NginxConfGen.py +++ b/generator/NginxConfGen.py @@ -17,9 +17,9 @@ class NginxConfGen(object): def __genDomain__(self, domain): nodes = {} - for localGraph in self.__filter__.filterLocalGraphs(domain.localGraphs): + for localGraph in self.__filter__.filterLocalGraphs(domain, domain.localGraphs): try: - for node in self.__filter__.filterNodes(localGraph.getNodesWithNoDependencies()): + for node in self.__filter__.filterNodes(domain, localGraph.getNodesWithNoDependencies()): nodes[node.nodeID] = { 'hostname' : node.hostname, 'ipv6_addresses' : node.publicIPv6Addresses From 07223d6cb678a44dd2dc8b263d5c3a1849a64a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 24 Sep 2017 23:04:24 +0200 Subject: [PATCH 42/43] Updated parser for shapefiles. geometry collections can be used now, too. --- parser/ShapesParser.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/parser/ShapesParser.py b/parser/ShapesParser.py index a0748b4..080468f 100644 --- a/parser/ShapesParser.py +++ b/parser/ShapesParser.py @@ -7,6 +7,11 @@ class ShapesParser(JsonParser): def __createShapes__(self): shapes = [] - for feature in self.__jsonData__['features']: - shapes.append(shape(feature['geometry'])) + if 'features' in self.__jsonData__: + for feature in self.__jsonData__['features']: + shapes.append(shape(feature['geometry'])) + elif 'geometries' in self.__jsonData__: + for geometry in self.__jsonData__['geometries']: + shapes.append(shape(geometry)) + return shapes From 95b3b20a43a90b468fd595aff0a97ae47bf16f00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BCllhorst?= Date: Sun, 24 Sep 2017 23:20:42 +0200 Subject: [PATCH 43/43] Updated shapes parser: ignore features without geometry --- parser/ShapesParser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parser/ShapesParser.py b/parser/ShapesParser.py index 080468f..d9191ae 100644 --- a/parser/ShapesParser.py +++ b/parser/ShapesParser.py @@ -9,7 +9,8 @@ class ShapesParser(JsonParser): shapes = [] if 'features' in self.__jsonData__: for feature in self.__jsonData__['features']: - shapes.append(shape(feature['geometry'])) + if feature['geometry']: + shapes.append(shape(feature['geometry'])) elif 'geometries' in self.__jsonData__: for geometry in self.__jsonData__['geometries']: shapes.append(shape(geometry))