Merge develop
							
								
								
									
										31
									
								
								.github/workflows/pull_request_check.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					name: Pull request check
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    types: [opened, edited, synchronize, ready_for_review, review_requested]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v2
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v2
 | 
				
			||||||
 | 
					      - name: Set up Node.js
 | 
				
			||||||
 | 
					        uses: actions/setup-node@v1.2.0
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					            ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					      - name: install deps
 | 
				
			||||||
 | 
					        run: npm install
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					      - name: create generated dir
 | 
				
			||||||
 | 
					        run: mkdir ./assets/generated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: create stub themes
 | 
				
			||||||
 | 
					        run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      - name: Compile license info; creates missing_licenses.txt if any missing
 | 
				
			||||||
 | 
					        run: npm run validate:licenses
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					      - name: Compile and validate themes and layers; creates layer_report.txt if any errors are found
 | 
				
			||||||
 | 
					        run: npm run validate:layeroverview 
 | 
				
			||||||
							
								
								
									
										32
									
								
								.github/workflows/theme_validation.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					name: Theme Validation
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - develop
 | 
				
			||||||
 | 
					      - master
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v2
 | 
				
			||||||
 | 
					      - name: Set up Node.js
 | 
				
			||||||
 | 
					        uses: actions/setup-node@v1.2.0
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					            ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					      - name: install deps
 | 
				
			||||||
 | 
					        run: npm install
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					      - name: create generated dir
 | 
				
			||||||
 | 
					        run: mkdir ./assets/generated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: create stub themes
 | 
				
			||||||
 | 
					        run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					         
 | 
				
			||||||
 | 
					      - name: Compile license info
 | 
				
			||||||
 | 
					        run: npm run generate:licenses
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					      - name: Compile themes and layers
 | 
				
			||||||
 | 
					        run: npm run generate:layeroverview
 | 
				
			||||||
| 
						 | 
					@ -1,90 +1,35 @@
 | 
				
			||||||
import * as drinkingWater from "../assets/layers/drinking_water/drinking_water.json";
 | 
					 | 
				
			||||||
import * as ghostbikes from "../assets/layers/ghost_bike/ghost_bike.json"
 | 
					 | 
				
			||||||
import * as viewpoint from "../assets/layers/viewpoint/viewpoint.json"
 | 
					 | 
				
			||||||
import * as bike_parking from "../assets/layers/bike_parking/bike_parking.json"
 | 
					 | 
				
			||||||
import * as bike_repair_station from "../assets/layers/bike_repair_station/bike_repair_station.json"
 | 
					 | 
				
			||||||
import * as birdhides from "../assets/layers/bird_hide/birdhides.json"
 | 
					 | 
				
			||||||
import * as nature_reserve from "../assets/layers/nature_reserve/nature_reserve.json"
 | 
					 | 
				
			||||||
import * as bike_cafes from "../assets/layers/bike_cafe/bike_cafes.json"
 | 
					 | 
				
			||||||
import * as bike_monitoring_station from "../assets/layers/bike_monitoring_station/bike_monitoring_station.json"
 | 
					 | 
				
			||||||
import * as cycling_themed_objects from "../assets/layers/cycling_themed_object/cycling_themed_objects.json"
 | 
					 | 
				
			||||||
import * as bike_shops from "../assets/layers/bike_shop/bike_shop.json"
 | 
					 | 
				
			||||||
import * as bike_cleaning from "../assets/layers/bike_cleaning/bike_cleaning.json"
 | 
					 | 
				
			||||||
import * as bicycle_library from "../assets/layers/bicycle_library/bicycle_library.json"
 | 
					 | 
				
			||||||
import * as bicycle_tube_vending_machine from "../assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json"
 | 
					 | 
				
			||||||
import * as maps from "../assets/layers/maps/maps.json"
 | 
					 | 
				
			||||||
import * as information_boards from "../assets/layers/information_board/information_board.json"
 | 
					 | 
				
			||||||
import * as direction from "../assets/layers/direction/direction.json"
 | 
					 | 
				
			||||||
import * as surveillance_camera from "../assets/layers/surveillance_cameras/surveillance_cameras.json"
 | 
					 | 
				
			||||||
import * as toilets from "../assets/layers/toilets/toilets.json"
 | 
					 | 
				
			||||||
import * as bookcases from "../assets/layers/public_bookcases/public_bookcases.json"
 | 
					 | 
				
			||||||
import * as tree_nodes from "../assets/layers/trees/tree_nodes.json"
 | 
					 | 
				
			||||||
import * as benches from "../assets/layers/benches/benches.json"
 | 
					 | 
				
			||||||
import * as benches_at_pt from "../assets/layers/benches/benches_at_pt.json"
 | 
					 | 
				
			||||||
import * as picnic_tables from "../assets/layers/benches/picnic_tables.json"
 | 
					 | 
				
			||||||
import * as play_forest from "../assets/layers/play_forest/play_forest.json"
 | 
					 | 
				
			||||||
import * as playground from "../assets/layers/playground/playground.json"
 | 
					 | 
				
			||||||
import * as sport_pitch from "../assets/layers/sport_pitch/sport_pitch.json"
 | 
					 | 
				
			||||||
import * as slow_roads from "../assets/layers/slow_roads/slow_roads.json"
 | 
					 | 
				
			||||||
import LayerConfig from "./JSON/LayerConfig";
 | 
					import LayerConfig from "./JSON/LayerConfig";
 | 
				
			||||||
import {LayerConfigJson} from "./JSON/LayerConfigJson";
 | 
					import {LayerConfigJson} from "./JSON/LayerConfigJson";
 | 
				
			||||||
import * as grass_in_parks from "../assets/layers/village_green/grass_in_parks.json"
 | 
					import * as known_layers from "../assets/generated/known_layers_and_themes.json"
 | 
				
			||||||
import * as village_green from "../assets/layers/village_green/village_green.json"
 | 
					import {Utils} from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class AllKnownLayers {
 | 
					export default class AllKnownLayers {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static sharedLayersListRaw : LayerConfigJson[] = [
 | 
					 | 
				
			||||||
        drinkingWater,
 | 
					 | 
				
			||||||
        ghostbikes,
 | 
					 | 
				
			||||||
        viewpoint,
 | 
					 | 
				
			||||||
        bike_parking,
 | 
					 | 
				
			||||||
        bike_repair_station,
 | 
					 | 
				
			||||||
        bike_monitoring_station,
 | 
					 | 
				
			||||||
        birdhides,
 | 
					 | 
				
			||||||
        nature_reserve,
 | 
					 | 
				
			||||||
        bike_cafes,
 | 
					 | 
				
			||||||
        bicycle_library,
 | 
					 | 
				
			||||||
        cycling_themed_objects,
 | 
					 | 
				
			||||||
        bike_shops,
 | 
					 | 
				
			||||||
        bike_cleaning,
 | 
					 | 
				
			||||||
        bicycle_tube_vending_machine,
 | 
					 | 
				
			||||||
        maps,
 | 
					 | 
				
			||||||
        direction,
 | 
					 | 
				
			||||||
        information_boards,
 | 
					 | 
				
			||||||
        toilets,
 | 
					 | 
				
			||||||
        bookcases,
 | 
					 | 
				
			||||||
        surveillance_camera,
 | 
					 | 
				
			||||||
        tree_nodes,
 | 
					 | 
				
			||||||
        benches,
 | 
					 | 
				
			||||||
        benches_at_pt,
 | 
					 | 
				
			||||||
        picnic_tables,
 | 
					 | 
				
			||||||
        play_forest,
 | 
					 | 
				
			||||||
        playground,
 | 
					 | 
				
			||||||
        sport_pitch,
 | 
					 | 
				
			||||||
        slow_roads,
 | 
					 | 
				
			||||||
        grass_in_parks,
 | 
					 | 
				
			||||||
        village_green
 | 
					 | 
				
			||||||
    ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Must be below the list...
 | 
					    // Must be below the list...
 | 
				
			||||||
    public static sharedLayers: Map<string, LayerConfig> = AllKnownLayers.getSharedLayers();
 | 
					    public static sharedLayers: Map<string, LayerConfig> = AllKnownLayers.getSharedLayers();
 | 
				
			||||||
    public static sharedLayersJson: Map<string, any> = AllKnownLayers.getSharedLayersJson();
 | 
					    public static sharedLayersJson: Map<string, any> = AllKnownLayers.getSharedLayersJson();
 | 
				
			||||||
 | 
					    private static sharedLayersListRaw: LayerConfigJson[] = known_layers.layers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static getSharedLayers(): Map<string, LayerConfig> {
 | 
					    private static getSharedLayers(): Map<string, LayerConfig> {
 | 
				
			||||||
        const sharedLayers = new Map<string, LayerConfig>();
 | 
					        const sharedLayers = new Map<string, LayerConfig>();
 | 
				
			||||||
        for (const layer of AllKnownLayers.sharedLayersListRaw) {
 | 
					        for (const layer of known_layers.layers) {
 | 
				
			||||||
            const parsed = new LayerConfig(layer,  "shared_layers")
 | 
					            try {
 | 
				
			||||||
            sharedLayers.set(layer.id, parsed);
 | 
					                const parsed = new LayerConfig(layer, "shared_layers")
 | 
				
			||||||
            sharedLayers[layer.id] = parsed;
 | 
					                sharedLayers.set(layer.id, parsed);
 | 
				
			||||||
 | 
					                sharedLayers[layer.id] = parsed;
 | 
				
			||||||
 | 
					            } catch (e) {
 | 
				
			||||||
 | 
					                if (!Utils.runningFromConsole) {
 | 
				
			||||||
 | 
					                    console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return sharedLayers;
 | 
					        return sharedLayers;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static getSharedLayersJson(): Map<string, any> {
 | 
					    private static getSharedLayersJson(): Map<string, any> {
 | 
				
			||||||
        const sharedLayers = new Map<string, any>();
 | 
					        const sharedLayers = new Map<string, any>();
 | 
				
			||||||
        for (const layer of AllKnownLayers.sharedLayersListRaw) {
 | 
					        for (const layer of known_layers.layers) {
 | 
				
			||||||
            sharedLayers.set(layer.id, layer);
 | 
					            sharedLayers.set(layer.id, layer);
 | 
				
			||||||
            sharedLayers[layer.id] = layer;
 | 
					            sharedLayers[layer.id] = layer;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,74 +1,29 @@
 | 
				
			||||||
import * as bookcases from "../assets/themes/bookcases/Bookcases.json";
 | 
					 | 
				
			||||||
import * as aed from "../assets/themes/aed/aed.json";
 | 
					 | 
				
			||||||
import * as toilets from "../assets/themes/toilets/toilets.json";
 | 
					 | 
				
			||||||
import * as artworks from "../assets/themes/artwork/artwork.json";
 | 
					 | 
				
			||||||
import * as cyclestreets from "../assets/themes/cyclestreets/cyclestreets.json";
 | 
					 | 
				
			||||||
import * as ghostbikes from "../assets/themes/ghostbikes/ghostbikes.json"
 | 
					 | 
				
			||||||
import * as cyclofix from "../assets/themes/cyclofix/cyclofix.json"
 | 
					 | 
				
			||||||
import * as buurtnatuur from "../assets/themes/buurtnatuur/buurtnatuur.json"
 | 
					 | 
				
			||||||
import * as nature from "../assets/themes/nature/nature.json"
 | 
					 | 
				
			||||||
import * as maps from "../assets/themes/maps/maps.json"
 | 
					 | 
				
			||||||
import * as shops from "../assets/themes/shops/shops.json"
 | 
					 | 
				
			||||||
import * as bike_monitoring_stations from "../assets/themes/bike_monitoring_station/bike_monitoring_stations.json"
 | 
					 | 
				
			||||||
import * as fritures from "../assets/themes/fritures/fritures.json"
 | 
					 | 
				
			||||||
import * as benches from "../assets/themes/benches/benches.json";
 | 
					 | 
				
			||||||
import * as charging_stations from "../assets/themes/charging_stations/charging_stations.json"
 | 
					 | 
				
			||||||
import * as widths from "../assets/themes/widths/width.json"
 | 
					 | 
				
			||||||
import * as drinking_water from "../assets/themes/drinking_water/drinking_water.json"
 | 
					 | 
				
			||||||
import * as climbing from "../assets/themes/climbing/climbing.json"
 | 
					 | 
				
			||||||
import * as surveillance_cameras from "../assets/themes/surveillance_cameras/surveillance_cameras.json"
 | 
					 | 
				
			||||||
import * as trees from "../assets/themes/trees/trees.json"
 | 
					 | 
				
			||||||
import * as personal from "../assets/themes/personalLayout/personalLayout.json"
 | 
					 | 
				
			||||||
import * as playgrounds from "../assets/themes/playgrounds/playgrounds.json"
 | 
					 | 
				
			||||||
import * as bicycle_lib from "../assets/themes/bicycle_library/bicycle_library.json"
 | 
					 | 
				
			||||||
import * as campersites from "../assets/themes/campersites/campersites.json"
 | 
					 | 
				
			||||||
import * as play_forests from "../assets/themes/play_forests/play_forests.json"
 | 
					 | 
				
			||||||
import * as speelplekken from "../assets/themes/speelplekken/speelplekken.json"
 | 
					 | 
				
			||||||
import * as sport_pitches from "../assets/themes/sport_pitches/sport_pitches.json"
 | 
					 | 
				
			||||||
import * as grb from "../assets/themes/grb.json"
 | 
					 | 
				
			||||||
import * as facadegardens from "../assets/themes/facadegardens/facadegardens.json"
 | 
					 | 
				
			||||||
import LayerConfig from "./JSON/LayerConfig";
 | 
					 | 
				
			||||||
import LayoutConfig from "./JSON/LayoutConfig";
 | 
					import LayoutConfig from "./JSON/LayoutConfig";
 | 
				
			||||||
import AllKnownLayers from "./AllKnownLayers";
 | 
					import AllKnownLayers from "./AllKnownLayers";
 | 
				
			||||||
 | 
					import * as known_themes from "../assets/generated/known_layers_and_themes.json"
 | 
				
			||||||
 | 
					import {LayoutConfigJson} from "./JSON/LayoutConfigJson";
 | 
				
			||||||
 | 
					import * as all_layouts from "../assets/generated/known_layers_and_themes.json"
 | 
				
			||||||
export class AllKnownLayouts {
 | 
					export class AllKnownLayouts {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static allLayers: Map<string, LayerConfig> = undefined;
 | 
					 | 
				
			||||||
    public static layoutsList: LayoutConfig[] = [
 | 
					 | 
				
			||||||
        new LayoutConfig(personal),
 | 
					 | 
				
			||||||
        AllKnownLayouts.GenerateCycloFix(),
 | 
					 | 
				
			||||||
        new LayoutConfig(aed),
 | 
					 | 
				
			||||||
        new LayoutConfig(bookcases),
 | 
					 | 
				
			||||||
        new LayoutConfig(toilets),
 | 
					 | 
				
			||||||
        new LayoutConfig(artworks),
 | 
					 | 
				
			||||||
        new LayoutConfig(ghostbikes),
 | 
					 | 
				
			||||||
        new LayoutConfig(shops),
 | 
					 | 
				
			||||||
        new LayoutConfig(drinking_water),
 | 
					 | 
				
			||||||
        new LayoutConfig(nature),
 | 
					 | 
				
			||||||
        new LayoutConfig(cyclestreets),
 | 
					 | 
				
			||||||
        new LayoutConfig(bicycle_lib),
 | 
					 | 
				
			||||||
        new LayoutConfig(maps),
 | 
					 | 
				
			||||||
        new LayoutConfig(fritures),
 | 
					 | 
				
			||||||
        new LayoutConfig(benches),
 | 
					 | 
				
			||||||
        new LayoutConfig(charging_stations),
 | 
					 | 
				
			||||||
        new LayoutConfig(widths),
 | 
					 | 
				
			||||||
        new LayoutConfig(buurtnatuur),
 | 
					 | 
				
			||||||
        new LayoutConfig(bike_monitoring_stations),
 | 
					 | 
				
			||||||
        new LayoutConfig(surveillance_cameras),
 | 
					 | 
				
			||||||
        new LayoutConfig(climbing),
 | 
					 | 
				
			||||||
        new LayoutConfig(playgrounds),
 | 
					 | 
				
			||||||
        new LayoutConfig(trees),
 | 
					 | 
				
			||||||
        new LayoutConfig(campersites),
 | 
					 | 
				
			||||||
        new LayoutConfig(play_forests),
 | 
					 | 
				
			||||||
        new LayoutConfig(speelplekken),
 | 
					 | 
				
			||||||
        new LayoutConfig(sport_pitches),
 | 
					 | 
				
			||||||
        new LayoutConfig(grb),
 | 
					 | 
				
			||||||
		new LayoutConfig(facadegardens)
 | 
					 | 
				
			||||||
    ];
 | 
					 | 
				
			||||||
    public static allSets: Map<string, LayoutConfig> = AllKnownLayouts.AllLayouts();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static GenerateCycloFix(): LayoutConfig {
 | 
					    public static allKnownLayouts: Map<string, LayoutConfig> = AllKnownLayouts.AllLayouts();
 | 
				
			||||||
        const layout = new LayoutConfig(cyclofix)
 | 
					    public static layoutsList: LayoutConfig[] = AllKnownLayouts.GenerateOrderedList(AllKnownLayouts.allKnownLayouts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static GenerateOrderedList(allKnownLayouts: Map<string, LayoutConfig>): LayoutConfig[] {
 | 
				
			||||||
 | 
					        const keys = ["personal", "cyclofix", "bookcases", "toilets", "aed"]
 | 
				
			||||||
 | 
					        const list = []
 | 
				
			||||||
 | 
					        for (const key of keys) {
 | 
				
			||||||
 | 
					            list.push(allKnownLayouts.get(key))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        allKnownLayouts.forEach((layout, key) => {
 | 
				
			||||||
 | 
					            if (keys.indexOf(key) < 0) {
 | 
				
			||||||
 | 
					                list.push(layout)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        return list;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static AddGhostBikes(layout: LayoutConfig): LayoutConfig {
 | 
				
			||||||
        const now = new Date();
 | 
					        const now = new Date();
 | 
				
			||||||
        const m = now.getMonth() + 1;
 | 
					        const m = now.getMonth() + 1;
 | 
				
			||||||
        const day = new Date().getDate() + 1;
 | 
					        const day = new Date().getDate() + 1;
 | 
				
			||||||
| 
						 | 
					@ -86,8 +41,15 @@ export class AllKnownLayouts {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static AllLayouts(): Map<string, LayoutConfig> {
 | 
					    private static AllLayouts(): Map<string, LayoutConfig> {
 | 
				
			||||||
        this.allLayers = new Map<string, LayerConfig>();
 | 
					        const dict: Map<string, LayoutConfig> = new Map();
 | 
				
			||||||
        for (const layout of this.layoutsList) {
 | 
					        for (const layoutConfigJson of known_themes.themes) {
 | 
				
			||||||
 | 
					            const layout = new LayoutConfig(layoutConfigJson, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (layout.id === "cyclofix") {
 | 
				
			||||||
 | 
					                AllKnownLayouts.AddGhostBikes(layout)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            dict.set(layout.id, layout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (let i = 0; i < layout.layers.length; i++) {
 | 
					            for (let i = 0; i < layout.layers.length; i++) {
 | 
				
			||||||
                let layer = layout.layers[i];
 | 
					                let layer = layout.layers[i];
 | 
				
			||||||
                if (typeof (layer) === "string") {
 | 
					                if (typeof (layer) === "string") {
 | 
				
			||||||
| 
						 | 
					@ -98,20 +60,9 @@ export class AllKnownLayouts {
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (this.allLayers[layer.id] !== undefined) {
 | 
					 | 
				
			||||||
                    continue;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                this.allLayers[layer.id] = layer;
 | 
					 | 
				
			||||||
                this.allLayers[layer.id.toLowerCase()] = layer;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        return dict;
 | 
				
			||||||
        const allSets: Map<string, LayoutConfig> = new Map();
 | 
					 | 
				
			||||||
        for (const layout of this.layoutsList) {
 | 
					 | 
				
			||||||
            allSets[layout.id] = layout;
 | 
					 | 
				
			||||||
            allSets[layout.id.toLowerCase()] = layout;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return allSets;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@ import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
 | 
				
			||||||
import {Translation} from "../../UI/i18n/Translation";
 | 
					import {Translation} from "../../UI/i18n/Translation";
 | 
				
			||||||
import Img from "../../UI/Base/Img";
 | 
					import Img from "../../UI/Base/Img";
 | 
				
			||||||
import Svg from "../../Svg";
 | 
					import Svg from "../../Svg";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {Utils} from "../../Utils";
 | 
					import {Utils} from "../../Utils";
 | 
				
			||||||
import Combine from "../../UI/Base/Combine";
 | 
					import Combine from "../../UI/Base/Combine";
 | 
				
			||||||
import {VariableUiElement} from "../../UI/Base/VariableUIElement";
 | 
					import {VariableUiElement} from "../../UI/Base/VariableUIElement";
 | 
				
			||||||
| 
						 | 
					@ -18,7 +19,6 @@ import SourceConfig from "./SourceConfig";
 | 
				
			||||||
import {TagsFilter} from "../../Logic/Tags/TagsFilter";
 | 
					import {TagsFilter} from "../../Logic/Tags/TagsFilter";
 | 
				
			||||||
import {Tag} from "../../Logic/Tags/Tag";
 | 
					import {Tag} from "../../Logic/Tags/Tag";
 | 
				
			||||||
import SubstitutingTag from "../../Logic/Tags/SubstitutingTag";
 | 
					import SubstitutingTag from "../../Logic/Tags/SubstitutingTag";
 | 
				
			||||||
 | 
					 | 
				
			||||||
export default class LayerConfig {
 | 
					export default class LayerConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -452,5 +452,23 @@ export default class LayerConfig {
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ExtractImages(): Set<string> {
 | 
				
			||||||
 | 
					        const parts: Set<string>[] = []
 | 
				
			||||||
 | 
					        parts.push(...this.tagRenderings?.map(tr => tr.ExtractImages(false)))
 | 
				
			||||||
 | 
					        parts.push(...this.titleIcons?.map(tr => tr.ExtractImages(true)))
 | 
				
			||||||
 | 
					        parts.push(this.icon?.ExtractImages(true))
 | 
				
			||||||
 | 
					        parts.push(...this.iconOverlays?.map(overlay => overlay.then.ExtractImages(true)))
 | 
				
			||||||
 | 
					        for (const preset of this.presets) {
 | 
				
			||||||
 | 
					            parts.push(new Set<string>(preset.description?.ExtractImages(false)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					        const allIcons = new Set<string>();
 | 
				
			||||||
 | 
					        for (const part of parts) {
 | 
				
			||||||
 | 
					            part?.forEach(allIcons.add, allIcons)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return allIcons;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@ import {Utils} from "../../Utils";
 | 
				
			||||||
export default class LayoutConfig {
 | 
					export default class LayoutConfig {
 | 
				
			||||||
    public readonly id: string;
 | 
					    public readonly id: string;
 | 
				
			||||||
    public readonly maintainer: string;
 | 
					    public readonly maintainer: string;
 | 
				
			||||||
 | 
					    public readonly credits?: string;
 | 
				
			||||||
    public readonly changesetmessage?: string;
 | 
					    public readonly changesetmessage?: string;
 | 
				
			||||||
    public readonly version: string;
 | 
					    public readonly version: string;
 | 
				
			||||||
    public readonly language: string[];
 | 
					    public readonly language: string[];
 | 
				
			||||||
| 
						 | 
					@ -48,6 +49,7 @@ export default class LayoutConfig {
 | 
				
			||||||
        this.id = json.id;
 | 
					        this.id = json.id;
 | 
				
			||||||
        context = (context ?? "") + "." + this.id;
 | 
					        context = (context ?? "") + "." + this.id;
 | 
				
			||||||
        this.maintainer = json.maintainer;
 | 
					        this.maintainer = json.maintainer;
 | 
				
			||||||
 | 
					        this.credits = json.credits;
 | 
				
			||||||
        this.changesetmessage = json.changesetmessage;
 | 
					        this.changesetmessage = json.changesetmessage;
 | 
				
			||||||
        this.version = json.version;
 | 
					        this.version = json.version;
 | 
				
			||||||
        this.language = [];
 | 
					        this.language = [];
 | 
				
			||||||
| 
						 | 
					@ -182,4 +184,14 @@ export default class LayoutConfig {
 | 
				
			||||||
        custom.splice(0, 0, msg);
 | 
					        custom.splice(0, 0, msg);
 | 
				
			||||||
        return custom;
 | 
					        return custom;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public ExtractImages() : Set<string>{
 | 
				
			||||||
 | 
					        const icons = new Set<string>()
 | 
				
			||||||
 | 
					        for (const layer of this.layers) {
 | 
				
			||||||
 | 
					            layer.ExtractImages().forEach(icons.add, icons)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        icons.add(this.icon)
 | 
				
			||||||
 | 
					        icons.add(this.socialImage)
 | 
				
			||||||
 | 
					        return icons
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,12 @@ export interface LayoutConfigJson {
 | 
				
			||||||
     * 'cyclestreets' which become 'cyclestreets.html'
 | 
					     * 'cyclestreets' which become 'cyclestreets.html'
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    id: string;
 | 
					    id: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Who helped to create this theme and should be attributed?
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    credits?: string;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Who does maintian this preset?
 | 
					     * Who does maintian this preset?
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,7 @@ export default class TagRenderingConfig {
 | 
				
			||||||
                addExtraTags: json.freeform.addExtraTags?.map((tg, i) =>
 | 
					                addExtraTags: json.freeform.addExtraTags?.map((tg, i) =>
 | 
				
			||||||
                    FromJSON.Tag(tg, `${context}.extratag[${i}]`)) ?? []
 | 
					                    FromJSON.Tag(tg, `${context}.extratag[${i}]`)) ?? []
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if(json.freeform["extraTags"] !== undefined){
 | 
					            if (json.freeform["extraTags"] !== undefined) {
 | 
				
			||||||
                throw `Freeform.extraTags is defined. This should probably be 'freeform.addExtraTag' (at ${context})`
 | 
					                throw `Freeform.extraTags is defined. This should probably be 'freeform.addExtraTag' (at ${context})`
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (this.freeform.key === undefined || this.freeform.key === "") {
 | 
					            if (this.freeform.key === undefined || this.freeform.key === "") {
 | 
				
			||||||
| 
						 | 
					@ -90,6 +90,9 @@ export default class TagRenderingConfig {
 | 
				
			||||||
        this.multiAnswer = json.multiAnswer ?? false
 | 
					        this.multiAnswer = json.multiAnswer ?? false
 | 
				
			||||||
        if (json.mappings) {
 | 
					        if (json.mappings) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(!Array.isArray(json.mappings)){
 | 
				
			||||||
 | 
					                throw "Tagrendering has a 'mappings'-object, but expected a list ("+context+")"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.mappings = json.mappings.map((mapping, i) => {
 | 
					            this.mappings = json.mappings.map((mapping, i) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -254,5 +257,16 @@ export default class TagRenderingConfig {
 | 
				
			||||||
        return undefined;
 | 
					        return undefined;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ExtractImages(isIcon: boolean): Set<string> {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        const usedIcons = new Set<string>()
 | 
				
			||||||
 | 
					        this.render?.ExtractImages(isIcon)?.forEach(usedIcons.add, usedIcons)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const mapping of this.mappings ?? []) {
 | 
				
			||||||
 | 
					            mapping.then.ExtractImages(isIcon).forEach(usedIcons.add, usedIcons)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return usedIcons;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -51,9 +51,10 @@ The preferred way to add your theme is via a Pull Request. A Pull Request is les
 | 
				
			||||||
2) Go to `assets/themes` and create a new directory `yourtheme`
 | 
					2) Go to `assets/themes` and create a new directory `yourtheme`
 | 
				
			||||||
3) Create a new file `yourtheme.json`, paste the theme configuration in there. You can find your theme configuration in the customThemeBuilder (the tab with the *Floppy disk* icon)
 | 
					3) Create a new file `yourtheme.json`, paste the theme configuration in there. You can find your theme configuration in the customThemeBuilder (the tab with the *Floppy disk* icon)
 | 
				
			||||||
4) Copy all the images into this new directory. **No external sources are allowed!** External image sources leak privacy or can break.
 | 
					4) Copy all the images into this new directory. **No external sources are allowed!** External image sources leak privacy or can break.
 | 
				
			||||||
   - Make sure the license is suitable, preferable a Creative Commons license. Attribution can be added at the bottom of this document
 | 
					    - Make sure the license is suitable, preferable a Creative Commons license or CC0-license.
 | 
				
			||||||
   - If an SVG version is available, use the SVG version
 | 
					    - If an SVG version is available, use the SVG version
 | 
				
			||||||
   - Make sure all the links in `yourtheme.json` are updated. You can use `./assets/themes/yourtheme/yourimage.svg` instead of the HTML link
 | 
					    - Make sure all the links in `yourtheme.json` are updated. You can use `./assets/themes/yourtheme/yourimage.svg` instead of the HTML link
 | 
				
			||||||
 | 
					    - Create a file `license_info.json` in the theme directory, which contains metadata on every artwork source 
 | 
				
			||||||
 5) Add your theme to the code base:
 | 
					 5) Add your theme to the code base:
 | 
				
			||||||
    - Open [AllKnownLayouts.ts](https://github.com/pietervdvn/MapComplete/blob/master/Customizations/AllKnownLayouts.ts)
 | 
					    - Open [AllKnownLayouts.ts](https://github.com/pietervdvn/MapComplete/blob/master/Customizations/AllKnownLayouts.ts)
 | 
				
			||||||
    - Add an import statement, e.g. `import * as yourtheme from "../assets/themes/yourtheme/yourthemes.json";`
 | 
					    - Add an import statement, e.g. `import * as yourtheme from "../assets/themes/yourtheme/yourthemes.json";`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@ import Combine from "./UI/Base/Combine";
 | 
				
			||||||
import SelectedFeatureHandler from "./Logic/Actors/SelectedFeatureHandler";
 | 
					import SelectedFeatureHandler from "./Logic/Actors/SelectedFeatureHandler";
 | 
				
			||||||
import LZString from "lz-string";
 | 
					import LZString from "lz-string";
 | 
				
			||||||
import {LayoutConfigJson} from "./Customizations/JSON/LayoutConfigJson";
 | 
					import {LayoutConfigJson} from "./Customizations/JSON/LayoutConfigJson";
 | 
				
			||||||
 | 
					import AttributionPanel from "./UI/BigComponents/AttributionPanel";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class InitUiElements {
 | 
					export class InitUiElements {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -287,11 +288,7 @@ export class InitUiElements {
 | 
				
			||||||
            const copyrightNotice =
 | 
					            const copyrightNotice =
 | 
				
			||||||
                new ScrollableFullScreen(
 | 
					                new ScrollableFullScreen(
 | 
				
			||||||
                    () => Translations.t.general.attribution.attributionTitle.Clone(),
 | 
					                    () => Translations.t.general.attribution.attributionTitle.Clone(),
 | 
				
			||||||
                    () => new Combine([
 | 
					                    () => new AttributionPanel(State.state.layoutToUse),
 | 
				
			||||||
                        Translations.t.general.attribution.attributionContent,
 | 
					 | 
				
			||||||
                        "<br/>",
 | 
					 | 
				
			||||||
                        new Attribution(undefined, undefined, State.state.layoutToUse, undefined)
 | 
					 | 
				
			||||||
                    ]),
 | 
					 | 
				
			||||||
                    "copyright"
 | 
					                    "copyright"
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -300,7 +297,7 @@ export class InitUiElements {
 | 
				
			||||||
                copyrightNotice,
 | 
					                copyrightNotice,
 | 
				
			||||||
                new MapControlButton(Svg.osm_copyright_svg()),
 | 
					                new MapControlButton(Svg.osm_copyright_svg()),
 | 
				
			||||||
                copyrightNotice.isShown
 | 
					                copyrightNotice.isShown
 | 
				
			||||||
            ).SetClass("p-0.5 md:hidden")
 | 
					            ).SetClass("p-0.5")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            new Combine([copyrightButton, checkbox])
 | 
					            new Combine([copyrightButton, checkbox])
 | 
				
			||||||
                .AttachTo("bottom-left");
 | 
					                .AttachTo("bottom-left");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@ import { Utils } from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class Constants {
 | 
					export default class Constants {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    public static vNumber = "0.6.6c";
 | 
					    public static vNumber = "0.6.7";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The user journey states thresholds when a new feature gets unlocked
 | 
					    // The user journey states thresholds when a new feature gets unlocked
 | 
				
			||||||
    public static userJourney = {
 | 
					    public static userJourney = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								Models/smallLicense.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					export default interface SmallLicense {
 | 
				
			||||||
 | 
					    path: string,
 | 
				
			||||||
 | 
					    authors: string[],
 | 
				
			||||||
 | 
					    license: string,
 | 
				
			||||||
 | 
					    sources: string[]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										89
									
								
								README.md
									
										
									
									
									
								
							
							
						
						| 
						 | 
					@ -142,49 +142,9 @@ Whenever a change is made -even adding a single tag- the change is uploaded into
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Note that changesets are closed automatically after one hour of inactivity, so we don't have to worry about closing them. 
 | 
					Note that changesets are closed automatically after one hour of inactivity, so we don't have to worry about closing them. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Query parameters
 | 
					# Documentation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
By adding extra query parameters, more options are available to influence:
 | 
					All documentation can be found in [here](Docs/)
 | 
				
			||||||
 | 
					 | 
				
			||||||
**test**: If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org (default value: _false_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**layout**: The layout to load into MapComplete (default value: _bookcases_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**userlayout**: undefined (default value: _false_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**layer-control-toggle**: Wether or not the layer control is shown (default value: _false_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**tab**: The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >200 changesets) (default value: _0_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**z**: The initial/current zoom level (default value: _1_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**lat**: The initial/current latitude (default value: _0_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**lon**: The initial/current longitude of the app (default value: _0_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-userbadge**: Disables/Enables the userbadge (and thus disables login capabilities) (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-search**: Disables/Enables the search bar (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-layers**: Disables/Enables the layer control (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-add-new**: Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-welcome-message**: undefined (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-iframe**: Disables/Enables the iframe-popup (default value: _false_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-more-quests**: Disables/Enables the 'More Quests'-tab in the welcome message (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-share-screen**: Disables/Enables the 'Share-screen'-tab in the welcome message (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**fs-geolocation**: Disables/Enables the geolocation button (default value: _true_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**oauth_token**: Used to complete the login (default value: _undefined_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**background**: The id of the background layer to start with (default value: _undefined_)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**layer-bookcases**: Wehter or not layer bookcases is shown (default value: _true_) index.ts:104:8
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Privacy
 | 
					# Privacy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -195,53 +155,12 @@ Geolocation is available on mobile only throught hte device's GPS location (so n
 | 
				
			||||||
TODO: erase cookies of third party websites and API's
 | 
					TODO: erase cookies of third party websites and API's
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Attributions
 | 
					# Attribution
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Data from OpenStreetMap
 | 
					Data from OpenStreetMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Background layer selection: curated by https://github.com/osmlab/editor-layer-index
 | 
					Background layer selection: curated by https://github.com/osmlab/editor-layer-index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Images from Wikipedia/Wikimedia
 | 
					Icons are attributed in various 'license_info.json'-files and can be found in the app.
 | 
				
			||||||
 | 
					 | 
				
			||||||
https://commons.wikimedia.org/wiki/File:Camera_font_awesome.svg
 | 
					 | 
				
			||||||
Camera Icon, Dave Gandy, CC-BY-SA 3.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
https://commons.wikimedia.org/wiki/File:OOjs_UI_indicator_search-rtl.svg
 | 
					 | 
				
			||||||
Search Icon, MIT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
https://commons.wikimedia.org/wiki/File:Trash_font_awesome.svg
 | 
					 | 
				
			||||||
Trash icon by Dave Gandy, CC-BY-SA
 | 
					 | 
				
			||||||
 	
 | 
					 | 
				
			||||||
https://commons.wikimedia.org/wiki/File:Home-icon.svg
 | 
					 | 
				
			||||||
Home icon by Timothy Miller, CC-BY-SA 3.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
https://commons.wikimedia.org/wiki/File:Map_icons_by_Scott_de_Jonge_-_bicycle-store.svg
 | 
					 | 
				
			||||||
Bicycle logo,  	Scott de Jonge
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Nature Reserve icon via http://www.onlinewebfonts.com/icon/389579, CC BY 3.0 (@ Эдуард Черных)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Park icon via http://www.onlinewebfonts.com/icon/425974, CC BY 3.0 (@sterankofrank)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Forest icon via https://www.onlinewebfonts.com/icon/498112, CC BY
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Statistics icon via https://www.onlinewebfonts.com/icon/197818
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Chronometer (on monitoring_station.svg): ANTU chronometer
 | 
					 | 
				
			||||||
https://commons.wikimedia.org/w/index.php?title=Antu_chronometer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Fries icon:
 | 
					 | 
				
			||||||
https://www.flaticon.com/free-icon/french-fries_1144288
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Shower icon (used in 'bike_cleaning.svg'):
 | 
					 | 
				
			||||||
https://commons.wikimedia.org/wiki/File:Shower_symbol.svg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bench icons from StreetComplete: https://github.com/westnordost/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons, GPLv3.0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Urinal icon: https://thenounproject.com/term/urinal/1307984/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
24/7 icon: https://www.vecteezy.com/vector-art/1394992-24-7-service-and-support-icon-set
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Translation-icon: https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_language-ltr.svg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PingPong-table icon: Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
 | 
					 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,9 @@ import Loc from "../../Models/Loc";
 | 
				
			||||||
import LeafletMap from "../../Models/LeafletMap";
 | 
					import LeafletMap from "../../Models/LeafletMap";
 | 
				
			||||||
import * as L from "leaflet"
 | 
					import * as L from "leaflet"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The bottom right attribution panel in the leaflet map
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
export default class Attribution extends UIElement {
 | 
					export default class Attribution extends UIElement {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    private readonly _location: UIEventSource<Loc>;
 | 
					    private readonly _location: UIEventSource<Loc>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										69
									
								
								UI/BigComponents/AttributionPanel.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					import {UIElement} from "../UIElement";
 | 
				
			||||||
 | 
					import Combine from "../Base/Combine";
 | 
				
			||||||
 | 
					import Translations from "../i18n/Translations";
 | 
				
			||||||
 | 
					import Attribution from "./Attribution";
 | 
				
			||||||
 | 
					import State from "../../State";
 | 
				
			||||||
 | 
					import {UIEventSource} from "../../Logic/UIEventSource";
 | 
				
			||||||
 | 
					import LayoutConfig from "../../Customizations/JSON/LayoutConfig";
 | 
				
			||||||
 | 
					import {FixedUiElement} from "../Base/FixedUiElement";
 | 
				
			||||||
 | 
					import * as licenses from "../../assets/generated/license_info.json"
 | 
				
			||||||
 | 
					import SmallLicense from "../../Models/smallLicense";
 | 
				
			||||||
 | 
					import {Icon} from "leaflet";
 | 
				
			||||||
 | 
					import Img from "../Base/Img";
 | 
				
			||||||
 | 
					import {Utils} from "../../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The attribution panel shown on mobile
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export default class AttributionPanel extends Combine {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static LicenseObject = AttributionPanel.GenerateLicenses();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(layoutToUse: UIEventSource<LayoutConfig>) {
 | 
				
			||||||
 | 
					        super([
 | 
				
			||||||
 | 
					            Translations.t.general.attribution.attributionContent,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ((layoutToUse.data.maintainer ?? "") == "") ? "" : Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.data.maintainer}),
 | 
				
			||||||
 | 
					            layoutToUse.data.credits ,
 | 
				
			||||||
 | 
					            "<br/>",
 | 
				
			||||||
 | 
					            new Attribution(undefined, undefined, State.state.layoutToUse, undefined),
 | 
				
			||||||
 | 
					            "<br/>",
 | 
				
			||||||
 | 
					            Translations.t.general.attribution.iconAttribution.title.Clone().SetClass("font-bold pt-12 pb-3"),
 | 
				
			||||||
 | 
					            ...Utils.NoNull(Array.from(layoutToUse.data.ExtractImages()))
 | 
				
			||||||
 | 
					                .map(AttributionPanel.IconAttribution)
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					        this.SetClass("flex flex-col")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static IconAttribution(iconPath: string) {
 | 
				
			||||||
 | 
					        if (iconPath.startsWith("http")) {
 | 
				
			||||||
 | 
					            iconPath = "." + new URL(iconPath).pathname;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const license: SmallLicense = AttributionPanel.LicenseObject[iconPath]
 | 
				
			||||||
 | 
					        if (license == undefined) {
 | 
				
			||||||
 | 
					            return undefined;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(license.license.indexOf("trivial")>=0){
 | 
				
			||||||
 | 
					            return undefined;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return new Combine([
 | 
				
			||||||
 | 
					            `<img src='${iconPath}' style="width: 50px; height: 50px; margin-right: 0.5em;">`,
 | 
				
			||||||
 | 
					            new Combine([
 | 
				
			||||||
 | 
					                new FixedUiElement(license.authors.join("; ")).SetClass("font-bold"),
 | 
				
			||||||
 | 
					                new Combine([license.license,  license.sources.length > 0 ? " - " : "", 
 | 
				
			||||||
 | 
					                    ...license.sources.map(link => `<a href='${link}' target="_blank">${new URL(link).hostname}</a> `)]).SetClass("block")
 | 
				
			||||||
 | 
					            ]).SetClass("flex flex-col")
 | 
				
			||||||
 | 
					        ]).SetClass("flex")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static GenerateLicenses() {
 | 
				
			||||||
 | 
					        const allLicenses = {}
 | 
				
			||||||
 | 
					        for (const key in licenses) {
 | 
				
			||||||
 | 
					            const license: SmallLicense = licenses[key];
 | 
				
			||||||
 | 
					            allLicenses[license.path] = license
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return allLicenses;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -85,16 +85,12 @@ export default class MoreScreen extends UIElement {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const linkButton: UIElement[] = []
 | 
					        const linkButton: UIElement[] = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (const k in AllKnownLayouts.allSets) {
 | 
					        for (const layout of AllKnownLayouts.layoutsList) {
 | 
				
			||||||
            const layout: LayoutConfig = AllKnownLayouts.allSets[k];
 | 
					            if (layout.id === personal.id) {
 | 
				
			||||||
            if (k === personal.id) {
 | 
					 | 
				
			||||||
                if (State.state.osmConnection.userDetails.data.csCount < Constants.userJourney.personalLayoutUnlock) {
 | 
					                if (State.state.osmConnection.userDetails.data.csCount < Constants.userJourney.personalLayoutUnlock) {
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (layout.id !== k) {
 | 
					 | 
				
			||||||
                continue; // This layout was added multiple time due to an uppercase
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            linkButton.push(this.createLinkButton(layout));
 | 
					            linkButton.push(this.createLinkButton(layout));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,8 @@ export class Translation extends UIElement {
 | 
				
			||||||
    public static forcedLanguage = undefined;
 | 
					    public static forcedLanguage = undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public readonly translations: object
 | 
					    public readonly translations: object
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					    allIcons;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(translations: object, context?: string) {
 | 
					    constructor(translations: object, context?: string) {
 | 
				
			||||||
        super(Locale.language)
 | 
					        super(Locale.language)
 | 
				
			||||||
| 
						 | 
					@ -17,6 +19,9 @@ export class Translation extends UIElement {
 | 
				
			||||||
        let count = 0;
 | 
					        let count = 0;
 | 
				
			||||||
        for (const translationsKey in translations) {
 | 
					        for (const translationsKey in translations) {
 | 
				
			||||||
            count++;
 | 
					            count++;
 | 
				
			||||||
 | 
					            if(typeof(translations[translationsKey]) != "string"){
 | 
				
			||||||
 | 
					               throw "Error in an object depicting a translation: a non-string object was found. ("+context+")\n    You probably put some other section accidentally in the translation" 
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.translations = translations;
 | 
					        this.translations = translations;
 | 
				
			||||||
        if (count === 0) {
 | 
					        if (count === 0) {
 | 
				
			||||||
| 
						 | 
					@ -46,7 +51,7 @@ export class Translation extends UIElement {
 | 
				
			||||||
    public SupportedLanguages(): string[] {
 | 
					    public SupportedLanguages(): string[] {
 | 
				
			||||||
        const langs = []
 | 
					        const langs = []
 | 
				
			||||||
        for (const translationsKey in this.translations) {
 | 
					        for (const translationsKey in this.translations) {
 | 
				
			||||||
            if(translationsKey === "#"){
 | 
					            if (translationsKey === "#") {
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            langs.push(translationsKey)
 | 
					            langs.push(translationsKey)
 | 
				
			||||||
| 
						 | 
					@ -102,7 +107,6 @@ export class Translation extends UIElement {
 | 
				
			||||||
        return new Translation(this.translations)
 | 
					        return new Translation(this.translations)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    FirstSentence() {
 | 
					    FirstSentence() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const tr = {};
 | 
					        const tr = {};
 | 
				
			||||||
| 
						 | 
					@ -115,4 +119,38 @@ export class Translation extends UIElement {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new Translation(tr);
 | 
					        return new Translation(tr);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ExtractImages(isIcon = false): string[] {
 | 
				
			||||||
 | 
					        const allIcons: string[] = []
 | 
				
			||||||
 | 
					        for (const key in this.translations) {
 | 
				
			||||||
 | 
					            const render = this.translations[key]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (isIcon) {
 | 
				
			||||||
 | 
					                const icons = render.split(";").filter(part => part.match(/(\.svg|\.png|\.jpg)$/) != null)
 | 
				
			||||||
 | 
					                allIcons.push(...icons)
 | 
				
			||||||
 | 
					            } else if (!Utils.runningFromConsole) {
 | 
				
			||||||
 | 
					                // This might be a tagrendering containing some img as html
 | 
				
			||||||
 | 
					                const htmlElement = document.createElement("div")
 | 
				
			||||||
 | 
					                htmlElement.innerHTML = render
 | 
				
			||||||
 | 
					                const images = Array.from(htmlElement.getElementsByTagName("img")).map(img => img.src)
 | 
				
			||||||
 | 
					                allIcons.push(...images)
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // We are running this in ts-node (~= nodejs), and can not access document
 | 
				
			||||||
 | 
					                // So, we fallback to simple regex
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    const matches = render.match(/<img[^>]+>/g)
 | 
				
			||||||
 | 
					                    if (matches != null) {
 | 
				
			||||||
 | 
					                        const sources = matches.map(img => img.match(/src=("[^"]+"|'[^']+'|[^/ ]+)/))
 | 
				
			||||||
 | 
					                            .filter(match => match != null)
 | 
				
			||||||
 | 
					                            .map(match => match[1].trim().replace(/^['"]/, '').replace(/['"]$/, ''));
 | 
				
			||||||
 | 
					                        allIcons.push(...sources)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }catch(e){
 | 
				
			||||||
 | 
					                    console.error("Could not search for images: ", render, this.txt)
 | 
				
			||||||
 | 
					                    throw e
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return allIcons.filter(icon => icon != undefined)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/layers/benches/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "picnic_table.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/layers/bicycle_library/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bicycle_library.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										18
									
								
								assets/layers/bicycle_tube_vending_machine/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pinIcon.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "tube.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										16
									
								
								assets/layers/bike_cafe/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bike_cafe.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										18
									
								
								assets/layers/bike_cleaning/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bike_cleaning.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bike_cleaning_icon.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										12
									
								
								assets/layers/bike_monitoring_station/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Fabián Alexis"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "monitoring_station.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Antu_chronometer-reset.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -293,7 +293,6 @@
 | 
				
			||||||
      "question": {
 | 
					      "question": {
 | 
				
			||||||
        "en": "Does this bicycle parking have spots for cargo bikes?",
 | 
					        "en": "Does this bicycle parking have spots for cargo bikes?",
 | 
				
			||||||
        "nl": "Heeft deze fietsparking plaats voor bakfietsen?",
 | 
					        "nl": "Heeft deze fietsparking plaats voor bakfietsen?",
 | 
				
			||||||
        "fr": "TODO: fr",
 | 
					 | 
				
			||||||
        "gl": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?",
 | 
					        "gl": "Este aparcadoiro de bicicletas ten espazo para bicicletas de carga?",
 | 
				
			||||||
        "de": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?"
 | 
					        "de": "Gibt es auf diesem Fahrrad-Parkplatz Plätze für Lastenfahrräder?"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
| 
						 | 
					@ -303,7 +302,6 @@
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "en": "This parking has room for cargo bikes",
 | 
					            "en": "This parking has room for cargo bikes",
 | 
				
			||||||
            "nl": "Deze parking heeft plaats voor bakfietsen",
 | 
					            "nl": "Deze parking heeft plaats voor bakfietsen",
 | 
				
			||||||
            "fr": "TODO: fr",
 | 
					 | 
				
			||||||
            "gl": "Este aparcadoiro ten espazo para bicicletas de carga.",
 | 
					            "gl": "Este aparcadoiro ten espazo para bicicletas de carga.",
 | 
				
			||||||
            "de": "Dieser Parkplatz bietet Platz für Lastenfahrräder"
 | 
					            "de": "Dieser Parkplatz bietet Platz für Lastenfahrräder"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
| 
						 | 
					@ -313,7 +311,6 @@
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "en": "This parking has designated (official) spots for cargo bikes.",
 | 
					            "en": "This parking has designated (official) spots for cargo bikes.",
 | 
				
			||||||
            "nl": "Er zijn speciale plaatsen voorzien voor bakfietsen",
 | 
					            "nl": "Er zijn speciale plaatsen voorzien voor bakfietsen",
 | 
				
			||||||
            "fr": "TODO: fr",
 | 
					 | 
				
			||||||
            "gl": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga.",
 | 
					            "gl": "Este aparcadoiro ten espazos designados (oficiais) para bicicletas de carga.",
 | 
				
			||||||
            "de": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder."
 | 
					            "de": "Dieser Parkplatz verfügt über ausgewiesene (offizielle) Plätze für Lastenfahrräder."
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
| 
						 | 
					@ -323,7 +320,6 @@
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "en": "You're not allowed to park cargo bikes",
 | 
					            "en": "You're not allowed to park cargo bikes",
 | 
				
			||||||
            "nl": "Je mag hier geen bakfietsen parkeren",
 | 
					            "nl": "Je mag hier geen bakfietsen parkeren",
 | 
				
			||||||
            "fr": "TODO: fr",
 | 
					 | 
				
			||||||
            "gl": "Non está permitido aparcar bicicletas de carga",
 | 
					            "gl": "Non está permitido aparcar bicicletas de carga",
 | 
				
			||||||
            "de": "Es ist nicht erlaubt, Lastenfahrräder zu parken"
 | 
					            "de": "Es ist nicht erlaubt, Lastenfahrräder zu parken"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										100
									
								
								assets/layers/bike_parking/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,100 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Gitte Vande Graveele"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bollard.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/walk-by-brussels"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Gitte Vande Graveele"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "handlebar_holder.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/walk-by-brussels"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "parking.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "parking_old.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Gitte Vande Graveele"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "rack.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/walk-by-brussels"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Gitte Vande Graveele"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "shed.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/walk-by-brussels"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Gitte Vande Graveele"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "staple.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/walk-by-brussels"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Gitte Vande Graveele"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "two_tier.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/walk-by-brussels"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Gitte Vande Graveele"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "wall_loops.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/walk-by-brussels"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										126
									
								
								assets/layers/bike_repair_station/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,126 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bike_pump.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "broken_pump.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "broken_pump_2.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pump.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Turvec Solutions"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pump_example.png",
 | 
				
			||||||
 | 
					    "license": "Used with permission; all rights reserved",
 | 
				
			||||||
 | 
					    "note": "Used with permission after email conversation, can be assumed to be CC-BY",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://turvec.com/product/public-bike-pump/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pump_example_manual.jpg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "©Altinnova"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pump_example_round.jpg",
 | 
				
			||||||
 | 
					    "license": "Used with permission; all rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.altinnova.com",
 | 
				
			||||||
 | 
					      "https://www.teeken.de/produkte/stadtmobiliar/green-air1/12?lang=3"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "repair_station.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Polarbear24"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "repair_station_example.jpg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Public_Bike_Repair_Station.jpg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "repair_station_pump.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										58
									
								
								assets/layers/bike_shop/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pump.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "repair_shop.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "shop.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "tools.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										22
									
								
								assets/layers/bird_hide/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Font Awesome"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "birdhide.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://fontawesome.com"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Font Awesome Free 5.2.0 by @fontawesome"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "birdshelter.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://fontawesome.com\r"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/layers/cycling_themed_object/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "other_services.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										16
									
								
								assets/layers/drinking_water/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "drips.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/layers/ghost_bike/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "ghost_bike.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/layers/information_board/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "board.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Board-14.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										42
									
								
								assets/layers/maps/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "OpenStreetMap",
 | 
				
			||||||
 | 
					      " Pieter Vander Vennet",
 | 
				
			||||||
 | 
					      " M!dgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "map-stickered.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://OpenStreetMap.org",
 | 
				
			||||||
 | 
					      " https://wiki.openstreetmap.org/wiki/Logos"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "map.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.OpenStreetMap.org"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "note": "Modified OpenStreetMap logo"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "osm-logo-buggy-attr.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.OpenStreetMap.org"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "note": "Modified OpenStreetMap logo"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "osm-logo-white-bg.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.OpenStreetMap.org"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "note": "Modified OpenStreetMap logo"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										42
									
								
								assets/layers/nature_reserve/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Agentschap Natuur en Bos"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "ANB.jpg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.natuurenbos.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Natuurpunt"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "Natuurpunt.jpg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.natuurpunt.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Groen"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "groen_logo.svg",
 | 
				
			||||||
 | 
					    "license": "All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.groen.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@ Эдуард Черных"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "nature_reserve.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.onlinewebfonts.com/icon/389579"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -333,14 +333,14 @@
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "#": "Surface are",
 | 
					      "#": "Surface area",
 | 
				
			||||||
      "render": {
 | 
					      "render": {
 | 
				
			||||||
        "en": "Surface area: {_surface:ha}Ha",
 | 
					        "en": "Surface area: {_surface:ha}Ha"
 | 
				
			||||||
        "mappings": {
 | 
					      },
 | 
				
			||||||
 | 
					      "mappings":[ {
 | 
				
			||||||
          "if": "_surface:ha=0",
 | 
					          "if": "_surface:ha=0",
 | 
				
			||||||
          "then": ""
 | 
					          "then": {"*":""}
 | 
				
			||||||
        }
 | 
					        }]
 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "hideUnderlayingFeaturesMinPercentage": 10,
 | 
					  "hideUnderlayingFeaturesMinPercentage": 10,
 | 
				
			||||||
| 
						 | 
					@ -372,4 +372,4 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 40 KiB  | 
							
								
								
									
										12
									
								
								assets/layers/play_forest/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Agentschap Natuur en Bos"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "icon.svg",
 | 
				
			||||||
 | 
					    "license": "?",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.natuurenbos.be/spelen"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -313,7 +313,7 @@
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "hideUnderlayingFeaturesMinPercentage": 0,
 | 
					  "hideUnderlayingFeaturesMinPercentage": 0,
 | 
				
			||||||
  "icon": {
 | 
					  "icon": {
 | 
				
			||||||
    "render": "https://upload.wikimedia.org/wikipedia/commons/0/00/Map_icons_by_Scott_de_Jonge_-_playground.svg"
 | 
					    "render": "./assets/themes/playgrounds/playground.svg"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "iconOverlays": [
 | 
					  "iconOverlays": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -347,4 +347,4 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "wayHandling": 2
 | 
					  "wayHandling": 2
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								assets/layers/sport_pitch/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@fontawesome"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "tabletennis.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Font_Awesome_5_solid_table-tennis.svg",
 | 
				
			||||||
 | 
					      " https://fontawesome.com"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										27
									
								
								assets/layers/toilets/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "toilets.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Toilets-16.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "asianson.design",
 | 
				
			||||||
 | 
					      " Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "urinal.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://thenounproject.com/term/urinal/1307984/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "wheelchair.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										16
									
								
								assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<svg width="85" height="100" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
						<defs>
 | 
				
			||||||
 | 
							<linearGradient id="a" x1="0" x2="0" y1="0" y2="1">
 | 
				
			||||||
 | 
								<stop stop-color="#aa368d" offset="0"/>
 | 
				
			||||||
 | 
								<stop stop-color="#a8378c" offset=".25"/>
 | 
				
			||||||
 | 
								<stop stop-color="#92328a" offset=".6"/>
 | 
				
			||||||
 | 
								<stop stop-color="#792e87" offset=".75"/>
 | 
				
			||||||
 | 
								<stop stop-color="#542886" offset=".9"/>
 | 
				
			||||||
 | 
								<stop stop-color="#3b257c" offset="1"/>
 | 
				
			||||||
 | 
							</linearGradient>
 | 
				
			||||||
 | 
						</defs>
 | 
				
			||||||
 | 
						<path d="m42.5 99c-75-49.5-33.62-98 0-98 33.7 0 74.5 48.5-0 98" fill="url(#a)"/>
 | 
				
			||||||
 | 
						<rect x="36.25" y="19.25" width="12.5" height="36.5" rx="6.25" ry="6.25" fill="#fff"/>
 | 
				
			||||||
 | 
						<circle cx="42.5" cy="66" r="6.75" fill="#fff"/>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 700 B  | 
							
								
								
									
										12
									
								
								assets/layers/trees/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "M!dgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "Onroerend_Erfgoed_logo_without_text.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Onroerend_Erfgoed_logo_without_text.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -277,8 +277,8 @@
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "<img src=\"https://upload.wikimedia.org/wikipedia/commons/6/60/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen",
 | 
					            "nl": "<img src=\"./assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Erkend als houtig erfgoed door Onroerend Erfgoed Vlaanderen",
 | 
				
			||||||
            "en": "<img src=\"https://upload.wikimedia.org/wikipedia/commons/6/60/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Registered as heritage by <i>Onroerend Erfgoed</i> Flanders"
 | 
					            "en": "<img src=\"./assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Registered as heritage by <i>Onroerend Erfgoed</i> Flanders"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					@ -339,8 +339,8 @@
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "render": {
 | 
					      "render": {
 | 
				
			||||||
        "nl": "<img src=\"https://upload.wikimedia.org/wikipedia/commons/6/60/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed-ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>",
 | 
					        "nl": "<img src=\"./assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed-ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>",
 | 
				
			||||||
        "en": "<img src=\"https://upload.wikimedia.org/wikipedia/commons/6/60/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>"
 | 
					        "en": "<img src=\"./assets/layers/trees/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Onroerend Erfgoed ID: <a href=\"https://id.erfgoed.net/erfgoedobjecten/{ref:OnroerendErfgoed}\">{ref:OnroerendErfgoed}</a>"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "question": {
 | 
					      "question": {
 | 
				
			||||||
        "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?",
 | 
					        "nl": "Wat is het ID uitgegeven door Onroerend Erfgoed Vlaanderen?",
 | 
				
			||||||
| 
						 | 
					@ -359,8 +359,8 @@
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "render": {
 | 
					      "render": {
 | 
				
			||||||
        "nl": "<img src=\"https://upload.wikimedia.org/wikipedia/commons/e/e4/Wikidata-logo_S.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>",
 | 
					        "nl": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>",
 | 
				
			||||||
        "en": "<img src=\"https://upload.wikimedia.org/wikipedia/commons/e/e4/Wikidata-logo_S.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>"
 | 
					        "en": "<img src=\"./assets/svg/wikidata.svg\" style=\"width:1em;height:0.56em;vertical-align:middle\" alt=\"\"/> Wikidata: <a href=\"http://www.wikidata.org/entity/{wikidata}\">{wikidata}</a>"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "question": {
 | 
					      "question": {
 | 
				
			||||||
        "nl": "Wat is het Wikidata-ID van deze boom?",
 | 
					        "nl": "Wat is het Wikidata-ID van deze boom?",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/layers/viewpoint/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "viewpoint.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Viewpoint-16.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										64
									
								
								assets/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,64 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "SocialImage.png",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "OpenStreetMap"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "generic_osm_background.png",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.OpenStreetMap.org"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Mangrove Reviews"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "mangrove_logo.png",
 | 
				
			||||||
 | 
					    "license": "logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://mangrove.reviews/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "social_image_front.png",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      ""
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet",
 | 
				
			||||||
 | 
					      " OpenStreetMap"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "weblogo.png",
 | 
				
			||||||
 | 
					    "license": "Logo; CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://mapcomplete.osm.be",
 | 
				
			||||||
 | 
					      " https://www.openstreetmap.org"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet",
 | 
				
			||||||
 | 
					      " OpenStreetMap"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "weblogo.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://mapcomplete.osm.be",
 | 
				
			||||||
 | 
					      " https://www.openstreetmap.org"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										554
									
								
								assets/svg/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,554 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "SocialImageForeground.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      ""
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "add.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      ""
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "addSmall.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "ampersand.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "arrow-left-smooth.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "arrow-right-smooth.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "back.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Github"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bug.svg",
 | 
				
			||||||
 | 
					    "license": "MIT",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Octicons-bug.svg",
 | 
				
			||||||
 | 
					      " https://github.com/primer/octicons"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "camera-plus.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Dave Gandy",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://fontawesome.com/",
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Camera_font_awesome.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "checkmark.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "circle.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "clock.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "close.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "compass.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "cross_bottom_right.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "crosshair-blue-center.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "crosshair-blue.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "crosshair.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Dave Gandy"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "delete_icon.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Trash_font_awesome.svg\rT"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "direction.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "direction_gradient.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "down.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "envelope.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "The Tango Desktop Project"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "floppy.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Media-floppy.svg",
 | 
				
			||||||
 | 
					      " http://tango.freedesktop.org/Tango_Desktop_Project"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "gear.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "help.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Timothy Miller"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "home.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Home-icon.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Timothy Miller"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "home_white_bg.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Home-icon.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "JOSM Team"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "josm_logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:JOSM_Logotype_2019.svg",
 | 
				
			||||||
 | 
					      " https://josm.openstreetmap.de/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "layers.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "layersAdd.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Ornament-Horiz-0.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Nightwolfdezines"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Ornament-Horiz-1.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Nightwolfdezines"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Ornament-Horiz-2.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Nightwolfdezines"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Ornament-Horiz-3.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Nightwolfdezines"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Ornament-Horiz-4.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Nightwolfdezines"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Ornament-Horiz-5.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Nightwolfdezines"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Ornament-Horiz-6.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Nightwolfdezines"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.vecteezy.com/vector-art/226361-ornaments-and-flourishes"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "star.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "star_outline.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "star_half.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "star_outline_half.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "logout.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet",
 | 
				
			||||||
 | 
					      " OSM"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "mapcomplete_logo.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      ""
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Mapillary"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "mapillary.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://mapillary.com/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "min.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "no_checkmark.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "or.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "osm-copyright.svg",
 | 
				
			||||||
 | 
					    "license": "logo; all rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.OpenStreetMap.org"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "OpenStreetMap U.S. Chapter"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "osm-logo-us.svg",
 | 
				
			||||||
 | 
					    "license": "Logo",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.openstreetmap.us/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "osm-logo.svg",
 | 
				
			||||||
 | 
					    "license": "logo; all rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.OpenStreetMap.org"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "GitHub Octicons"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pencil.svg",
 | 
				
			||||||
 | 
					    "license": "MIT",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://github.com/primer/octicons",
 | 
				
			||||||
 | 
					      " https://commons.wikimedia.org/wiki/File:Octicons-pencil.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@ tyskrat"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "phone.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.onlinewebfonts.com/icon/1059"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "pin.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "plus.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@fatih"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "pop-out.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.onlinewebfonts.com/icon/2151"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "reload.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "ring.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "OOjs UI Team and other contributors"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "search.svg",
 | 
				
			||||||
 | 
					    "license": "MIT",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:OOjs_UI_indicator_search-rtl.svg",
 | 
				
			||||||
 | 
					      "https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/AUTHORS.txt"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "send_email.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "share.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "square.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@felpgrc"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "statistics.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.onlinewebfonts.com/icon/197818"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "MGalloway (WMF)"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "translate.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_language-ltr.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "up.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Wikidata"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "wikidata.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.wikidata.org"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Wikimedia"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "wikimedia-commons-white.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Wikipedia"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "wikipedia.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.wikipedia.org/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										22
									
								
								assets/themes/aed/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "MaxxL"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "aed.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:ISO_7010_E010.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "M!dgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:ISO_7010_E010.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/themes/artwork/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "artwork.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Statue-14.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										24
									
								
								assets/themes/benches/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Tobias Zwick"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bench_poi.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://github.com/streetcomplete/StreetComplete/blob/v25.0-beta1/res/graphics/authors.txt",
 | 
				
			||||||
 | 
					      "https://github.com/streetcomplete/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Tobias Zwick"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bench_public_transport.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://github.com/streetcomplete/StreetComplete/blob/v25.0-beta1/res/graphics/authors.txt",
 | 
				
			||||||
 | 
					      "https://github.com/streetcomplete/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/themes/bicycle_library/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/themes/bookcases/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "bookcase.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Public_bookcase-14.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										72
									
								
								assets/themes/buurtnatuur/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,72 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Agentschap Natuur en Bos"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "ANB.jpg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.natuurenbos.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Natuurpunt"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "Natuurpunt.jpg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.natuurpunt.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@ Federico Sibella"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "forest.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.onlinewebfonts.com/icon/498112"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Groen"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "groen_logo.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.groen.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@ Эдуард Черных"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "nature_reserve.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.onlinewebfonts.com/icon/389579"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "@sterankofrank"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "park.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "http://www.onlinewebfonts.com/icon/425974"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Groen"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "social_image.jpg",
 | 
				
			||||||
 | 
					    "license": "All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      ""
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										45
									
								
								assets/themes/campersites/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,45 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "Barßel_Wohnmobilstellplatz.jpg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "ES01"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Bar%C3%9Fel_Wohnmobilstellplatz.jpg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "caravan.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "OsmAnd"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://github.com/osmandapp/Osmand/blob/master/LICENSE",
 | 
				
			||||||
 | 
					      "https://github.com/osmandapp/OsmAnd-resources/blob/36d8b90a8933e0a28f9ee19f28abbd520f9da3c7/icons/svg/accommodation/caravan.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "caravan_green.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "OsmAnd"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://github.com/osmandapp/Osmand/blob/master/LICENSE",
 | 
				
			||||||
 | 
					      "https://github.com/osmandapp/OsmAnd-resources/blob/36d8b90a8933e0a28f9ee19f28abbd520f9da3c7/icons/svg/accommodation/caravan.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "sanitary_dump_station.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "OsmAnd"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://github.com/osmandapp/Osmand/blob/master/LICENSE",
 | 
				
			||||||
 | 
					      "https://github.com/osmandapp/OsmAnd-resources/blob/16892d8b2fc00dd422abfb2fef967d5ccd05eeac/icons/svg/poi/sanitary_dump_station.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										31
									
								
								assets/themes/charging_stations/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Stijn Wens"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bicycle.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wens.be/free-antwerpenize-bicycle-font",
 | 
				
			||||||
 | 
					      " https://antwerpenize.be/post/634396003556081664/antwerpenize-lettertype"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "car.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "plug.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										79
									
								
								assets/themes/climbing/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,79 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Christian Neumann"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "climbing_gym.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://utopicode.de/",
 | 
				
			||||||
 | 
					      "https://github.com/chrneumann/MapComplete"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Christian Neumann"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "climbing_icon.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://utopicode.de/",
 | 
				
			||||||
 | 
					      "https://github.com/chrneumann/MapComplete"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Christian Neumann"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "climbing_no_rope.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://utopicode.de/",
 | 
				
			||||||
 | 
					      "https://github.com/chrneumann/MapComplete"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Christian Neumann"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "climbing_rope.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://utopicode.de/",
 | 
				
			||||||
 | 
					      "https://github.com/chrneumann/MapComplete"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Christian Neumann"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "climbing_route.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://utopicode.de/",
 | 
				
			||||||
 | 
					      "https://github.com/chrneumann/MapComplete"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Christian Neumann"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "climbing_unknown.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://utopicode.de/",
 | 
				
			||||||
 | 
					      "https://github.com/chrneumann/MapComplete"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Christian Neumann"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "club.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://utopicode.de/",
 | 
				
			||||||
 | 
					      "https://github.com/chrneumann/MapComplete"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										22
									
								
								assets/themes/cyclestreets/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "The RedBurn"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "F111.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_F111_nl.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "The RedBurn"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "F113.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Belgian_road_sign_F113_nl.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,7 @@
 | 
				
			||||||
    "de"
 | 
					    "de"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "maintainer": "MapComplete",
 | 
					  "maintainer": "MapComplete",
 | 
				
			||||||
 | 
					  "credits": "Originally created during Open Summer of Code by Pieter Fiers, Thibault Declercq, Pierre Barban, Joost Schouppe and Pieter Vander Vennet",
 | 
				
			||||||
  "icon": "assets/themes/cyclofix/logo.svg",
 | 
					  "icon": "assets/themes/cyclofix/logo.svg",
 | 
				
			||||||
  "version": "0",
 | 
					  "version": "0",
 | 
				
			||||||
  "startLat": 0,
 | 
					  "startLat": 0,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										36
									
								
								assets/themes/cyclofix/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "De Fietsambassade"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "fietsambassade_gent_logo.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://fietsambassade.gent.be"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "De Fietsambassade"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "fietsambassade_gent_logo_small.svg",
 | 
				
			||||||
 | 
					    "license": "Logo; All rights reserved",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://fietsambassade.gent.be"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										44
									
								
								assets/themes/cyclofix/unused_assets/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "place_with_pump.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "non_bike_repair_shop.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "non_bike_shop.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 2.7 MiB  | 
							
								
								
									
										16
									
								
								assets/themes/drinking_water/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Fiers",
 | 
				
			||||||
 | 
					      "Thibault Declercq",
 | 
				
			||||||
 | 
					      "Pierre Barban",
 | 
				
			||||||
 | 
					      "Joost Schouppe",
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://osoc.be/editions/2020/cyclofix"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										102
									
								
								assets/themes/facadegardens/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,102 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bloei.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "bodembedekker.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "eetbaar.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "gevelton.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "geveltuin.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "halfzon.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "klimplant.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "schaduw.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "struik.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Klimaan VZW"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "zon.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://klimaan.be/"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										22
									
								
								assets/themes/fritures/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Freepik"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.flaticon.com/free-icon/french-fries_1144288"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Freepik"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "fries.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.flaticon.com/free-icon/french-fries_1144288"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										1
									
								
								assets/themes/fruit_trees/fruit_tree.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve"><g><circle fill="#000000" cx="38.612" cy="57.84" r="4.324"></circle><circle fill="#000000" cx="22.758" cy="53.401" r="4.324"></circle><circle fill="#000000" cx="20.568" cy="38.942" r="4.324"></circle><path fill="#000000" d="M77.255,46.586c1.56-1.04,4.097-3.166,4.443-6.156c0.151-1.302-0.082-3.158-1.779-5.133   c0.825-1.783,1.815-4.765,0.856-7.45c-0.401-1.127-1.292-2.578-3.258-3.567c-0.462-1.787-1.656-4.959-4.522-6.666   c-1.802-1.071-3.884-1.355-6.203-0.854c-0.652-1.04-1.688-2.239-3.231-2.913c-0.9-0.394-2.229-0.705-3.9-0.353   c-1.023-1.537-2.862-3.653-5.63-4.541c-2.332-0.75-4.809-0.5-7.375,0.734c-0.965-0.603-2.384-1.213-4.122-1.116   c-1.748,0.096-3.378,0.869-4.865,2.302c-1.873-1.025-4.958-2.261-7.738-1.28c-1.146,0.404-2.582,1.313-3.564,3.351   c-1.711-0.076-4.216,0.156-5.963,1.853c-0.898,0.873-1.837,2.386-1.789,4.881c-1.876,0.678-4.57,2.046-5.619,4.53   c-0.372,0.882-0.632,2.135-0.234,3.674c-1.775,0.856-4.052,2.383-4.96,4.83c-0.438,1.179-0.676,2.936,0.263,5.095   c-1.171,1.221-2.661,3.247-2.959,5.846c-0.256,2.238,0.388,4.417,1.915,6.492c-0.504,1.859-1.119,5.386,0.459,8.011   c0.475,0.788,1.28,1.715,2.624,2.324c-0.067,1.598,0.179,3.814,1.628,5.697c1.448,1.885,3.702,2.929,6.695,3.126   c0.384,1.995,2.135,3.504,4.241,3.504c1.686,0,3.13-0.975,3.844-2.382c1.001,0.352,2.019,0.501,3.006,0.501   c1.121,0,2.195-0.187,3.165-0.442c0.707,1.636,2.371,2.737,4.253,2.608c1.693-0.116,3.077-1.202,3.685-2.672   c0.559-0.016,1.131-0.081,1.713-0.241c1.91-0.522,3.479-1.797,4.677-3.799c1.158,0.205,2.848,0.258,4.517-0.59   c1.87-0.95,3.224-2.747,4.03-5.346c0.812-0.15,1.856-0.509,2.819-1.338c0.426-0.366,0.789-0.796,1.104-1.274   c3.9,4.479,5.844,10.147,5.781,16.925c-0.062,6.806-2.223,12.233-2.245,12.288c-0.135,0.333-0.095,0.712,0.105,1.01   c0.202,0.297,0.537,0.477,0.896,0.477h15.134c0.579,0,1.056-0.456,1.079-1.034c0.604-14.172-3.678-25.654-9.613-33.623   c1.561-0.406,3.193-1.123,4.47-2.386C76.383,50.203,77.121,48.527,77.255,46.586z M72.938,45.516   c0.119,1.682-0.45,2.457-0.889,2.894c-1.131,1.125-3.163,1.507-4.688,1.608c-4.747-4.965-10.091-7.932-14.73-8.544   c-0.755-0.099-1.542-0.25-2.401-0.46c-6.739-2.44-6.931-11.761-6.932-11.855c-0.007-0.517-0.378-0.958-0.887-1.05   c-0.514-0.098-1.013,0.187-1.201,0.668c-0.936,2.39-0.465,6.405,0.248,8.956c-7.655-1.251-13.255-11.143-13.314-11.25   c-0.202-0.363-0.601-0.58-1.012-0.552c-0.416,0.026-0.78,0.288-0.936,0.674C24.38,31.12,31.333,39.79,41.485,46.146   c-5.066-0.652-10.301-4.816-10.358-4.862c-0.414-0.333-1.008-0.315-1.4,0.04c-0.394,0.355-0.474,0.943-0.185,1.389   c4.261,6.608,9.249,7.089,14.072,7.553c3.65,0.352,7.424,0.716,11.42,3.565c0.724,0.517,1.401,1.062,2.05,1.626   c-0.741,1.774-2.154,1.872-2.651,1.848c-0.813-0.066-1.545,0.461-1.727,1.252c-0.514,2.235-1.398,3.693-2.627,4.33   c-1.526,0.794-3.256,0.104-3.261,0.104c-0.807-0.343-1.741,0.012-2.109,0.808c-0.833,1.795-1.916,2.887-3.218,3.25   c-2.252,0.628-4.644-0.969-4.663-0.981c-0.53-0.365-1.229-0.378-1.774-0.04c-0.047,0.028-4.756,2.894-8.182,1.032   c-0.053-0.028-0.109-0.045-0.163-0.067c-0.609-1.649-2.182-2.831-4.043-2.831c-1.006,0-1.919,0.357-2.653,0.933   c-0.169-0.042-0.344-0.071-0.526-0.071c-2.107,0-3.562-0.493-4.319-1.466c-1.002-1.285-0.762-3.392-0.588-4.082   c0.159-0.602,0.052-1.242-0.295-1.759c-0.347-0.516-0.899-0.859-1.516-0.939c-1.044-0.136-1.403-0.547-1.582-0.843   c-0.826-1.365-0.177-4.289,0.265-5.488c0.281-0.749,0.125-1.591-0.405-2.19c-1.254-1.417-1.794-2.755-1.649-4.089   c0.259-2.381,2.621-4.129,2.635-4.14c0.955-0.679,1.194-1.995,0.541-2.967c-1.14-1.695-0.823-2.555-0.72-2.837   c0.611-1.664,3.431-2.795,4.363-3.059c0.662-0.183,1.197-0.667,1.443-1.307c0.247-0.64,0.176-1.359-0.193-1.938   c-0.808-1.268-0.568-1.837-0.489-2.024c0.499-1.193,2.937-2.219,4.421-2.536c1.159-0.241,1.908-1.369,1.682-2.531   c-0.194-0.995-0.295-2.311,0.331-2.924c0.852-0.833,3.011-0.694,3.917-0.498c1.131,0.258,2.27-0.432,2.567-1.559   c0.317-1.208,0.812-1.94,1.47-2.174c1.546-0.549,4.324,0.939,5.424,1.742c0.952,0.703,2.288,0.509,3.004-0.43   c0.693-0.911,1.769-2.013,2.949-2.093c1.183-0.085,2.142,0.857,2.143,0.857c0.698,0.735,1.816,0.883,2.685,0.359   c1.916-1.16,3.64-1.51,5.12-1.043c2.6,0.82,3.977,3.875,3.985,3.896c0.23,0.538,0.671,0.959,1.219,1.167   c0.547,0.208,1.156,0.184,1.686-0.064c1.354-0.635,2.021-0.351,2.239-0.259c0.994,0.424,1.625,1.745,1.779,2.202   c0.181,0.564,0.583,1.03,1.116,1.288c0.533,0.258,1.151,0.286,1.703,0.078c1.801-0.677,3.266-0.691,4.356-0.05   c1.809,1.066,2.579,3.84,2.722,4.81c0.114,0.814,0.679,1.494,1.458,1.754c1.266,0.422,1.604,1.006,1.749,1.409   c0.599,1.662-0.754,4.419-1.272,5.25c-0.574,0.91-0.393,2.103,0.427,2.8c1.113,0.948,1.635,1.817,1.549,2.58   c-0.163,1.442-2.295,2.992-3.296,3.514C73.338,43.834,72.878,44.652,72.938,45.516z"></path></g></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 4.8 KiB  | 
| 
						 | 
					@ -13,13 +13,14 @@
 | 
				
			||||||
    "nl"
 | 
					    "nl"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "maintainer": "",
 | 
					  "maintainer": "",
 | 
				
			||||||
  "icon": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Low_Hanging_Fruit_-_The_Noun_Project.svg",
 | 
					  "icon": "./assets/themes/fruit_trees/fruit_tree.svg",
 | 
				
			||||||
  "version": "0",
 | 
					  "version": "0",
 | 
				
			||||||
  "startLat": 0,
 | 
					  "startLat": 0,
 | 
				
			||||||
  "startLon": 0,
 | 
					  "startLon": 0,
 | 
				
			||||||
  "startZoom": 1,
 | 
					  "startZoom": 1,
 | 
				
			||||||
  "widenFactor": 0.001,
 | 
					  "widenFactor": 0.001,
 | 
				
			||||||
  "socialImage": "",
 | 
					  "socialImage": "",
 | 
				
			||||||
 | 
					  "hideFromOverview": true,
 | 
				
			||||||
  "layers": [
 | 
					  "layers": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "id": "orchards",
 | 
					      "id": "orchards",
 | 
				
			||||||
| 
						 | 
					@ -27,11 +28,12 @@
 | 
				
			||||||
        "nl": "Boomgaarden"
 | 
					        "nl": "Boomgaarden"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "minzoom": 12,
 | 
					      "minzoom": 12,
 | 
				
			||||||
      "overpassTags": {
 | 
					      "source":{
 | 
				
			||||||
 | 
					      "osmTags": {
 | 
				
			||||||
        "and": [
 | 
					        "and": [
 | 
				
			||||||
          "landuse=orchard"
 | 
					          "landuse=orchard"
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					     } },
 | 
				
			||||||
      "title": {
 | 
					      "title": {
 | 
				
			||||||
        "render": {
 | 
					        "render": {
 | 
				
			||||||
          "nl": "Boomgaard"
 | 
					          "nl": "Boomgaard"
 | 
				
			||||||
| 
						 | 
					@ -72,11 +74,12 @@
 | 
				
			||||||
        "nl": "Boom"
 | 
					        "nl": "Boom"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "minzoom": 12,
 | 
					      "minzoom": 12,
 | 
				
			||||||
      "overpassTags": {
 | 
					      "source":{
 | 
				
			||||||
 | 
					      "osmTags": {
 | 
				
			||||||
        "and": [
 | 
					        "and": [
 | 
				
			||||||
          "natural=tree"
 | 
					          "natural=tree"
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      }},
 | 
				
			||||||
      "title": {
 | 
					      "title": {
 | 
				
			||||||
        "render": {
 | 
					        "render": {
 | 
				
			||||||
          "nl": "Boom"
 | 
					          "nl": "Boom"
 | 
				
			||||||
| 
						 | 
					@ -138,7 +141,7 @@
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "hideUnderlayingFeaturesMinPercentage": 0,
 | 
					      "hideUnderlayingFeaturesMinPercentage": 0,
 | 
				
			||||||
      "icon": {
 | 
					      "icon": {
 | 
				
			||||||
        "render": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Low_Hanging_Fruit_-_The_Noun_Project.svg"
 | 
					        "render": "./assets/themes/fruit_trees/fruit_tree.svg"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "width": {
 | 
					      "width": {
 | 
				
			||||||
        "render": "8"
 | 
					        "render": "8"
 | 
				
			||||||
| 
						 | 
					@ -165,4 +168,4 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "roamingRenderings": []
 | 
					  "roamingRenderings": []
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								assets/themes/fruit_trees/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "fruit_tree.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "The Noun Project"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://upload.wikimedia.org/wikipedia/commons/4/4e/Low_Hanging_Fruit_-_The_Noun_Project.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/themes/ghostbikes/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										12
									
								
								assets/themes/maps/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "CC0"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Board-14.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										12
									
								
								assets/themes/nature/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Font Awesome"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://fontawesome.com"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 85 KiB  | 
							
								
								
									
										13
									
								
								assets/themes/playgrounds/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Scott de Jonge"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "playground.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Map_icons_by_Scott_de_Jonge_-_playground.svg",
 | 
				
			||||||
 | 
					      " https://github.com/scottdejonge/map-icons/blob/b74a0e00afdd6b734883671da7a9e5f30497353e/src/icons/playground.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/themes/shops/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "shop.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Convenience-14.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -1,78 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
					 | 
				
			||||||
<svg
 | 
					 | 
				
			||||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
					 | 
				
			||||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
					 | 
				
			||||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
					 | 
				
			||||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
					 | 
				
			||||||
   xmlns="http://www.w3.org/2000/svg"
 | 
					 | 
				
			||||||
   xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
					 | 
				
			||||||
   id="svg8"
 | 
					 | 
				
			||||||
   version="1.1"
 | 
					 | 
				
			||||||
   viewBox="0 0 100 100"
 | 
					 | 
				
			||||||
   height="100"
 | 
					 | 
				
			||||||
   width="100">
 | 
					 | 
				
			||||||
  <metadata
 | 
					 | 
				
			||||||
     id="metadata8">
 | 
					 | 
				
			||||||
    <rdf:RDF>
 | 
					 | 
				
			||||||
      <cc:Work
 | 
					 | 
				
			||||||
         rdf:about="">
 | 
					 | 
				
			||||||
        <dc:format>image/svg+xml</dc:format>
 | 
					 | 
				
			||||||
        <dc:type
 | 
					 | 
				
			||||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
					 | 
				
			||||||
        <dc:title></dc:title>
 | 
					 | 
				
			||||||
      </cc:Work>
 | 
					 | 
				
			||||||
    </rdf:RDF>
 | 
					 | 
				
			||||||
  </metadata>
 | 
					 | 
				
			||||||
  <defs
 | 
					 | 
				
			||||||
     id="defs6">
 | 
					 | 
				
			||||||
    <linearGradient
 | 
					 | 
				
			||||||
       id="linearGradient823">
 | 
					 | 
				
			||||||
      <stop
 | 
					 | 
				
			||||||
         id="stop819"
 | 
					 | 
				
			||||||
         offset="0"
 | 
					 | 
				
			||||||
         style="stop-color:#55ff55;stop-opacity:1;" />
 | 
					 | 
				
			||||||
      <stop
 | 
					 | 
				
			||||||
         id="stop821"
 | 
					 | 
				
			||||||
         offset="1"
 | 
					 | 
				
			||||||
         style="stop-color:#55ff55;stop-opacity:0;" />
 | 
					 | 
				
			||||||
    </linearGradient>
 | 
					 | 
				
			||||||
    <linearGradient
 | 
					 | 
				
			||||||
       id="linearGradient820">
 | 
					 | 
				
			||||||
      <stop
 | 
					 | 
				
			||||||
         style="stop-color:#000000;stop-opacity:1;"
 | 
					 | 
				
			||||||
         offset="0"
 | 
					 | 
				
			||||||
         id="innercolor" />
 | 
					 | 
				
			||||||
      <stop
 | 
					 | 
				
			||||||
         style="stop-color:#000000;stop-opacity:0"
 | 
					 | 
				
			||||||
         offset="1"
 | 
					 | 
				
			||||||
         id="outercolor" />
 | 
					 | 
				
			||||||
    </linearGradient>
 | 
					 | 
				
			||||||
    <radialGradient
 | 
					 | 
				
			||||||
       xlink:href="#linearGradient820"
 | 
					 | 
				
			||||||
       id="radialGradient828"
 | 
					 | 
				
			||||||
       cx="49.787739"
 | 
					 | 
				
			||||||
       cy="53.828533"
 | 
					 | 
				
			||||||
       fx="49.787739"
 | 
					 | 
				
			||||||
       fy="53.828533"
 | 
					 | 
				
			||||||
       r="28.883806"
 | 
					 | 
				
			||||||
       gradientTransform="matrix(1.5439431,-0.01852438,0.02075364,1.7297431,-28.198837,-42.329969)"
 | 
					 | 
				
			||||||
       gradientUnits="userSpaceOnUse" />
 | 
					 | 
				
			||||||
    <radialGradient
 | 
					 | 
				
			||||||
       gradientUnits="userSpaceOnUse"
 | 
					 | 
				
			||||||
       gradientTransform="matrix(1,0,0,0.99367722,0,0.31814846)"
 | 
					 | 
				
			||||||
       r="50.261864"
 | 
					 | 
				
			||||||
       fy="50.317799"
 | 
					 | 
				
			||||||
       fx="50.211864"
 | 
					 | 
				
			||||||
       cy="50.317799"
 | 
					 | 
				
			||||||
       cx="50.211864"
 | 
					 | 
				
			||||||
       id="radialGradient825"
 | 
					 | 
				
			||||||
       xlink:href="#linearGradient823" />
 | 
					 | 
				
			||||||
  </defs>
 | 
					 | 
				
			||||||
  <ellipse
 | 
					 | 
				
			||||||
     ry="49.89407"
 | 
					 | 
				
			||||||
     rx="50.211864"
 | 
					 | 
				
			||||||
     cy="50.317799"
 | 
					 | 
				
			||||||
     cx="50.211864"
 | 
					 | 
				
			||||||
     id="path817"
 | 
					 | 
				
			||||||
     style="fill:url(#radialGradient825);fill-opacity:1;stroke:#0f0000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.98823529" />
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 2.3 KiB  | 
							
								
								
									
										34
									
								
								assets/themes/surveillance_cameras/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,34 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "cam_left.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "cam_right.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "dome.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Pieter Vander Vennet"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										10
									
								
								assets/themes/toilets/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "toilets.svg",
 | 
				
			||||||
 | 
					    "license": "CC0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://wiki.openstreetmap.org/wiki/File:Toilets-16.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -1,83 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
					 | 
				
			||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<svg
 | 
					 | 
				
			||||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
					 | 
				
			||||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
					 | 
				
			||||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
					 | 
				
			||||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
					 | 
				
			||||||
   xmlns="http://www.w3.org/2000/svg"
 | 
					 | 
				
			||||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
					 | 
				
			||||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
					 | 
				
			||||||
   version="1.1"
 | 
					 | 
				
			||||||
   width="14"
 | 
					 | 
				
			||||||
   height="14"
 | 
					 | 
				
			||||||
   viewBox="0 0 14 14"
 | 
					 | 
				
			||||||
   id="svg2"
 | 
					 | 
				
			||||||
   sodipodi:docname="guidepost.svg"
 | 
					 | 
				
			||||||
   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
 | 
					 | 
				
			||||||
  <sodipodi:namedview
 | 
					 | 
				
			||||||
     pagecolor="#ffffff"
 | 
					 | 
				
			||||||
     bordercolor="#666666"
 | 
					 | 
				
			||||||
     borderopacity="1"
 | 
					 | 
				
			||||||
     objecttolerance="10"
 | 
					 | 
				
			||||||
     gridtolerance="10"
 | 
					 | 
				
			||||||
     guidetolerance="10"
 | 
					 | 
				
			||||||
     inkscape:pageopacity="0"
 | 
					 | 
				
			||||||
     inkscape:pageshadow="2"
 | 
					 | 
				
			||||||
     inkscape:window-width="1920"
 | 
					 | 
				
			||||||
     inkscape:window-height="1001"
 | 
					 | 
				
			||||||
     id="namedview7"
 | 
					 | 
				
			||||||
     showgrid="false"
 | 
					 | 
				
			||||||
     inkscape:zoom="33.714286"
 | 
					 | 
				
			||||||
     inkscape:cx="11.006743"
 | 
					 | 
				
			||||||
     inkscape:cy="3.62286"
 | 
					 | 
				
			||||||
     inkscape:window-x="0"
 | 
					 | 
				
			||||||
     inkscape:window-y="0"
 | 
					 | 
				
			||||||
     inkscape:window-maximized="1"
 | 
					 | 
				
			||||||
     inkscape:current-layer="layer1" />
 | 
					 | 
				
			||||||
  <metadata
 | 
					 | 
				
			||||||
     id="metadata8">
 | 
					 | 
				
			||||||
    <rdf:RDF>
 | 
					 | 
				
			||||||
      <cc:Work
 | 
					 | 
				
			||||||
         rdf:about="">
 | 
					 | 
				
			||||||
        <dc:format>image/svg+xml</dc:format>
 | 
					 | 
				
			||||||
        <dc:type
 | 
					 | 
				
			||||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
					 | 
				
			||||||
        <dc:title />
 | 
					 | 
				
			||||||
      </cc:Work>
 | 
					 | 
				
			||||||
    </rdf:RDF>
 | 
					 | 
				
			||||||
  </metadata>
 | 
					 | 
				
			||||||
  <defs
 | 
					 | 
				
			||||||
     id="defs6" />
 | 
					 | 
				
			||||||
  <rect
 | 
					 | 
				
			||||||
     width="14"
 | 
					 | 
				
			||||||
     height="14"
 | 
					 | 
				
			||||||
     x="0"
 | 
					 | 
				
			||||||
     y="0"
 | 
					 | 
				
			||||||
     id="canvas"
 | 
					 | 
				
			||||||
     style="fill:none;stroke:none;visibility:hidden" />
 | 
					 | 
				
			||||||
  <g
 | 
					 | 
				
			||||||
     inkscape:groupmode="layer"
 | 
					 | 
				
			||||||
     id="layer1"
 | 
					 | 
				
			||||||
     inkscape:label="bg"
 | 
					 | 
				
			||||||
     style="display:inline">
 | 
					 | 
				
			||||||
    <circle
 | 
					 | 
				
			||||||
       style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:32.77777863;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
					 | 
				
			||||||
       id="path820"
 | 
					 | 
				
			||||||
       cx="7"
 | 
					 | 
				
			||||||
       cy="7"
 | 
					 | 
				
			||||||
       r="7" />
 | 
					 | 
				
			||||||
  </g>
 | 
					 | 
				
			||||||
  <g
 | 
					 | 
				
			||||||
     inkscape:groupmode="layer"
 | 
					 | 
				
			||||||
     id="layer2"
 | 
					 | 
				
			||||||
     inkscape:label="fg"
 | 
					 | 
				
			||||||
     sodipodi:insensitive="true">
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
       d="m 7.2669492,1.9396186 c -0.282839,0 -0.565678,0.1885594 -0.565678,0.565678 v 9.8050844 h 1.131356 V 2.5052966 c 0,-0.3771186 -0.282839,-0.565678 -0.565678,-0.565678 z M 3.4957628,2.5052966 1.9872882,3.6366525 3.4957628,4.7680085 H 6.5127119 V 2.5052966 Z M 8.0211865,4.7680085 V 7.0307203 H 11.038135 L 12.54661,5.8993644 11.038135,4.7680085 Z"
 | 
					 | 
				
			||||||
       id="guidepost"
 | 
					 | 
				
			||||||
       style="fill:#555555;fill-opacity:1;stroke:none;stroke-width:0.75423729"
 | 
					 | 
				
			||||||
       inkscape:connector-curvature="0" />
 | 
					 | 
				
			||||||
  </g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 2.6 KiB  | 
							
								
								
									
										52
									
								
								assets/themes/trees/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "broadleaved.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Midgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.openstreetmap.org/user/M!dgard"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "leafless.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Midgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.openstreetmap.org/user/M!dgard"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Midgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.openstreetmap.org/user/M!dgard"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "needleleaved.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Midgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.openstreetmap.org/user/M!dgard"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "unknown.svg",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Midgard"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "license": "CC BY-SA 4.0",
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://www.openstreetmap.org/user/M!dgard"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										8
									
								
								assets/themes/widths/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "authors": [],
 | 
				
			||||||
 | 
					    "path": "icon.svg",
 | 
				
			||||||
 | 
					    "license": "CC0; trivial",
 | 
				
			||||||
 | 
					    "sources": []
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
| 
						 | 
					@ -519,7 +519,15 @@
 | 
				
			||||||
        "nl": "Met dank aan"
 | 
					        "nl": "Met dank aan"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "attributionContent": {
 | 
					      "attributionContent": {
 | 
				
			||||||
        "en": "<p>All data is provided by <a href='https://osm.org' target='_blank'>OpenStreetMap</a>, freely reusable under <a href='https://osm.org/copyright' target='_blank'>the Open DataBase License</a>.</p><p>Some images are provided by Wikimedia</p>"
 | 
					        "en": "<p>All data is provided by <a href='https://osm.org' target='_blank'>OpenStreetMap</a>, freely reusable under <a href='https://osm.org/copyright' target='_blank'>the Open DataBase License</a>.</p>"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "themeBy": {
 | 
				
			||||||
 | 
					        "en": "Theme maintained by {author}"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "iconAttribution": {
 | 
				
			||||||
 | 
					        "title": {
 | 
				
			||||||
 | 
					          "en": "Used icons"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 175 KiB  | 
| 
						 | 
					@ -27,7 +27,7 @@
 | 
				
			||||||
    <link rel="icon" href="./assets/svg/add.svg" sizes="any" type="image/svg+xml">
 | 
					    <link rel="icon" href="./assets/svg/add.svg" sizes="any" type="image/svg+xml">
 | 
				
			||||||
    <meta property="og:image" content="./assets/SocialImage.png">
 | 
					    <meta property="og:image" content="./assets/SocialImage.png">
 | 
				
			||||||
    <meta property="og:title" content="MapComplete - editable, thematic maps with OpenStreetMap">
 | 
					    <meta property="og:title" content="MapComplete - editable, thematic maps with OpenStreetMap">
 | 
				
			||||||
    <meta property="og:description" content="MapComplete is a platform to visualize OpenStreetMap on a specific topic and to easily contribute data back to it.">`
 | 
					    <meta property="og:description" content="MapComplete is a platform to visualize OpenStreetMap on a specific topic and to easily contribute data back to it.">
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <link rel="apple-touch-icon" sizes="512x512" href="./assets/generated/svg_mapcomplete_logo512.png">
 | 
					    <link rel="apple-touch-icon" sizes="512x512" href="./assets/generated/svg_mapcomplete_logo512.png">
 | 
				
			||||||
    <link rel="apple-touch-icon" sizes="384x384" href="./assets/generated/svg_mapcomplete_logo384.png">
 | 
					    <link rel="apple-touch-icon" sizes="384x384" href="./assets/generated/svg_mapcomplete_logo384.png">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								index.ts
									
										
									
									
									
								
							
							
						
						| 
						 | 
					@ -52,7 +52,7 @@ if (location.hostname === "localhost" || location.hostname === "127.0.0.1") {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ----------------- SELECT THE RIGHT QUESTSET -----------------
 | 
					// ----------------- SELECT THE RIGHT Theme -----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const path = window.location.pathname.split("/").slice(-1)[0];
 | 
					const path = window.location.pathname.split("/").slice(-1)[0];
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,7 @@ if (path !== "index.html" && path !== "") {
 | 
				
			||||||
    console.log("Using layout", defaultLayout);
 | 
					    console.log("Using layout", defaultLayout);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
defaultLayout = QueryParameters.GetQueryParameter("layout", defaultLayout, "The layout to load into MapComplete").data;
 | 
					defaultLayout = QueryParameters.GetQueryParameter("layout", defaultLayout, "The layout to load into MapComplete").data;
 | 
				
			||||||
let layoutToUse: LayoutConfig = AllKnownLayouts.allSets[defaultLayout.toLowerCase()];
 | 
					let layoutToUse: LayoutConfig = AllKnownLayouts.allKnownLayouts.get(defaultLayout.toLowerCase());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const userLayoutParam = QueryParameters.GetQueryParameter("userlayout", "false");
 | 
					const userLayoutParam = QueryParameters.GetQueryParameter("userlayout", "false");
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ if (layoutFromBase64.startsWith("http")) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $.ajax({
 | 
					    $.ajax({
 | 
				
			||||||
        url: link,
 | 
					        url: link,
 | 
				
			||||||
        success: function (data) {
 | 
					        success: (data) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                const parsed = JSON.parse(data);
 | 
					                const parsed = JSON.parse(data);
 | 
				
			||||||
| 
						 | 
					@ -121,6 +121,6 @@ if (layoutFromBase64.startsWith("http")) {
 | 
				
			||||||
        .SetStyle("pointer-events: all;")
 | 
					        .SetStyle("pointer-events: all;")
 | 
				
			||||||
        .AttachTo("topleft-tools");
 | 
					        .AttachTo("topleft-tools");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
window.addEventListener('contextmenu', function (e) { // Not compatible with IE < 9
 | 
					window.addEventListener('contextmenu', (e) => { // Not compatible with IE < 9
 | 
				
			||||||
    e.preventDefault();
 | 
					    e.preventDefault();
 | 
				
			||||||
}, false);
 | 
					}, false);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										102
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						| 
						 | 
					@ -4029,6 +4029,11 @@
 | 
				
			||||||
      "integrity": "sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA==",
 | 
					      "integrity": "sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/prompt-sync": {
 | 
				
			||||||
 | 
					      "version": "4.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/prompt-sync/-/prompt-sync-4.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-utMynv9bQRXjTvRpgjckTUEdRHA="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/q": {
 | 
					    "@types/q": {
 | 
				
			||||||
      "version": "1.5.4",
 | 
					      "version": "1.5.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
 | 
				
			||||||
| 
						 | 
					@ -4726,6 +4731,11 @@
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
 | 
				
			||||||
      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
 | 
					      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "builtin-modules": {
 | 
				
			||||||
 | 
					      "version": "1.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "builtin-status-codes": {
 | 
					    "builtin-status-codes": {
 | 
				
			||||||
      "version": "3.0.0",
 | 
					      "version": "3.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
 | 
				
			||||||
| 
						 | 
					@ -9903,6 +9913,29 @@
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
 | 
					      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "prompt-sync": {
 | 
				
			||||||
 | 
					      "version": "4.2.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "strip-ansi": "^5.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-regex": {
 | 
				
			||||||
 | 
					          "version": "4.1.0",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "strip-ansi": {
 | 
				
			||||||
 | 
					          "version": "5.2.0",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
 | 
				
			||||||
 | 
					          "requires": {
 | 
				
			||||||
 | 
					            "ansi-regex": "^4.1.0"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "protocol-buffers-schema": {
 | 
					    "protocol-buffers-schema": {
 | 
				
			||||||
      "version": "3.5.1",
 | 
					      "version": "3.5.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz",
 | 
				
			||||||
| 
						 | 
					@ -11583,6 +11616,75 @@
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "tslib": {
 | 
				
			||||||
 | 
					      "version": "1.14.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "tslint": {
 | 
				
			||||||
 | 
					      "version": "6.1.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@babel/code-frame": "^7.0.0",
 | 
				
			||||||
 | 
					        "builtin-modules": "^1.1.1",
 | 
				
			||||||
 | 
					        "chalk": "^2.3.0",
 | 
				
			||||||
 | 
					        "commander": "^2.12.1",
 | 
				
			||||||
 | 
					        "diff": "^4.0.1",
 | 
				
			||||||
 | 
					        "glob": "^7.1.1",
 | 
				
			||||||
 | 
					        "js-yaml": "^3.13.1",
 | 
				
			||||||
 | 
					        "minimatch": "^3.0.4",
 | 
				
			||||||
 | 
					        "mkdirp": "^0.5.3",
 | 
				
			||||||
 | 
					        "resolve": "^1.3.2",
 | 
				
			||||||
 | 
					        "semver": "^5.3.0",
 | 
				
			||||||
 | 
					        "tslib": "^1.13.0",
 | 
				
			||||||
 | 
					        "tsutils": "^2.29.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "chalk": {
 | 
				
			||||||
 | 
					          "version": "2.4.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
 | 
				
			||||||
 | 
					          "requires": {
 | 
				
			||||||
 | 
					            "ansi-styles": "^3.2.1",
 | 
				
			||||||
 | 
					            "escape-string-regexp": "^1.0.5",
 | 
				
			||||||
 | 
					            "supports-color": "^5.3.0"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "commander": {
 | 
				
			||||||
 | 
					          "version": "2.20.3",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "diff": {
 | 
				
			||||||
 | 
					          "version": "4.0.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "supports-color": {
 | 
				
			||||||
 | 
					          "version": "5.5.0",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
 | 
				
			||||||
 | 
					          "requires": {
 | 
				
			||||||
 | 
					            "has-flag": "^3.0.0"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "tslint-no-circular-imports": {
 | 
				
			||||||
 | 
					      "version": "0.7.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/tslint-no-circular-imports/-/tslint-no-circular-imports-0.7.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-k3wxpeMC4ef40UbpfBVHEHIzKfNZq5/SCtAO1YjGsaNTklo+K53/TWLrym+poA65RJFDiYgYNWvkeIIkJNA0Vw==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "tsutils": {
 | 
				
			||||||
 | 
					      "version": "2.29.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "tslib": "^1.8.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "tty-browserify": {
 | 
					    "tty-browserify": {
 | 
				
			||||||
      "version": "0.0.0",
 | 
					      "version": "0.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								package.json
									
										
									
									
									
								
							
							
						
						| 
						 | 
					@ -8,19 +8,25 @@
 | 
				
			||||||
  "main": "index.js",
 | 
					  "main": "index.js",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "increase-memory": "export NODE_OPTIONS=--max_old_space_size=4096",
 | 
					    "increase-memory": "export NODE_OPTIONS=--max_old_space_size=4096",
 | 
				
			||||||
    "start": "npm run increase-memory && parcel *.html UI/** Logic/** assets/** assets/**/** assets/**/**/** vendor/* vendor/*/*",
 | 
					    "start": "ts-node scripts/generateLayerOverview.ts && npm run increase-memory && parcel *.html UI/** Logic/** assets/** assets/**/** assets/**/**/** vendor/* vendor/*/*",
 | 
				
			||||||
    "test": "ts-node test/Tag.spec.ts && ts-node test/TagQuestion.spec.ts && ts-node test/ImageSearcher.spec.ts",
 | 
					    "test": "ts-node test/Tag.spec.ts && ts-node test/TagQuestion.spec.ts && ts-node test/ImageSearcher.spec.ts && ts-node test/ImageAttribution.spec.ts",
 | 
				
			||||||
    "generate:editor-layer-index": "cd assets/ && wget https://osmlab.github.io/editor-layer-index/imagery.geojson --output-document=editor-layer-index.json",
 | 
					    "generate:editor-layer-index": "cd assets/ && wget https://osmlab.github.io/editor-layer-index/imagery.geojson --output-document=editor-layer-index.json",
 | 
				
			||||||
    "generate:images": "ts-node scripts/generateIncludedImages.ts",
 | 
					    "generate:images": "ts-node scripts/generateIncludedImages.ts",
 | 
				
			||||||
    "generate:translations": "ts-node scripts/generateTranslations.ts",
 | 
					    "generate:translations": "ts-node scripts/generateTranslations.ts",
 | 
				
			||||||
    "generate:layouts": "ts-node scripts/createLayouts.ts",
 | 
					    "generate:layouts": "ts-node scripts/generateLayouts.ts",
 | 
				
			||||||
 | 
					    "generate:docs": "ts-node scripts/generateDocs.ts",
 | 
				
			||||||
 | 
					    "generate:layeroverview": "ts-node scripts/generateLayerOverview.ts",
 | 
				
			||||||
 | 
					    "generate:licenses": "ts-node scripts/generateLicenseInfo.ts",
 | 
				
			||||||
 | 
					    "validate:layeroverview": "ts-node scripts/generateLayerOverview.ts",
 | 
				
			||||||
 | 
					    "validate:licenses": "ts-node scripts/generateLicenseInfo.ts",
 | 
				
			||||||
    "optimize-images": "cd assets/generated/ &&  find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'",
 | 
					    "optimize-images": "cd assets/generated/ &&  find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'",
 | 
				
			||||||
    "generate": "npm run generate:images && npm run generate:translations",
 | 
					    "generate": "npm run generate:images && npm run generate:translations && npm run generate:licenses",
 | 
				
			||||||
    "build": "rm -rf dist/ && npm run generate && parcel build --public-url ./ *.html assets/** assets/**/** assets/**/**/** vendor/* vendor/*/*",
 | 
					    "build": "rm -rf dist/ && npm run generate && parcel build --public-url ./ *.html assets/** assets/**/** assets/**/**/** vendor/* vendor/*/*",
 | 
				
			||||||
    "prepare-deploy": "npm run test && npm run generate:editor-layer-index && npm run generate:layouts && npm run generate && npm run build && rm -rf .cache",
 | 
					    "prepare-deploy": "npm run test && npm run generate:editor-layer-index && npm run generate:layouts && npm run generate:layeroverview && npm run generate && npm run build && rm -rf .cache && npm run generate:docs",
 | 
				
			||||||
    "deploy:staging": "npm run prepare-deploy && rm -rf /home/pietervdvn/git/pietervdvn.github.io/Staging/* && cp -r dist/* /home/pietervdvn/git/pietervdvn.github.io/Staging/ && cd /home/pietervdvn/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean",
 | 
					    "deploy:staging": "npm run prepare-deploy && rm -rf /home/pietervdvn/git/pietervdvn.github.io/Staging/* && cp -r dist/* /home/pietervdvn/git/pietervdvn.github.io/Staging/ && cd /home/pietervdvn/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean",
 | 
				
			||||||
    "deploy:pietervdvn": "npm run prepare-deploy && rm -rf /home/pietervdvn/git/pietervdvn.github.io/MapComplete/* && cp -r dist/* /home/pietervdvn/git/pietervdvn.github.io/MapComplete/ && cd /home/pietervdvn/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean",
 | 
					    "deploy:pietervdvn": "npm run prepare-deploy && rm -rf /home/pietervdvn/git/pietervdvn.github.io/MapComplete/* && cp -r dist/* /home/pietervdvn/git/pietervdvn.github.io/MapComplete/ && cd /home/pietervdvn/git/pietervdvn.github.io/ && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean",
 | 
				
			||||||
    "deploy:production": "rm -rf ./assets/generated && npm run prepare-deploy && npm run optimize-images && rm -rf /home/pietervdvn/git/mapcomplete.github.io/* && cp -r dist/* /home/pietervdvn/git/mapcomplete.github.io/ && cd /home/pietervdvn/git/mapcomplete.github.io/ && echo \"mapcomplete.osm.be\" > CNAME  && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean",
 | 
					    "deploy:production": "rm -rf ./assets/generated && npm run prepare-deploy && npm run optimize-images && rm -rf /home/pietervdvn/git/mapcomplete.github.io/* && cp -r dist/* /home/pietervdvn/git/mapcomplete.github.io/ && cd /home/pietervdvn/git/mapcomplete.github.io/ && echo \"mapcomplete.osm.be\" > CNAME  && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean",
 | 
				
			||||||
 | 
					    "lint": "tslint --project . -c tslint.json '**.ts' ",
 | 
				
			||||||
    "clean": "rm -rf .cache/ && (find *.html | grep -v \"\\(index\\|land\\|test\\|preferences\\|customGenerator\\).html\" | xargs rm) && rm *.webmanifest"
 | 
					    "clean": "rm -rf .cache/ && (find *.html | grep -v \"\\(index\\|land\\|test\\|preferences\\|customGenerator\\).html\" | xargs rm) && rm *.webmanifest"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "keywords": [
 | 
					  "keywords": [
 | 
				
			||||||
| 
						 | 
					@ -38,6 +44,7 @@
 | 
				
			||||||
    "@types/leaflet-providers": "^1.2.0",
 | 
					    "@types/leaflet-providers": "^1.2.0",
 | 
				
			||||||
    "@types/leaflet.markercluster": "^1.4.3",
 | 
					    "@types/leaflet.markercluster": "^1.4.3",
 | 
				
			||||||
    "@types/lz-string": "^1.3.34",
 | 
					    "@types/lz-string": "^1.3.34",
 | 
				
			||||||
 | 
					    "@types/prompt-sync": "^4.1.0",
 | 
				
			||||||
    "autoprefixer": "^9.8.6",
 | 
					    "autoprefixer": "^9.8.6",
 | 
				
			||||||
    "country-language": "^0.1.7",
 | 
					    "country-language": "^0.1.7",
 | 
				
			||||||
    "email-validator": "^2.0.4",
 | 
					    "email-validator": "^2.0.4",
 | 
				
			||||||
| 
						 | 
					@ -58,9 +65,11 @@
 | 
				
			||||||
    "osmtogeojson": "^3.0.0-beta.4",
 | 
					    "osmtogeojson": "^3.0.0-beta.4",
 | 
				
			||||||
    "parcel": "^1.2.4",
 | 
					    "parcel": "^1.2.4",
 | 
				
			||||||
    "postcss": "^7.0.35",
 | 
					    "postcss": "^7.0.35",
 | 
				
			||||||
 | 
					    "prompt-sync": "^4.2.0",
 | 
				
			||||||
    "sharp": "^0.27.0",
 | 
					    "sharp": "^0.27.0",
 | 
				
			||||||
    "slick-carousel": "^1.8.1",
 | 
					    "slick-carousel": "^1.8.1",
 | 
				
			||||||
    "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.0.2",
 | 
					    "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.0.2",
 | 
				
			||||||
 | 
					    "tslint": "^6.1.3",
 | 
				
			||||||
    "turf": "^3.0.14"
 | 
					    "turf": "^3.0.14"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
| 
						 | 
					@ -73,6 +82,7 @@
 | 
				
			||||||
    "read-file": "^0.2.0",
 | 
					    "read-file": "^0.2.0",
 | 
				
			||||||
    "ts-node": "^9.0.0",
 | 
					    "ts-node": "^9.0.0",
 | 
				
			||||||
    "ts-node-dev": "^1.0.0-pre.63",
 | 
					    "ts-node-dev": "^1.0.0-pre.63",
 | 
				
			||||||
 | 
					    "tslint-no-circular-imports": "^0.7.0",
 | 
				
			||||||
    "turndown": "^7.0.0",
 | 
					    "turndown": "^7.0.0",
 | 
				
			||||||
    "typescript": "^3.9.7",
 | 
					    "typescript": "^3.9.7",
 | 
				
			||||||
    "write-file": "^1.0.0"
 | 
					    "write-file": "^1.0.0"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,9 +17,7 @@ function createTable(preferences: any) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    rendered = true;
 | 
					    rendered = true;
 | 
				
			||||||
    const prefs = [];
 | 
					    const prefs = [];
 | 
				
			||||||
    console.log(preferences);
 | 
					 | 
				
			||||||
    for (const key in preferences) {
 | 
					    for (const key in preferences) {
 | 
				
			||||||
        console.log(key)
 | 
					 | 
				
			||||||
        const pref = connection.GetPreference(key, "");
 | 
					        const pref = connection.GetPreference(key, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let value: UIElement = new FixedUiElement(pref.data);
 | 
					        let value: UIElement = new FixedUiElement(pref.data);
 | 
				
			||||||
| 
						 | 
					@ -36,19 +34,17 @@ function createTable(preferences: any) {
 | 
				
			||||||
            "</td><td>",
 | 
					            "</td><td>",
 | 
				
			||||||
            new Button("delete", () => pref.setData("")),
 | 
					            new Button("delete", () => pref.setData("")),
 | 
				
			||||||
            "</td><td>",
 | 
					            "</td><td>",
 | 
				
			||||||
            value, 
 | 
					            value,
 | 
				
			||||||
            "</td></tr>"
 | 
					            "</td></tr>"
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        prefs.push(...c);
 | 
					        prefs.push(...c);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const el = new Combine(
 | 
					    new Combine(
 | 
				
			||||||
        ["<table>",
 | 
					        ["<table>",
 | 
				
			||||||
            ...prefs,
 | 
					            ...prefs,
 | 
				
			||||||
            "</table>"]
 | 
					            "</table>"]
 | 
				
			||||||
    ); // .AttachTo("maindiv");
 | 
					    ).AttachTo("maindiv");
 | 
				
			||||||
    console.log(el.InnerRender())
 | 
					 | 
				
			||||||
    el.AttachTo("maindiv");
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
connection.preferencesHandler.preferences.addCallback((prefs) => createTable(prefs))
 | 
					connection.preferencesHandler.preferences.addCallback((prefs) => createTable(prefs))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								scripts/ScriptUtils.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					import {lstatSync, readdirSync} from "fs";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class ScriptUtils {
 | 
				
			||||||
 | 
					    public static readDirRecSync(path): string[] {
 | 
				
			||||||
 | 
					        const result = []
 | 
				
			||||||
 | 
					        for (const entry of readdirSync(path)) {
 | 
				
			||||||
 | 
					            const fullEntry = path + "/" + entry
 | 
				
			||||||
 | 
					            const stats = lstatSync(fullEntry)
 | 
				
			||||||
 | 
					            if (stats.isDirectory()) {
 | 
				
			||||||
 | 
					                // Subdirectory
 | 
				
			||||||
 | 
					                // @ts-ignore
 | 
				
			||||||
 | 
					                result.push(...ScriptUtils.readDirRecSync(fullEntry))
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                result.push(fullEntry)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,10 @@ function genImages() {
 | 
				
			||||||
    const allNames: string[] = [];
 | 
					    const allNames: string[] = [];
 | 
				
			||||||
    for (const path of dir) {
 | 
					    for (const path of dir) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(path.endsWith("license_info.json")){
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        if (!path.endsWith(".svg")) {
 | 
					        if (!path.endsWith(".svg")) {
 | 
				
			||||||
            throw "Non-svg file detected in the svg files: " + path;
 | 
					            throw "Non-svg file detected in the svg files: " + path;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										136
									
								
								scripts/generateLayerOverview.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,136 @@
 | 
				
			||||||
 | 
					import ScriptUtils from "./ScriptUtils";
 | 
				
			||||||
 | 
					import {Utils} from "../Utils";
 | 
				
			||||||
 | 
					import {lstatSync, readdirSync, readFileSync, writeFileSync} from "fs";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Utils.runningFromConsole = true
 | 
				
			||||||
 | 
					import LayerConfig from "../Customizations/JSON/LayerConfig";
 | 
				
			||||||
 | 
					import {error} from "util";
 | 
				
			||||||
 | 
					import * as licenses from "../assets/generated/license_info.json"
 | 
				
			||||||
 | 
					import SmallLicense from "../Models/smallLicense";
 | 
				
			||||||
 | 
					import LayoutConfig from "../Customizations/JSON/LayoutConfig";
 | 
				
			||||||
 | 
					import {LayerConfigJson} from "../Customizations/JSON/LayerConfigJson";
 | 
				
			||||||
 | 
					import {Layer} from "leaflet";
 | 
				
			||||||
 | 
					// This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files.
 | 
				
			||||||
 | 
					// It spits out an overview of those to be used to load them
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// First, remove the old file. It might be buggy!
 | 
				
			||||||
 | 
					writeFileSync("./assets/generated/known_layers_and_themes.json", JSON.stringify({
 | 
				
			||||||
 | 
					    "layers": [],
 | 
				
			||||||
 | 
					    "themes": []
 | 
				
			||||||
 | 
					}))
 | 
				
			||||||
 | 
					const layerFiles = ScriptUtils.readDirRecSync("./assets/layers")
 | 
				
			||||||
 | 
					    .filter(path => path.indexOf(".json") > 0)
 | 
				
			||||||
 | 
					    .filter(path => path.indexOf("license_info.json") < 0)
 | 
				
			||||||
 | 
					    .map(path => {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            const parsed = JSON.parse(readFileSync(path, "UTF8"));
 | 
				
			||||||
 | 
					            return parsed
 | 
				
			||||||
 | 
					        } catch (e) {
 | 
				
			||||||
 | 
					            console.error("Could not parse file ", path, "due to ", e)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					const themeFiles: any[] = ScriptUtils.readDirRecSync("./assets/themes")
 | 
				
			||||||
 | 
					    .filter(path => path.indexOf(".json") > 0)
 | 
				
			||||||
 | 
					    .filter(path => path.indexOf("license_info.json") < 0)
 | 
				
			||||||
 | 
					    .map(path => {
 | 
				
			||||||
 | 
					        return JSON.parse(readFileSync(path, "UTF8"));
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					writeFileSync("./assets/generated/known_layers_and_themes.json", JSON.stringify({
 | 
				
			||||||
 | 
					    "layers": layerFiles,
 | 
				
			||||||
 | 
					    "themes": themeFiles
 | 
				
			||||||
 | 
					}))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log("Discovered ", layerFiles.length, "layers and ", themeFiles.length, "themes\n")
 | 
				
			||||||
 | 
					console.log("   ---------- VALIDATING ---------")
 | 
				
			||||||
 | 
					// ------------- VALIDATION --------------
 | 
				
			||||||
 | 
					const licensePaths = []
 | 
				
			||||||
 | 
					for (const i in licenses) {
 | 
				
			||||||
 | 
					    licensePaths.push(licenses[i].path)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					const knownPaths = new Set<string>(licensePaths)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function validateLayer(layerJson: LayerConfigJson, context?: string): string[] {
 | 
				
			||||||
 | 
					    let errorCount = [];
 | 
				
			||||||
 | 
					    if (layerJson["overpassTags"] !== undefined) {
 | 
				
			||||||
 | 
					        errorCount.push("CRIT! Layer ", layerJson.id, "still uses the old 'overpassTags'-format. Please use 'source: {osmTags: <tags>}' instead")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        const layer = new LayerConfig(layerJson, "test", true)
 | 
				
			||||||
 | 
					        const images = Array.from(layer.ExtractImages())
 | 
				
			||||||
 | 
					        const remoteImages = images.filter(img => img.indexOf("http") == 0)
 | 
				
			||||||
 | 
					        for (const remoteImage of remoteImages) {
 | 
				
			||||||
 | 
					            errorCount.push("Found a remote image: "+ remoteImage+ " in layer "+ layer.id)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        for (const image of images) {
 | 
				
			||||||
 | 
					            if (!knownPaths.has(image)) {
 | 
				
			||||||
 | 
					                const ctx = context === undefined ? "" : ` in a layer defined in the theme ${context}`
 | 
				
			||||||
 | 
					                errorCount.push(`Image with path ${image} not found or not attributed; it is used in ${layer.id}${ctx}`)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					        return [`Layer ${layerJson.id}` ?? JSON.stringify(layerJson).substring(0, 50)+" is invalid: "+ e]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return errorCount
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let layerErrorCount = []
 | 
				
			||||||
 | 
					const knownLayerIds = new Set<string>();
 | 
				
			||||||
 | 
					for (const layerFile of layerFiles) {
 | 
				
			||||||
 | 
					    knownLayerIds.add(layerFile.id)
 | 
				
			||||||
 | 
					    layerErrorCount .push(...validateLayer(layerFile))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let themeErrorCount = []
 | 
				
			||||||
 | 
					for (const themeFile of themeFiles) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const layer of themeFile.layers) {
 | 
				
			||||||
 | 
					        if (typeof layer === "string") {
 | 
				
			||||||
 | 
					            if (!knownLayerIds.has(layer)) {
 | 
				
			||||||
 | 
					                themeErrorCount.push("Unknown layer id: "+ layer)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            if (layer.builtin !== undefined) {
 | 
				
			||||||
 | 
					                if (!knownLayerIds.has(layer.builtin)) {
 | 
				
			||||||
 | 
					                    themeErrorCount.push("Unknown layer id: "+ layer.builtin+ "(which uses inheritance)")
 | 
				
			||||||
 | 
					                } 
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // layer.builtin contains layer overrides - we can skip those
 | 
				
			||||||
 | 
					                layerErrorCount .push(...validateLayer(layer, themeFile.id))
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    themeFile.layers = themeFile.layers
 | 
				
			||||||
 | 
					        .filter(l => typeof l != "string") // We remove all the builtin layer references as they don't work with ts-node for some weird reason
 | 
				
			||||||
 | 
					        .filter(l => l.builtin === undefined)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        const theme = new LayoutConfig(themeFile, true, "test")
 | 
				
			||||||
 | 
					        if (theme.id !== theme.id.toLowerCase()) {
 | 
				
			||||||
 | 
					            themeErrorCount.push("Theme ids should be in lowercase, but it is "+ theme.id)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					        themeErrorCount.push("Could not parse theme "+ themeFile["id"]+ "due to", e)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log("LE", layerErrorCount)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (layerErrorCount.length + themeErrorCount.length == 0) {
 | 
				
			||||||
 | 
					    console.log("All good!")
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					    const errors = layerErrorCount.concat(themeErrorCount).join("\n")
 | 
				
			||||||
 | 
					    console.log(errors)
 | 
				
			||||||
 | 
					    const msg = (`Found ${errors.length} errors in the layers; ${themeErrorCount} errors in the themes`)
 | 
				
			||||||
 | 
					    if(process.argv.indexOf("--no-fail") >= 0) {
 | 
				
			||||||
 | 
					        console.log(msg)
 | 
				
			||||||
 | 
					    }else if(process.argv.indexOf("--report") >= 0){
 | 
				
			||||||
 | 
					        writeFileSync("layer_report.txt", errors)
 | 
				
			||||||
 | 
					    }else{
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        throw msg;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3,13 +3,13 @@ import {Utils} from "../Utils";
 | 
				
			||||||
Utils.runningFromConsole = true;
 | 
					Utils.runningFromConsole = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import LayoutConfig from "../Customizations/JSON/LayoutConfig";
 | 
					import LayoutConfig from "../Customizations/JSON/LayoutConfig";
 | 
				
			||||||
import {AllKnownLayouts} from "../Customizations/AllKnownLayouts";
 | 
					 | 
				
			||||||
import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs";
 | 
					import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs";
 | 
				
			||||||
import Locale from "../UI/i18n/Locale";
 | 
					import Locale from "../UI/i18n/Locale";
 | 
				
			||||||
import Translations from "../UI/i18n/Translations";
 | 
					import Translations from "../UI/i18n/Translations";
 | 
				
			||||||
import {Translation} from "../UI/i18n/Translation";
 | 
					import {Translation} from "../UI/i18n/Translation";
 | 
				
			||||||
import Constants from "../Models/Constants";
 | 
					import Constants from "../Models/Constants";
 | 
				
			||||||
 | 
					import * as all_known_layouts from "../assets/generated/known_layers_and_themes.json"
 | 
				
			||||||
 | 
					import {LayoutConfigJson} from "../Customizations/JSON/LayoutConfigJson";
 | 
				
			||||||
const sharp = require('sharp');
 | 
					const sharp = require('sharp');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -234,9 +234,12 @@ if (!existsSync(generatedDir)) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap", "custom"]
 | 
					const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap", "custom"]
 | 
				
			||||||
const all = AllKnownLayouts.allSets;
 | 
					const all : LayoutConfigJson[] = all_known_layouts.themes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for (const layoutName in all) {
 | 
					for (const i in all) {
 | 
				
			||||||
 | 
					    const layoutConfigJson : LayoutConfigJson = all[i]
 | 
				
			||||||
 | 
					    const layout = new LayoutConfig(layoutConfigJson, true, "generating layouts")
 | 
				
			||||||
 | 
					    const layoutName = layout.id
 | 
				
			||||||
    if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) {
 | 
					    if (blacklist.indexOf(layoutName.toLowerCase()) >= 0) {
 | 
				
			||||||
        console.log(`Skipping a layout with name${layoutName}, it is on the blacklist`);
 | 
					        console.log(`Skipping a layout with name${layoutName}, it is on the blacklist`);
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
| 
						 | 
					@ -246,7 +249,6 @@ for (const layoutName in all) {
 | 
				
			||||||
            console.log("Could not write manifest for ", layoutName, " because ", err)
 | 
					            console.log("Could not write manifest for ", layoutName, " because ", err)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const layout = all[layoutName];
 | 
					 | 
				
			||||||
    validate(layout)
 | 
					    validate(layout)
 | 
				
			||||||
    createManifest(layout, "").then(manifObj => {
 | 
					    createManifest(layout, "").then(manifObj => {
 | 
				
			||||||
        const manif = JSON.stringify(manifObj, undefined, 2);
 | 
					        const manif = JSON.stringify(manifObj, undefined, 2);
 | 
				
			||||||
							
								
								
									
										213
									
								
								scripts/generateLicenseInfo.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,213 @@
 | 
				
			||||||
 | 
					import {Utils} from "../Utils";
 | 
				
			||||||
 | 
					import {lstatSync, readdirSync, readFileSync, writeFileSync, unlinkSync} from "fs";
 | 
				
			||||||
 | 
					import SmallLicense from "../Models/smallLicense";
 | 
				
			||||||
 | 
					import ScriptUtils from "./ScriptUtils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Utils.runningFromConsole = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Sweeps the entire 'assets/' (except assets/generated) directory for image files and any 'license_info.json'-file.
 | 
				
			||||||
 | 
					 * Checks that the license info is included for each of them and generates a compiles license_info.json for those
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function generateLicenseInfos(paths: string[]): SmallLicense[] {
 | 
				
			||||||
 | 
					    const licenses = []
 | 
				
			||||||
 | 
					    for (const path of paths) {
 | 
				
			||||||
 | 
					        const parsed = JSON.parse(readFileSync(path, "UTF-8"))
 | 
				
			||||||
 | 
					        if (Array.isArray(parsed)) {
 | 
				
			||||||
 | 
					            const l: SmallLicense[] = parsed
 | 
				
			||||||
 | 
					            for (const smallLicens of l) {
 | 
				
			||||||
 | 
					                smallLicens.path = path.substring(0, path.length - "license_info.json".length) + smallLicens.path
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            licenses.push(...l)
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            const smallLicens: SmallLicense = parsed;
 | 
				
			||||||
 | 
					            /*if(parsed.license === "CC-BY"){
 | 
				
			||||||
 | 
					                console.log("Rewriting ", path)
 | 
				
			||||||
 | 
					                parsed.license === "CC-BY 4.0"
 | 
				
			||||||
 | 
					                writeFileSync(path, JSON.stringify(smallLicens, null, "  "))
 | 
				
			||||||
 | 
					            }*/
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            smallLicens.path = path.substring(0, 1 + path.lastIndexOf("/")) + smallLicens.path
 | 
				
			||||||
 | 
					            licenses.push(smallLicens)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return licenses
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function missingLicenseInfos(licenseInfos: SmallLicense[], allIcons: string[]) {
 | 
				
			||||||
 | 
					    const missing = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const knownPaths = new Set<string>()
 | 
				
			||||||
 | 
					    for (const licenseInfo of licenseInfos) {
 | 
				
			||||||
 | 
					        knownPaths.add(licenseInfo.path)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const iconPath of allIcons) {
 | 
				
			||||||
 | 
					        if (iconPath.indexOf("license_info.json") >= 0) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (knownPaths.has(iconPath)) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        missing.push(iconPath)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return missing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const prompt = require('prompt-sync')();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const knownLicenses = new Map<string, SmallLicense>()
 | 
				
			||||||
 | 
					knownLicenses.set("cf", {
 | 
				
			||||||
 | 
					    authors: ["Pieter Fiers", "Thibault Declercq", "Pierre Barban", "Joost Schouppe", "Pieter Vander Vennet"],
 | 
				
			||||||
 | 
					    path: undefined,
 | 
				
			||||||
 | 
					    license: "CC-BY-SA",
 | 
				
			||||||
 | 
					    sources: ["https://osoc.be/editions/2020/cyclofix"]
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					knownLicenses.set("me", {
 | 
				
			||||||
 | 
					    authors: ["Pieter Vander Vennet"],
 | 
				
			||||||
 | 
					    path: undefined,
 | 
				
			||||||
 | 
					    license: "CC0",
 | 
				
			||||||
 | 
					    sources: []
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					knownLicenses.set("t", {
 | 
				
			||||||
 | 
					    authors: [],
 | 
				
			||||||
 | 
					    path: undefined,
 | 
				
			||||||
 | 
					    license: "CC0; trivial",
 | 
				
			||||||
 | 
					    sources: []
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					knownLicenses.set("na", {
 | 
				
			||||||
 | 
					    authors: [],
 | 
				
			||||||
 | 
					    path: undefined,
 | 
				
			||||||
 | 
					    license: "CC0",
 | 
				
			||||||
 | 
					    sources: []
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					knownLicenses.set("chrn", {
 | 
				
			||||||
 | 
					    authors: ["Christian Neumann"],
 | 
				
			||||||
 | 
					    path: undefined,
 | 
				
			||||||
 | 
					    license: "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    sources: ["https://utopicode.de/", "https://github.com/chrneumann/MapComplete"]
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					knownLicenses.set("klimaan", {
 | 
				
			||||||
 | 
					    authors: ["Klimaan VZW"],
 | 
				
			||||||
 | 
					    path: undefined,
 | 
				
			||||||
 | 
					    license: "CC-BY-SA 3.0",
 | 
				
			||||||
 | 
					    sources: ["https://klimaan.be/"]
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function promptLicenseFor(path): SmallLicense {
 | 
				
			||||||
 | 
					    console.log("License abbreviations:")
 | 
				
			||||||
 | 
					    knownLicenses.forEach((value, key) => {
 | 
				
			||||||
 | 
					        console.log(key, " => ", value)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    const author = prompt("What is the author for artwork " + path + "? (or: [Q]uit, [S]kip)  > ")
 | 
				
			||||||
 | 
					    path = path.substring(path.lastIndexOf("/") + 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (knownLicenses.has(author)) {
 | 
				
			||||||
 | 
					        const license = knownLicenses.get(author);
 | 
				
			||||||
 | 
					        license.path = path;
 | 
				
			||||||
 | 
					        return license;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (author == "s") {
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (author == "Q" || author == "q" || author == "") {
 | 
				
			||||||
 | 
					        throw "Quitting now!"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    let authors = author.split(";")
 | 
				
			||||||
 | 
					    if (author.toLowerCase() == "none") {
 | 
				
			||||||
 | 
					        authors = []
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					        authors: author.split(";"),
 | 
				
			||||||
 | 
					        path: path,
 | 
				
			||||||
 | 
					        license: prompt("What is the license for artwork " + path + "?  > "),
 | 
				
			||||||
 | 
					        sources: prompt("Where was this artwork found?  > ").split(";")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function createLicenseInfoFor(path): void {
 | 
				
			||||||
 | 
					    const li = promptLicenseFor(path);
 | 
				
			||||||
 | 
					    if (li == null) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    writeFileSync(path + ".license_info.json", JSON.stringify(li, null, "  "))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function cleanLicenseInfo(allPaths: string[], allLicenseInfos: SmallLicense[]){
 | 
				
			||||||
 | 
					    // Read the license info file from the generated assets, creates a compiled license info in every directory
 | 
				
			||||||
 | 
					    // Note: this removes all the old license infos
 | 
				
			||||||
 | 
					    for (const licensePath of licensePaths) {
 | 
				
			||||||
 | 
					        unlinkSync(licensePath)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    const perDirectory = new Map<string, SmallLicense[]>()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const license of allLicenseInfos) {
 | 
				
			||||||
 | 
					        const p = license.path
 | 
				
			||||||
 | 
					        const dir = p.substring(0, p.lastIndexOf("/"))
 | 
				
			||||||
 | 
					        license.path = p.substring(dir.length + 1)
 | 
				
			||||||
 | 
					        if(!perDirectory.has(dir)){
 | 
				
			||||||
 | 
					            perDirectory.set(dir, [])
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        perDirectory.get(dir).push(license)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    perDirectory.forEach((licenses, dir) => {
 | 
				
			||||||
 | 
					        writeFileSync( dir+"/license_info.json", JSON.stringify(licenses, null, 2))
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function queryMissingLicenses(missingLicenses: string[])  {
 | 
				
			||||||
 | 
					    process.on('SIGINT', function () {
 | 
				
			||||||
 | 
					        console.log("Aborting... Bye!");
 | 
				
			||||||
 | 
					        process.exit();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let i = 1;
 | 
				
			||||||
 | 
					    for (const missingLicens of missingLicenses) {
 | 
				
			||||||
 | 
					        console.log(i + " / " + missingLicenses.length)
 | 
				
			||||||
 | 
					        i++;
 | 
				
			||||||
 | 
					        if (i < missingLicenses.length - 5) {
 | 
				
			||||||
 | 
					            //    continue
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        createLicenseInfoFor(missingLicens)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.log("You're through!")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log("Checking and compiling license info")
 | 
				
			||||||
 | 
					const contents = ScriptUtils.readDirRecSync("./assets")
 | 
				
			||||||
 | 
					    .filter(entry => entry.indexOf("./assets/generated") != 0)
 | 
				
			||||||
 | 
					const licensePaths = contents.filter(entry => entry.indexOf("license_info.json") >= 0)
 | 
				
			||||||
 | 
					const licenseInfos = generateLicenseInfos(licensePaths);
 | 
				
			||||||
 | 
					writeFileSync("./assets/generated/license_info.json", JSON.stringify(licenseInfos, null, "  "))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const artwork = contents.filter(pth => pth.match(/(.svg|.png|.jpg)$/i) != null)
 | 
				
			||||||
 | 
					const missingLicenses = missingLicenseInfos(licenseInfos, artwork)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(process.argv.indexOf("--prompt") >= 0 || process.argv.indexOf("--query") >= 0 ) {
 | 
				
			||||||
 | 
					    queryMissingLicenses(missingLicenses)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if(missingLicenses.length > 0){
 | 
				
			||||||
 | 
					    const msg = `There are ${missingLicenses.length} licenses missing.`
 | 
				
			||||||
 | 
					    if(process.argv.indexOf("--no-fail") >= 0){
 | 
				
			||||||
 | 
					        console.log(msg)
 | 
				
			||||||
 | 
					    }else if(process.argv.indexOf("--report") >= 0){
 | 
				
			||||||
 | 
					        writeFileSync("missing_licenses.txt", missingLicenses.join("\n"))
 | 
				
			||||||
 | 
					    } else{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        throw msg
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cleanLicenseInfo(licensePaths, licenseInfos)
 | 
				
			||||||
							
								
								
									
										58
									
								
								test/ImageAttribution.spec.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					import {Utils} from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Utils.runningFromConsole = true;
 | 
				
			||||||
 | 
					import {equal} from "assert";
 | 
				
			||||||
 | 
					import T from "./TestHelper";
 | 
				
			||||||
 | 
					import {FromJSON} from "../Customizations/JSON/FromJSON";
 | 
				
			||||||
 | 
					import Locale from "../UI/i18n/Locale";
 | 
				
			||||||
 | 
					import Translations from "../UI/i18n/Translations";
 | 
				
			||||||
 | 
					import {UIEventSource} from "../Logic/UIEventSource";
 | 
				
			||||||
 | 
					import TagRenderingConfig from "../Customizations/JSON/TagRenderingConfig";
 | 
				
			||||||
 | 
					import EditableTagRendering from "../UI/Popup/EditableTagRendering";
 | 
				
			||||||
 | 
					import {Translation} from "../UI/i18n/Translation";
 | 
				
			||||||
 | 
					import {OH, OpeningHour} from "../UI/OpeningHours/OpeningHours";
 | 
				
			||||||
 | 
					import PublicHolidayInput from "../UI/OpeningHours/PublicHolidayInput";
 | 
				
			||||||
 | 
					import {SubstitutedTranslation} from "../UI/SubstitutedTranslation";
 | 
				
			||||||
 | 
					import {Tag} from "../Logic/Tags/Tag";
 | 
				
			||||||
 | 
					import {And} from "../Logic/Tags/And";
 | 
				
			||||||
 | 
					import {ImageSearcher} from "../Logic/Actors/ImageSearcher";
 | 
				
			||||||
 | 
					import {AllKnownLayouts} from "../Customizations/AllKnownLayouts";
 | 
				
			||||||
 | 
					import AllKnownLayers from "../Customizations/AllKnownLayers";
 | 
				
			||||||
 | 
					import LayerConfig from "../Customizations/JSON/LayerConfig";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					new T("ImageAttribution Tests", [
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        "Should find all the images",
 | 
				
			||||||
 | 
					        () => {
 | 
				
			||||||
 | 
					            const pumps: LayerConfig = AllKnownLayers.sharedLayers["bike_repair_station"]
 | 
				
			||||||
 | 
					            const images = pumps.ExtractImages();
 | 
				
			||||||
 | 
					            const expectedValues = ['./assets/layers/bike_repair_station/repair_station.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/repair_station_pump.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/broken_pump_2.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump.svg',
 | 
				
			||||||
 | 
					                './assets/themes/cyclofix/fietsambassade_gent_logo_small.svg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump_example_manual.jpg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump_example.png',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/pump_example_round.jpg',
 | 
				
			||||||
 | 
					                './assets/layers/bike_repair_station/repair_station_example.jpg']
 | 
				
			||||||
 | 
					            for (const expected of expectedValues) {
 | 
				
			||||||
 | 
					                T.isTrue(images.has(expected), expected + " not found")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        "Test image discovery regex",
 | 
				
			||||||
 | 
					        () => {
 | 
				
			||||||
 | 
					            const tr = new Translation({en: "XYZ <img src='a.svg'/> XYZ <img src=\"some image.svg\"></img> XYZ <img src=b.svg/>"})
 | 
				
			||||||
 | 
					            const images = new Set<string>(tr.ExtractImages(false));
 | 
				
			||||||
 | 
					            equal(3, images.size)
 | 
				
			||||||
 | 
					            T.isTrue(images.has("a.svg"), "a.svg not found")
 | 
				
			||||||
 | 
					            T.isTrue(images.has("b.svg"), "b.svg not found")
 | 
				
			||||||
 | 
					            T.isTrue(images.has("some image.svg"), "some image.svg not found")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
| 
						 | 
					@ -25,4 +25,9 @@ export default class T {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static isTrue(b: boolean, msg: string) {
 | 
				
			||||||
 | 
					        if(!b){
 | 
				
			||||||
 | 
					            throw "Expected true, but got false: "+msg
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								tslint.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    "defaultSeverity": "error",
 | 
				
			||||||
 | 
					    "extends": [
 | 
				
			||||||
 | 
					        "tslint:recommended",
 | 
				
			||||||
 | 
					        "tslint-no-circular-imports"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "jsRules": {},
 | 
				
			||||||
 | 
					    "rules": {},
 | 
				
			||||||
 | 
					    "rulesDirectory": []
 | 
				
			||||||
 | 
					}
 | 
				
			||||||