text:
/*************************************************************************/
/*  scene_format_text.cpp                                                */
/*************************************************************************/
/*                       This file is part of:                           */
/*                           GODOT ENGINE                                */
/*                    http://www.godotengine.org                         */
/*************************************************************************/
/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur.                 */
/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)    */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/
#include "scene_format_text.h"

#include "project_settings.h"
#include "os/dir_access.h"
#include "version.h"

//version 2: changed names for basis, rect3, poolvectors, etc.
#define FORMAT_VERSION 2

#include "os/dir_access.h"
#include "version.h"

#define _printerr() ERR_PRINT(String(res_path + ":" + itos(lines) + " - Parse Error: " + error_text).utf8().get_data());

///

void ResourceInteractiveLoaderText::set_local_path(const String &p_local_path) {

	res_path = p_local_path;
}

Ref<Resource> ResourceInteractiveLoaderText::get_resource() {

	return resource;
}

Error ResourceInteractiveLoaderText::_parse_sub_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {

	VariantParser::Token token;
	VariantParser::get_token(p_stream, token, line, r_err_str);
	if (token.type != VariantParser::TK_NUMBER) {
		r_err_str = "Expected number (sub-resource index)";
		return ERR_PARSE_ERROR;
	}

	int index = token.value;

	String path = local_path + "::" + itos(index);

	if (!ignore_resource_parsing) {

		if (!ResourceCache::has(path)) {
			r_err_str = "Can't load cached sub-resource: " + path;
			return ERR_PARSE_ERROR;
		}

		r_res = RES(ResourceCache::get(path));
	} else {
		r_res = RES();
	}

	VariantParser::get_token(p_stream, token, line, r_err_str);
	if (token.type != VariantParser::TK_PARENTHESIS_CLOSE) {
		r_err_str = "Expected ')'";
		return ERR_PARSE_ERROR;
	}

	return OK;
}

Error ResourceInteractiveLoaderText::_parse_ext_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) {

	VariantParser::Token token;
	VariantParser::get_token(p_stream, token, line, r_err_str);
	if (token.type != VariantParser::TK_NUMBER) {
		r_err_str = "Expected number (sub-resource index)";
		return ERR_PARSE_ERROR;
	}

	int id = token.value;

	if (!ignore_resource_parsing) {

		if (!ext_resources.has(id)) {
			r_err_str = "Can't load cached ext-resource #" + itos(id);
			return ERR_PARSE_ERROR;
		}

		String path = ext_resources[id].path;
		String type = ext_resources[id].type;

		if (path.find("://") == -1 && path.is_rel_path()) {
			// path is relative to file being loaded, so convert to a resource path
			path = ProjectSettings::get_singleton()->localize_path(res_path.get_base_dir().plus_file(path));
		}

		r_res = ResourceLoader::load(path, type);

		if (r_res.is_null()) {
			WARN_PRINT(String("Couldn't load external resource: " + path).utf8().get_data());
		}
	} else {
		r_res = RES();
	}

	VariantParser::get_token(p_stream, token, line, r_err_str);
	if (token.type != VariantParser::TK_PARENTHESIS_CLOSE) {
		r_err_str = "Expected ')'";
		return ERR_PARSE_ERROR;
	}

	return OK;
}

Error ResourceInteractiveLoaderText::poll() {

	if (error != OK)
		return error;

	if (next_tag.name == "ext_resource") {

		if (!next_tag.fields.has("path")) {
			error = ERR_FILE_CORRUPT;
			error_text = "Missing 'path' in external resource tag";
			_printerr();
			return error;
		}

		if (!next_tag.fields.has("type")) {
			error = ERR_FILE_CORRUPT;
			error_text = "Missing 'type' in external resource tag";
			_printerr();
			return error;
		}

		if (!next_tag.fields.has("id")) {
			error = ERR_FILE_CORRUPT;
			error_text = "Missing 'id' in external resource tag";
			_printerr();
			return error;
		}

		String path = next_tag.fields["path"];
		String type = next_tag.fields["type"];
		int index = next_tag.fields["id"];

		if (path.find("://") == -1 && path.is_rel_path()) {
			// path is relative to file being loaded, so convert to a resource path
			path = ProjectSettings::get_singleton()->localize_path(local_path.get_base_dir().plus_file(path));
		}

		if (remaps.has(path)) {
			path = remaps[path];
		}

		RES res = ResourceLoader::load(path, type);

		if (res.is_null()) {

			if (ResourceLoader::get_abort_on_missing_resources()) {
				error = ERR_FILE_CORRUPT;
				error_text = "[ext_resource] referenced nonexistent resource at: " + path;
				_printerr();
				return error;
			} else {
				ResourceLoader::notify_dependency_error(local_path, path, type);
			}
		} else {

			resource_cache.push_back(res);
		}

		ExtResource er;
		er.path = path;
		er.type = type;
		ext_resources[index] = er;

		error = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp);

		if (error) {
			_printerr();
		}

		resource_current++;
		return error;

	} else if (next_tag.name == "sub_resource") {

		if (!next_tag.fields.has("type")) {
			error = ERR_FILE_CORRUPT;
			error_text = "Missing 'type' in external resource tag";
			_printerr();
			return error;
		}

		if (!next_tag.fields.has("id")) {
			error = ERR_FILE_CORRUPT;
			error_text = "Missing 'index' in external resource tag";
			_printerr();
			return error;
		}

		String type = next_tag.fields["type"];
		int id = next_tag.fields["id"];

		String path = local_path + "::" + itos(id);

		//bool exists=ResourceCache::has(path);

		Ref<Resource> res;

		if (!ResourceCache::has(path)) { //only if it doesn't exist

			Object *obj = ClassDB::instance(type);
			if (!obj) {

				error_text += "Can't create sub resource of type: " + type;
				_printerr();
				error = ERR_FILE_CORRUPT;
				return error;
			}

			Resource *r = obj->cast_to<Resource>();
			if (!r) {

				error_text += "Can't create sub resource of type, because not a resource: " + type;
				_printerr();
				error = ERR_FILE_CORRUPT;
				return error;
			}

			res = Ref<Resource>(r);
			resource_cache.push_back(res);
			res->set_path(path);
		}

		resource_current++;

		while (true) {

			String assign;
			Variant value;

			error = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, &rp);

			if (error) {
				_printerr();
				return error;
			}

			if (assign != String()) {
				if (res.is_valid()) {
					res->set(assign, value);
				}
				//it's assignment
			} else if (next_tag.name != String()) {

				error = OK;
				break;
			} else {
				error = ERR_FILE_CORRUPT;
				error_text = "Premature end of file while parsing [sub_resource]";
				_printerr();
				return error;
			}
		}

		return OK;

	} else if (next_tag.name == "resource") {

		if (is_scene) {

			error_text += "found the 'resource' tag on a scene file!";
			_printerr();
			error = ERR_FILE_CORRUPT;
			return error;
		}

		Object *obj = ClassDB::instance(res_type);
		if (!obj) {

			error_text += "Can't create sub resource of type: " + res_type;
			_printerr();
			error = ERR_FILE_CORRUPT;
			return error;
		}

		Resource *r = obj->cast_to<Resource>();
		if (!r) {

			error_text += "Can't create sub resource of type, because not a resource: " + res_type;
			_printerr();
			error = ERR_FILE_CORRUPT;
			return error;
		}

		resource = Ref<Resource>(r);

		resource_current++;

		while (true) {

			String assign;
			Variant value;

			error = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, &rp);

			if (error) {
				if (error != ERR_FILE_EOF) {
					_printerr();
				} else {
					if (!ResourceCache::has(res_path)) {
						resource->set_path(res_path);
					}
					resource->set_as_translation_remapped(translation_remapped);
				}
				return error;
			}

			if (assign != String()) {
				resource->set(assign, value);
				//it's assignment
			} else if (next_tag.name != String()) {

				error = ERR_FILE_CORRUPT;
				error_text = "Extra tag found when parsing main resource file";
				_printerr();
				return error;
			} else {
				error = ERR_FILE_EOF;
				return error;
			}
		}

		return OK;

	} else if (next_tag.name == "node") {

		if (!is_scene) {

			error_text += "found the 'node' tag on a resource file!";
			_printerr();
			error = ERR_FILE_CORRUPT;
			return error;
		}

		/*
		int add_name(const StringName& p_name);
		int add_value(const Variant& p_value);
		int add_node_path(const NodePath& p_path);
		int add_node(int p_parent,int p_owner,int p_type,int p_name, int p_instance);
		void add_node_property(int p_node,int p_name,int p_value);
		void add_node_group(int p_node,int p_group);
		void set_base_scene(int p_idx);
		void add_connection(int p_from,int p_to, int p_signal, int p_method, int p_flags,const Vector<int>& p_binds);
		void add_editable_instance(const NodePath& p_path);

		*/

		int parent = -1;
		int owner = -1;
		int type = -1;
		int name = -1;
		int instance = -1;
		//int base_scene=-1;

		if (next_tag.fields.has("name")) {
			name = packed_scene->get_state()->add_name(next_tag.fields["name"]);
		}

		if (next_tag.fields.has("parent")) {
			NodePath np = next_tag.fields["parent"];
			np.prepend_period(); //compatible to how it manages paths internally
			parent = packed_scene->get_state()->add_node_path(np);
		}

		if (next_tag.fields.has("type")) {
			type = packed_scene->get_state()->add_name(next_tag.fields["type"]);
		} else {
			type = SceneState::TYPE_INSTANCED; //no type? assume this was instanced
		}

		if (next_tag.fields.has("instance")) {

			instance = packed_scene->get_state()->add_value(next_tag.fields["instance"]);

			if (packed_scene->get_state()->get_node_count() == 0 && parent == -1) {
				packed_scene->get_state()->set_base_scene(instance);
				instance = -1;
			}
		}

		if (next_tag.fields.has("instance_placeholder")) {

			String path = next_tag.fields["instance_placeholder"];

			int path_v = packed_scene->get_state()->add_value(path);

			if (packed_scene->get_state()->get_node_count() == 0) {
				error = ERR_FILE_CORRUPT;
				error_text = "Instance Placeholder can't be used for inheritance.";
				_printerr();
				return error;
			}

			instance = path_v | SceneState::FLAG_INSTANCE_IS_PLACEHOLDER;
		}

		if (next_tag.fields.has("owner")) {
			owner = packed_scene->get_state()->add_node_path(next_tag.fields["owner"]);
		} else {
			if (parent != -1 && !(type == SceneState::TYPE_INSTANCED && instance == -1))
				owner = 0; //if no owner, owner is root
		}

		int node_id = packed_scene->get_state()->add_node(parent, owner, type, name, instance);

		if (next_tag.fields.has("groups")) {

			Array groups = next_tag.fields["groups"];
			for (int i = 0; i < groups.size(); i++) {
				packed_scene->get_state()->add_node_group(node_id, packed_scene->get_state()->add_name(groups[i]));
			}
		}

		while (true) {

			String assign;
			Variant value;

			error = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, &rp);

			if (error) {
				if (error != ERR_FILE_EOF) {
					_printerr();
				} else {
					resource = packed_scene;
					if (!ResourceCache::has(res_path)) {
						packed_scene->set_path(res_path);
					}
				}
				return error;
			}

			if (assign != String()) {
				int nameidx = packed_scene->get_state()->add_name(assign);
				int valueidx = packed_scene->get_state()->add_value(value);
				packed_scene->get_state()->add_node_property(node_id, nameidx, valueidx);
				//it's assignment
			} else if (next_tag.name != String()) {

				error = OK;
				return error;
			} else {

				resource = packed_scene;
				error = ERR_FILE_EOF;
				return error;
			}
		}

		return OK;

	} else if (next_tag.name == "connection") {

		if (!is_scene) {

			error_text += "found the 'connection' tag on a resource file!";
			_printerr();
			error = ERR_FILE_CORRUPT;
			return error;
		}

		if (!next_tag.fields.has("from")) {
			error = ERR_FILE_CORRUPT;
			error_text = "missing 'from' field fron connection tag";
			return error;
		}

		if (!next_tag.fields.has("to")) {
			error = ERR_FILE_CORRUPT;
			error_text = "missing 'to' field fron connection tag";
			return error;
		}

		if (!next_tag.fields.has("signal")) {
			error = ERR_FILE_CORRUPT;
			error_text = "missing 'signal' field fron connection tag";
			return error;
		}

		if (!next_tag.fields.has("method")) {
			error = ERR_FILE_CORRUPT;
			error_text = "missing 'method' field fron connection tag";
			return error;
		}

		NodePath from = next_tag.fields["from"];
		NodePath to = next_tag.fields["to"];
		StringName method = next_tag.fields["method"];
		StringName signal = next_tag.fields["signal"];
		int flags = CONNECT_PERSIST;
		Array binds;

		if (next_tag.fields.has("flags")) {
			flags = next_tag.fields["flags"];
		}

		if (next_tag.fields.has("binds")) {
			binds = next_tag.fields["binds"];
		}

		Vector<int> bind_ints;
		for (int i = 0; i < binds.size(); i++) {
			bind_ints.push_back(packed_scene->get_state()->add_value(binds[i]));
		}

		packed_scene->get_state()->add_connection(
				packed_scene->get_state()->add_node_path(from.simplified()),
				packed_scene->get_state()->add_node_path(to.simplified()),
				packed_scene->get_state()->add_name(signal),
				packed_scene->get_state()->add_name(method),
				flags,
				bind_ints);

		error = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp);

		if (error) {
			if (error != ERR_FILE_EOF) {
				_printerr();
			} else {
				resource = packed_scene;
			}
		}

		return error;
	} else if (next_tag.name == "editable") {

		if (!is_scene) {

			error_text += "found the 'editable' tag on a resource file!";
			_printerr();
			error = ERR_FILE_CORRUPT;
			return error;
		}

		if (!next_tag.fields.has("path")) {
			error = ERR_FILE_CORRUPT;
			error_text = "missing 'path' field fron connection tag";
			_printerr();
			return error;
		}

		NodePath path = next_tag.fields["path"];

		packed_scene->get_state()->add_editable_instance(path.simplified());

		error = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp);

		if (error) {
			if (error != ERR_FILE_EOF) {
				_printerr();
			} else {
				resource = packed_scene;
			}
		}

		return error;

	} else {

		error_text += "Unknown tag in file: " + next_tag.name;
		_printerr();
		error = ERR_FILE_CORRUPT;
		return error;
	}

	return OK;
}

int ResourceInteractiveLoaderText::get_stage() const {

	return resource_current;
}
int ResourceInteractiveLoaderText::get_stage_count() const {

	return resources_total; //+ext_resources;
}

void ResourceInteractiveLoaderText::set_translation_remapped(bool p_remapped) {

	translation_remapped = p_remapped;
}

ResourceInteractiveLoaderText::ResourceInteractiveLoaderText() {
	translation_remapped = false;
}

ResourceInteractiveLoaderText::~ResourceInteractiveLoaderText() {

	memdelete(f);
}

void ResourceInteractiveLoaderText::get_dependencies(FileAccess *f, List<String> *p_dependencies, bool p_add_types) {

	open(f);
	ignore_resource_parsing = true;
	ERR_FAIL_COND(error != OK);

	while (next_tag.name == "ext_resource") {

		if (!next_tag.fields.has("type")) {
			error = ERR_FILE_CORRUPT;
			error_text = "Missing 'type' in external resource tag";
			_printerr();
			return;
		}

		if (!next_tag.fields.has("id")) {
			error = ERR_FILE_CORRUPT;
			error_text = "Missing 'index' in external resource tag";
			_printerr();
			return;
		}

		String path = next_tag.fields["path"];
		String type = next_tag.fields["type"];

		if (path.find("://") == -1 && path.is_rel_path()) {
			// path is relative to file being loaded, so convert to a resource path
			path = ProjectSettings::get_singleton()->localize_path(local_path.get_base_dir().plus_file(path));
		}

		if (p_add_types) {
			path += "::" + type;
		}

		p_dependencies->push_back(path);

		Error err = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp);

		if (err) {
			print_line(error_text + " - " + itos(lines));
			error_text = "Unexpected end of file";
			_printerr();
			error = ERR_FILE_CORRUPT;
		}
	}
}

Error ResourceInteractiveLoaderText::rename_dependencies(FileAccess *p_f, const String &p_path, const Map<String, String> &p_map) {

	open(p_f, true);
	ERR_FAIL_COND_V(error != OK, error);
	ignore_resource_parsing = true;
	//FileAccess

	FileAccess *fw = NULL;

	String base_path = local_path.get_base_dir();

	uint64_t tag_end = f->get_pos();

	while (true) {

		Error err = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp);

		if (err != OK) {
			if (fw) {
				memdelete(fw);
			}
			error = ERR_FILE_CORRUPT;
			ERR_FAIL_V(error);
		}

		if (next_tag.name != "ext_resource") {

			//nothing was done
			if (!fw)
				return OK;

			break;

		} else {

			if (!fw) {

				fw = FileAccess::open(p_path + ".depren", FileAccess::WRITE);
				if (is_scene) {
					fw->store_line("[gd_scene load_steps=" + itos(resources_total) + " format=" + itos(FORMAT_VERSION) + "]\n");
				} else {
					fw->store_line("[gd_resource type=\"" + res_type + "\" load_steps=" + itos(resources_total) + " format=" + itos(FORMAT_VERSION) + "]\n");
				}
			}

			if (!next_tag.fields.has("path") || !next_tag.fields.has("id") || !next_tag.fields.has("type")) {
				memdelete(fw);
				error = ERR_FILE_CORRUPT;
				ERR_FAIL_V(error);
			}

			String path = next_tag.fields["path"];
			int index = next_tag.fields["id"];
			String type = next_tag.fields["type"];

			bool relative = false;
			if (!path.begins_with("res://")) {
				path = base_path.plus_file(path).simplify_path();
				relative = true;
			}

			if (p_map.has(path)) {
				String np = p_map[path];
				path = np;
			}

			if (relative) {
				//restore relative
				path = base_path.path_to_file(path);
			}

			fw->store_line("[ext_resource path=\"" + path + "\" type=\"" + type + "\" id=" + itos(index) + "]");

			tag_end = f->get_pos();
		}
	}

	f->seek(tag_end);

	uint8_t c = f->get_8();
	while (!f->eof_reached()) {
		fw->store_8(c);
		c = f->get_8();
	}
	f->close();

	bool all_ok = fw->get_error() == OK;

	memdelete(fw);

	if (!all_ok) {
		return ERR_CANT_CREATE;
	}

	DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
	da->remove(p_path);
	da->rename(p_path + ".depren", p_path);
	memdelete(da);

	return OK;
}

void ResourceInteractiveLoaderText::open(FileAccess *p_f, bool p_skip_first_tag) {

	error = OK;

	lines = 1;
	f = p_f;

	stream.f = f;
	is_scene = false;
	ignore_resource_parsing = false;
	resource_current = 0;

	VariantParser::Tag tag;
	Error err = VariantParser::parse_tag(&stream, lines, error_text, tag);

	if (err) {

		error = err;
		_printerr();
		return;
	}

	if (tag.fields.has("format")) {
		int fmt = tag.fields["format"];
		if (fmt > FORMAT_VERSION) {
			error_text = "Saved with newer format version";
			_printerr();
			error = ERR_PARSE_ERROR;
			return;
		}
	}

	if (tag.name == "gd_scene") {
		is_scene = true;
		packed_scene.instance();

	} else if (tag.name == "gd_resource") {
		if (!tag.fields.has("type")) {
			error_text = "Missing 'type' field in 'gd_resource' tag";
			_printerr();
			error = ERR_PARSE_ERROR;
			return;
		}

		res_type = tag.fields["type"];

	} else {
		error_text = "Unrecognized file type: " + tag.name;
		_printerr();
		error = ERR_PARSE_ERROR;
		return;
	}

	if (tag.fields.has("load_steps")) {
		resources_total = tag.fields["load_steps"];
	} else {
		resources_total = 0;
	}

	if (!p_skip_first_tag) {

		err = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp);

		if (err) {
			error_text = "Unexpected end of file";
			_printerr();
			error = ERR_FILE_CORRUPT;
		}
	}

	rp.ext_func = _parse_ext_resources;
	rp.sub_func = _parse_sub_resources;
	rp.func = NULL;
	rp.userdata = this;
}

String ResourceInteractiveLoaderText::recognize(FileAccess *p_f) {

	error = OK;

	lines = 1;
	f = p_f;

	stream.f = f;

	ignore_resource_parsing = true;

	VariantParser::Tag tag;
	Error err = VariantParser::parse_tag(&stream, lines, error_text, tag);

	if (err) {
		_printerr();
		return "";
	}

	if (tag.fields.has("format")) {
		int fmt = tag.fields["format"];
		if (fmt > FORMAT_VERSION) {
			error_text = "Saved with newer format version";
			_printerr();
			return "";
		}
	}

	if (tag.name == "gd_scene")
		return "PackedScene";

	if (tag.name != "gd_resource")
		return "";

	if (!tag.fields.has("type")) {
		error_text = "Missing 'type' field in 'gd_resource' tag";
		_printerr();
		return "";
	}

	return tag.fields["type"];
}

/////////////////////

Ref<ResourceInteractiveLoader> ResourceFormatLoaderText::load_interactive(const String &p_path, Error *r_error) {

	if (r_error)
		*r_error = ERR_CANT_OPEN;

	Error err;
	FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err);

	if (err != OK) {

		ERR_FAIL_COND_V(err != OK, Ref<ResourceInteractiveLoader>());
	}

	Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
	ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
	ria->res_path = ria->local_path;
	//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
	ria->open(f);

	return ria;
}

void ResourceFormatLoaderText::get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const {

	if (p_type == "") {
		get_recognized_extensions(p_extensions);
		return;
	}

	if (p_type == "PackedScene")
		p_extensions->push_back("tscn");
	else
		p_extensions->push_back("tres");
}

void ResourceFormatLoaderText::get_recognized_extensions(List<String> *p_extensions) const {

	p_extensions->push_back("tscn");
	p_extensions->push_back("tres");
}

bool ResourceFormatLoaderText::handles_type(const String &p_type) const {

	return true;
}
String ResourceFormatLoaderText::get_resource_type(const String &p_path) const {

	String ext = p_path.get_extension().to_lower();
	if (ext == "tscn")
		return "PackedScene";
	else if (ext != "tres")
		return String();

	//for anyhting else must test..

	FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
	if (!f) {

		return ""; //could not rwead
	}

	Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
	ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
	ria->res_path = ria->local_path;
	//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
	String r = ria->recognize(f);
	return r;
}

void ResourceFormatLoaderText::get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types) {

	FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
	if (!f) {

		ERR_FAIL();
	}

	Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
	ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
	ria->res_path = ria->local_path;
	//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
	ria->get_dependencies(f, p_dependencies, p_add_types);
}

Error ResourceFormatLoaderText::rename_dependencies(const String &p_path, const Map<String, String> &p_map) {

	FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
	if (!f) {

		ERR_FAIL_V(ERR_CANT_OPEN);
	}

	Ref<ResourceInteractiveLoaderText> ria = memnew(ResourceInteractiveLoaderText);
	ria->local_path = ProjectSettings::get_singleton()->localize_path(p_path);
	ria->res_path = ria->local_path;
	//ria->set_local_path( ProjectSettings::get_singleton()->localize_path(p_path) );
	return ria->rename_dependencies(f, p_path, p_map);
}

/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/

String ResourceFormatSaverTextInstance::_write_resources(void *ud, const RES &p_resource) {

	ResourceFormatSaverTextInstance *rsi = (ResourceFormatSaverTextInstance *)ud;
	return rsi->_write_resource(p_resource);
}

String ResourceFormatSaverTextInstance::_write_resource(const RES &res) {

	if (external_resources.has(res)) {

		return "ExtResource( " + itos(external_resources[res] + 1) + " )";
	} else {

		if (internal_resources.has(res)) {
			return "SubResource( " + itos(internal_resources[res]) + " )";
		} else if (res->get_path().length() && res->get_path().find("::") == -1) {

			//external resource
			String path = relative_paths ? local_path.path_to_file(res->get_path()) : res->get_path();
			return "Resource( \"" + path + "\" )";
		} else {
			ERR_EXPLAIN("Resource was not pre cached for the resource section, bug?");
			ERR_FAIL_V("null");
			//internal resource
		}
	}

	return "null";
}

void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant, bool p_main) {

	switch (p_variant.get_type()) {
		case Variant::OBJECT: {

			RES res = p_variant.operator RefPtr();

			if (res.is_null() || external_resources.has(res))
				return;

			if (!p_main && (!bundle_resources) && res->get_path().length() && res->get_path().find("::") == -1) {
				int index = external_resources.size();
				external_resources[res] = index;
				return;
			}

			if (resource_set.has(res))
				return;

			List<PropertyInfo> property_list;

			res->get_property_list(&property_list);
			property_list.sort();

			List<PropertyInfo>::Element *I = property_list.front();

			while (I) {

				PropertyInfo pi = I->get();

				if (pi.usage & PROPERTY_USAGE_STORAGE) {

					Variant v = res->get(I->get().name);
					_find_resources(v);
				}

				I = I->next();
			}

			resource_set.insert(res); //saved after, so the childs it needs are available when loaded
			saved_resources.push_back(res);

		} break;
		case Variant::ARRAY: {

			Array varray = p_variant;
			int len = varray.size();
			for (int i = 0; i < len; i++) {

				Variant v = varray.get(i);
				_find_resources(v);
			}

		} break;
		case Variant::DICTIONARY: {

			Dictionary d = p_variant;
			List<Variant> keys;
			d.get_key_list(&keys);
			for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {

				Variant v = d[E->get()];
				_find_resources(v);
			}
		} break;
		default: {}
	}
}

static String _valprop(const String &p_name) {

	if (p_name.find("\"") != -1 || p_name.find("=") != -1 || p_name.find(" ") != -1)
		return "\"" + p_name.c_escape_multiline() + "\"";
	return p_name;
}

Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {

	if (p_path.ends_with(".tscn")) {
		packed_scene = p_resource;
	}

	Error err;
	f = FileAccess::open(p_path, FileAccess::WRITE, &err);
	ERR_FAIL_COND_V(err, ERR_CANT_OPEN);
	FileAccessRef _fref(f);

	local_path = ProjectSettings::get_singleton()->localize_path(p_path);

	relative_paths = p_flags & ResourceSaver::FLAG_RELATIVE_PATHS;
	skip_editor = p_flags & ResourceSaver::FLAG_OMIT_EDITOR_PROPERTIES;
	bundle_resources = p_flags & ResourceSaver::FLAG_BUNDLE_RESOURCES;
	takeover_paths = p_flags & ResourceSaver::FLAG_REPLACE_SUBRESOURCE_PATHS;
	if (!p_path.begins_with("res://")) {
		takeover_paths = false;
	}

	// save resources
	_find_resources(p_resource, true);

	if (packed_scene.is_valid()) {
		//add instances to external resources if saving a packed scene
		for (int i = 0; i < packed_scene->get_state()->get_node_count(); i++) {
			if (packed_scene->get_state()->is_node_instance_placeholder(i))
				continue;

			Ref<PackedScene> instance = packed_scene->get_state()->get_node_instance(i);
			if (instance.is_valid() && !external_resources.has(instance)) {
				int index = external_resources.size();
				external_resources[instance] = index;
			}
		}
	}

	ERR_FAIL_COND_V(err != OK, err);

	{
		String title = packed_scene.is_valid() ? "[gd_scene " : "[gd_resource ";
		if (packed_scene.is_null())
			title += "type=\"" + p_resource->get_class() + "\" ";
		int load_steps = saved_resources.size() + external_resources.size();
		/*
		if (packed_scene.is_valid()) {
			load_steps+=packed_scene->get_node_count();
		}
		//no, better to not use load steps from nodes, no point to that
		*/

		if (load_steps > 1) {
			title += "load_steps=" + itos(load_steps) + " ";
		}
		title += "format=" + itos(FORMAT_VERSION) + "";
		//title+="engine_version=\""+itos(VERSION_MAJOR)+"."+itos(VERSION_MINOR)+"\"";

		f->store_string(title);
		f->store_line("]\n"); //one empty line
	}

	Vector<RES> sorted_er;
	sorted_er.resize(external_resources.size());

	for (Map<RES, int>::Element *E = external_resources.front(); E; E = E->next()) {

		sorted_er[E->get()] = E->key();
	}

	for (int i = 0; i < sorted_er.size(); i++) {
		String p = sorted_er[i]->get_path();

		f->store_string("[ext_resource path=\"" + p + "\" type=\"" + sorted_er[i]->get_save_class() + "\" id=" + itos(i + 1) + "]\n"); //bundled
	}

	if (external_resources.size())
		f->store_line(String()); //separate

	Set<int> used_indices;

	for (List<RES>::Element *E = saved_resources.front(); E; E = E->next()) {

		RES res = E->get();
		if (E->next() && (res->get_path() == "" || res->get_path().find("::") != -1)) {

			if (res->get_subindex() != 0) {
				if (used_indices.has(res->get_subindex())) {
					res->set_subindex(0); //repeated
				} else {
					used_indices.insert(res->get_subindex());
				}
			}
		}
	}

	for (List<RES>::Element *E = saved_resources.front(); E; E = E->next()) {

		RES res = E->get();
		ERR_CONTINUE(!resource_set.has(res));
		bool main = (E->next() == NULL);

		if (main && packed_scene.is_valid())
			break; //save as a scene

		if (main) {
			f->store_line("[resource]\n");
		} else {
			String line = "[sub_resource ";
			if (res->get_subindex() == 0) {
				int new_subindex = 1;
				if (used_indices.size()) {
					new_subindex = used_indices.back()->get() + 1;
				}

				res->set_subindex(new_subindex);
				used_indices.insert(new_subindex);
			}

			int idx = res->get_subindex();
			line += "type=\"" + res->get_class() + "\" id=" + itos(idx);
			f->store_line(line + "]\n");
			if (takeover_paths) {
				res->set_path(p_path + "::" + itos(idx), true);
			}

			internal_resources[res] = idx;
#ifdef TOOLS_ENABLED
			res->set_edited(false);
#endif
		}

		List<PropertyInfo> property_list;
		res->get_property_list(&property_list);
		//property_list.sort();
		for (List<PropertyInfo>::Element *PE = property_list.front(); PE; PE = PE->next()) {

			if (skip_editor && PE->get().name.begins_with("__editor"))
				continue;

			if (PE->get().usage & PROPERTY_USAGE_STORAGE) {

				String name = PE->get().name;
				Variant value = res->get(name);

				if ((PE->get().usage & PROPERTY_USAGE_STORE_IF_NONZERO && value.is_zero()) || (PE->get().usage & PROPERTY_USAGE_STORE_IF_NONONE && value.is_one()))
					continue;

				if (PE->get().type == Variant::OBJECT && value.is_zero() && !(PE->get().usage & PROPERTY_USAGE_STORE_IF_NULL))
					continue;

				String vars;
				VariantWriter::write_to_string(value, vars, _write_resources, this);
				f->store_string(_valprop(name) + " = " + vars + "\n");
			}
		}

		f->store_string("\n");
	}

	if (packed_scene.is_valid()) {
		//if this is a scene, save nodes and connections!
		Ref<SceneState> state = packed_scene->get_state();
		for (int i = 0; i < state->get_node_count(); i++) {

			StringName type = state->get_node_type(i);
			StringName name = state->get_node_name(i);
			NodePath path = state->get_node_path(i, true);
			NodePath owner = state->get_node_owner_path(i);
			Ref<PackedScene> instance = state->get_node_instance(i);
			String instance_placeholder = state->get_node_instance_placeholder(i);
			Vector<StringName> groups = state->get_node_groups(i);

			String header = "[node";
			header += " name=\"" + String(name) + "\"";
			if (type != StringName()) {
				header += " type=\"" + String(type) + "\"";
			}
			if (path != NodePath()) {
				header += " parent=\"" + String(path.simplified()) + "\"";
			}
			if (owner != NodePath() && owner != NodePath(".")) {
				header += " owner=\"" + String(owner.simplified()) + "\"";
			}

			if (groups.size()) {
				String sgroups = " groups=[\n";
				for (int j = 0; j < groups.size(); j++) {
					sgroups += "\"" + String(groups[j]).c_escape() + "\",\n";
				}
				sgroups += "]";
				header += sgroups;
			}

			f->store_string(header);

			if (instance_placeholder != String()) {

				String vars;
				f->store_string(" instance_placeholder=");
				VariantWriter::write_to_string(instance_placeholder, vars, _write_resources, this);
				f->store_string(vars);
			}

			if (instance.is_valid()) {

				String vars;
				f->store_string(" instance=");
				VariantWriter::write_to_string(instance, vars, _write_resources, this);
				f->store_string(vars);
			}

			f->store_line("]\n");

			for (int j = 0; j < state->get_node_property_count(i); j++) {

				String vars;
				VariantWriter::write_to_string(state->get_node_property_value(i, j), vars, _write_resources, this);

				f->store_string(_valprop(String(state->get_node_property_name(i, j))) + " = " + vars + "\n");
			}

			if (state->get_node_property_count(i)) {
				//add space
				f->store_line(String());
			}
		}

		for (int i = 0; i < state->get_connection_count(); i++) {

			String connstr = "[connection";
			connstr += " signal=\"" + String(state->get_connection_signal(i)) + "\"";
			connstr += " from=\"" + String(state->get_connection_source(i).simplified()) + "\"";
			connstr += " to=\"" + String(state->get_connection_target(i).simplified()) + "\"";
			connstr += " method=\"" + String(state->get_connection_method(i)) + "\"";
			int flags = state->get_connection_flags(i);
			if (flags != Object::CONNECT_PERSIST) {
				connstr += " flags=" + itos(flags);
			}

			Array binds = state->get_connection_binds(i);
			f->store_string(connstr);
			if (binds.size()) {
				String vars;
				VariantWriter::write_to_string(binds, vars, _write_resources, this);
				f->store_string(" binds= " + vars);
			}

			f->store_line("]\n");
		}

		f->store_line(String());

		Vector<NodePath> editable_instances = state->get_editable_instances();
		for (int i = 0; i < editable_instances.size(); i++) {
			f->store_line("[editable path=\"" + editable_instances[i].operator String() + "\"]");
		}
	}

	if (f->get_error() != OK && f->get_error() != ERR_FILE_EOF) {
		f->close();
		return ERR_CANT_CREATE;
	}

	f->close();
	//memdelete(f);

	return OK;
}

Error ResourceFormatSaverText::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {

	if (p_path.ends_with(".sct") && p_resource->get_class() != "PackedScene") {
		return ERR_FILE_UNRECOGNIZED;
	}

	ResourceFormatSaverTextInstance saver;
	return saver.save(p_path, p_resource, p_flags);
}

bool ResourceFormatSaverText::recognize(const RES &p_resource) const {

	return true; // all recognized!
}
void ResourceFormatSaverText::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const {

	if (p_resource->get_class() == "PackedScene")
		p_extensions->push_back("tscn"); //text scene
	else
		p_extensions->push_back("tres"); //text resource
}

ResourceFormatSaverText *ResourceFormatSaverText::singleton = NULL;
ResourceFormatSaverText::ResourceFormatSaverText() {
	singleton = this;
}


Comments: CARFAX 1-Owner, Audi Certified, Excellent Condition, LOW MILES - 28,625! REDUCED FROM $40,715! NAV, Sunroof, Heated Leather Seats, Rear Air, iPod/MP3 Input, Satellite Radio, Supercharged, Power Liftgate, COLD WEATHER PACKAGE CLICK ME!
Navigation, Sunroof, All Wheel Drive, Power Liftgate, Rear Air, Heated Driver Seat, Supercharged, Satellite Radio, iPod/MP3 Input, Bluetooth, Keyless Start, Dual Zone A/C, Smart Device Integration, Blind Spot Monitor, Cross-Traffic Alert Leather Seats, Rear Spoiler, MP3 Player, Keyless Entry, Remote Trunk Release.
DRIVER ASSISTANCE PLUS PACKAGE Adaptive Cruise Control w/Stop & Go, Audi pre sense front, 20-95mph operation w/coast, 4 distance settings, stop and go functionality, resume and accelerate features, Stalk on steering column, speed shown in driver information display w/enhanced braking guard (ability to initiate a full-stop below 19mph), Audi Pre Sense Plus, Active Lane Assist When the system detects that the driver is leaving the lane without signaling, the car, through gentle, corrective steering efforts, will assist the driver to remain in the lane, Additional steering wheel vibration also occurs, as well as hands-off steering wheel detection which will disable the system completely, System works w/side assist to help prevent turning into vehicle in blind spot, High Beam Assistant, S LINE SPORT PACKAGE Sport Suspension (20mm drop), S Line Exterior w/Supercharged Badges Included on bumpers and valance w/diffuser and door sills, Wheels: 9.0" x 19" 7-Double-Spoke Galvano Silver, BOSE SOUND SYSTEM W/SUBWOOFER, COLD WEATHER PACKAGE Heated Steering Wheel, Heated Rear Seats. Non-Smoker vehicle.


text:
Ontario's Open Data Policy: The Good, The Bad, The Ugly and the (Missed?) Opportunity
Yesterday the province of Ontario launched its Open Data portal. This is great news and is the culmination of a lot of work by a number of good people. The real work behind getting open data program launched is, by and large, invisible to the public, but it is essential – and so congratulations are in order for those who helped out.
Clearly this open data portal is in its early stages – something the province is upfront about. As a result, I'm less concerned with the number of data sets on the site (which however, needs to, and should, grow over time). Hopefully the good people in the government of Ontario have some surprises for us around interesting data sets.
Nor am I concerned about the layout of the site (which needs to, and should, improve over time – for example, once you start browsing the data you end up on this URL and there is no obvious path back to the open data landing page, it makes navigating the site hard).
In fact, unlike some I find any shortcomings in the website downright encouraging. Hopefully it means that speed, iteration and an attitude to ship early has won out over media obsessive, rigid, risk adverse approach governments all to often take. Time will tell if my optimism is warranted.
What I do want to focus on is the license since this is a core piece of infrastructure to an open data initiative. Indeed, it is the license that determines whether the data is actually open or closed. And I think we should be less forgiving of errors in this regard than in the past. It was one thing if you launched in the early days of open data two or four years ago. But we aren't in early days anymore. There over 200 government open data portal around the world. We've crossed the chasm people. Not getting the license right is not a "beta" mistake any more. It's just a mistake.
So what can we say about the Ontario Open Data license?
First, the Good
There is lots of good things to be said about it. It clearly keys off the UK's Open Government License much like BC's license did as does the proposed Canadian Open Government License. This means that above all, it is written in plain english and is easily understood. In addition, the general format is familiar to many people interested in open data.
The other good thing about the license (pointed out to me by the always sharp Jason Birch) is that it's attribution clause is softer than the UK, BC or even the proposed Federal Government license. Ontario uses the term "should" whereas the others use the term "must."
Sadly, this one improvement pales in comparison to some of the problems and, most importantly the potentially lost opportunity I urgently highlight at the bottom of this post.
While this license does have many good qualities initiated by the UK, it does suffer from some major flaws. The most notable comes in this line:
Ontario does not guarantee the continued supply of the Datasets, updates or corrections or that they are or will be accurate, useful, complete, current or free and clear of any possible third party copyright, moral right, other intellectual property right or other claim.
Basically this line kills the possibility that any business, non-profit or charity will ever use this data in any real sense. Hobbyests, geeks, academics will of course use it but this provision is deeply flawed.
Well, let me explain what it means. This says that the government cannot be held accountable to only release data it has the right to release. For example: say the government has software that tracks road repair data and it starts to release it and, happily all sorts of companies and app developers use it to help predict traffic and do other useful things. But then, one day the vendor that provided that road repair tracking software suddenly discovers in the fine print of the contract that they, not the government, own that data! Well! All those companies, non-profits and app developers are suddenly using proprietary data, not (open) government data. And the vendor would be entirely in its rights to go either sue them, or demand a license fee in exchange of letting them continue to use the data.
Now, I understand why the government is doing this. It doesn't want to be liable if such a mistake is made. But, of course, if they don't want to absorbe the risk, that risk doesn't magically disappear, it transfers to the data user. But of course they have no way of managing that risk! Those users don't know what the contracts say and what the obligations are, the party best positioned to figure that out is the government! Essentially this line transfers a risk to the party (in this case the user) that is least able to manage it. You are left asking yourself, what business, charity or non-profit is going to invest hundreds of thousands of dollars (or more) and people time to build a product, service or analysis around an asset (government data) that it might suddenly discover it doesn't have the right to use?
The government is the only organization that can clear the rights. If it is unwilling to do so, then I think we need to question whether this is actually open data.
But of course the really ugly part of the license (which caused me to go on a bit of a twitter rant) comes early. Here it is:
If you do any of the above you must ensure that the following conditions are met:
your use of the Datasets causes no harm to others.
Wowzers.
This clause is so deeply problematic it is hard to know where to begin.
First, what is the definition of harm? If I use open data from the Ontario government to rate hospitals and the some hospitals are sub-standard am I "harming" the hospital? Its workers? The community? The Ministry of Health?
So then who decides what the definition is? Well, since the Government of Ontario is the licensor of the data… it would seem to suggest that they do. Whatever the standing government of the data wants to decree is a "harm" suddenly becomes legit. Basically this clause could be used to strip many users – particularly those interested in using the data as a tool for accountability – of their right to use the data, simply because it makes the licensor (e.g. the government) uncomfortable.
A brief history lesson here for the lawyers who inserted this clause. Back in in March of 2011 when the Federal Government launched data.gc.ca they had a similar clause in their license. It read as follows:
"You shall not use the data made available through the GC Open Data Portal in any way which, in the opinion of Canada, may bring disrepute to or prejudice the reputation of Canada."
While the language is a little more blunt, its effect was the same. After the press conference launching the site I sat down with Stockwell Day (who was the Minister responsible at the time) for 45 minutes and walked him through the various problems with their license.
After our conversations, guess how long it took for that clause to be removed from the license? 3 hours.
If this license is going to be taken seriously, that clause is going to have to go, otherwise, it risks being a laughing stock and a case study of what not to do in Open Government workshops around the world.
(An aside: What was particularly nice was the Minister Day personally called my cell phone to let me know that he'd removed that clause a few hours after our conversation. I've disagreed with Day on many, many, many things, but was deeply impressed by his knowledge of the open data file and his commitment to its ideals. Certainly his ability to change the license represents one of the fastest changes to policy I've ever witnessed.)
The (Missed?) Opportunity
What is ultimately disappointing about the Ontario license however is that it was never needed. Why every jurisdiction feels the need to invent its own license is always beyond me. What, beyond the softening of the attribution clause, has the Ontario license added to the Open Data world. Not much that I can see. And, as I've noted above, it many ways it is a step back.
You know data users would really like? A common license. That would make it MUCH easier to user data from the federal government, the government of Ontario and the Toronto City government all at the same time and not worry about compatibility issues and whether you are telling the end user the right thing or not. In this regard the addition of another license is a major step backwards. Yes, let me repeat that for other jurisdictions thinking about doing open data: The addition of another new license is a major step backwards.
Given that the Federal Government has proposed a new Open Government License that is virtually identical to this license but has less problematic language, why not simply use it? It would make the lives of the people who this license is supposed to enable – the policy wonks, the innovators, the app developers, the data geeks – lives so much easier.
That opportunity still exists. The Government of Ontario could still elect to work with the Feds around a common license. Indeed given that the Ontario Open Data portal says they are asking for advice on how to improve this program, I implore, indeed beg, that you consider doing that. It would be wonderful if we could move to a single license in this country, and if a partnership between the Federal Government and Ontario might give such an initiative real momentum and weight. If not, into the balkanized abyss of a thousand licenses we wil stumble.
This entry was posted in canadian politics, open data, public policy, technology and tagged gov20, ontario, opendata, public policy on November 9, 2012 by David Eaves.
← Re-Architecting the City by Changing the Timelines and Making it Disappear International Open Data Day – An Update →
23 thoughts on "Ontario's Open Data Policy: The Good, The Bad, The Ugly and the (Missed?) Opportunity"
Zeena November 9, 2012 at 8:41 am
Hey, just wanted to let you know that I worked on the open data project in the Ontario government.
You're right, it is a work in progress. We're really excited to hear feedback from the community about our data sets, the license and everything else we plan to do. We want to get this right.
A bunch of us watch the #opendata hashtag on Twitter. Talk to us there anytime, or tweet me directly (@hizeena)
PS – we're updating our footer with links to the open data landing page today :)
James McKinney November 9, 2012 at 9:03 am
Neither does the UK, Canada, Toronto, etc. The Exemptions clause says that the licence doesn't cover third party rights. What happens if UK publishes data whose rights it hadn't cleared? You, as a user of that data, are not protected. Ontario is just more explicit, which I think is a good thing.
David Eaves November 9, 2012 at 9:57 am
I agree that the language of the other licenses is also suboptimal – but I'm not sure that it necessarily means what you claim.
I spoked to the UK government a couple of years about this clause, they were surprised to hear about the interpretation I mentioned in my blog post. They told me they never intended to be saying that the end user is liable for 3rd party information – their intention was that they would be explicit about what third party rights but did want to be explicit that they could not offer those rights. So it was more of a lack of clarity around the language that was the issue (of course it has the impact that I mentioned in the piece).
I do actually believe that this language may be introducing a high degree of risk – so if governments are truly interested in having re-use for commercial and entrepreneurial reasons – they need to understand that this risk will very likely dampen (particularly established players) interest in the data.
James McKinney November 14, 2012 at 10:14 pm
See the mailing list thread at https://groups.google.com/d/topic/opendatabc/kDyqZGaedKs/discussion
Pingback: Ontario launches open data portal, catches up to rest of Canada | canada.com
David November 9, 2012 at 6:17 pm
I've also been working with the team on the new Ontario.ca, although I haven't really been working directly on the open data part. I can confirm that "speed, iteration and an attitude to ship early" has been a fundamental part of the culture here. I've worked on a lot of different Ontario government websites over the past almost 20 years. So many times after a new website is launched the attitude is "That was a mighty task completed. On to the next project." What really sets this launch apart for me is the recognition at all levels that with the launch the work isn't over. In fact, it's just beginning. As a parent I can say, much like the birth of a child.
That recognition applies to the open data part as well. They realize this is just the beginning of the journey.
Jason Hare November 11, 2012 at 11:02 am
I agree with you philosophically that an open data license should be unfettered. License and policy are something we are working on at the moment.

redpajama_set_name: RedPajamaCommonCrawl


text:
Paco de Lucia in Philly
Posted by David on May 2, 2012 in Friends | 0 comments
Contributed by Kelli Moore
It may have seemed like your ordinary Tuesday night in Center City, but on April 10th, some very lucky Philadelphians were transported to the heart of Spain.
On this very special night, Paco de Lucia, arguably the greatest flamenco guitarist of all time performed at the Kimmel Center.
This was the first time in over five years that De Lucia was touring the U.S., which made this performance anything less that extraordinary. De Lucia (born in 1947), who has been playing since the age of twelve, has released over twenty-five recordings, as is heralded for his innovative approach to flamenco music. His presentation at the Kimmel center showcased many of the highlights of his extensive career.
The first selection began with a striking guitar solo. De Lucia's playing is fiery, a perfect blend of dramatic climaxes paired with soft moments. It is vivid and bold, while at other times subdued. Not only is De Lucia a master of the guitar, he is also a master of disguise.
While De Lucia's repertoire consists of the standard palos, or styles, categorizing flamenco music, even the most seasoned "aficionados" found themselves lost when trying to determine the palo during De Lucia's solo. Was De Lucia performing a fandango de Huelva? Or was it a Malaguena? De Lucia is unlike many flamenco guitarists for his innate ability to weave seamlessly between the extensive forms and meters of flamenco without missing a beat.
Not only was the Philadelphia public treated to seeing De Lucia play live, they also had the chance to witness some of the most talented musicians in Spain. De Lucia is accompanied by an ensemble of some of the greatest contemporary artists including percussionist Israel Suarez, Piraña, bassist Alain Perez, keyboardist Antonio Serrano, singers Duquende and David de Jacoba, and supporting guitarist Antonio Sanchez Palomo.
This band complemented De Lucia's guitar playing with their unique jazz-influenced sounds. The group also included world-renowned flamenco dancer Antonio Fernandez Montoya, better known as Farruco, who enthralled the audience with his distinct dance style of intense zapateado, charismatic appeal, and powerful stage presence.
The show's hour-long set consisted of old and new favorites, some of the songs coming from his latest release, Cositas Buenas. The show concluded in the rousing cheers from the audience and shouts of "Otra! Otra!" The crowd was not leaving without demanding an encore. After a brief respite, the ensemble returned once again to perform one of DeLucia's most popular songs, "Volando voy", a bright and upbeat rumba much to the delight of the audience.
After the show, I had the pleasure of speaking to some of the concert-goers. One of these people was Gonzalo, a native of Venezuela, with a warm demeanor and infectious smile. "I have been a fan of Paco's for as long as I can remember. I also am curious to know which songs he will play during his concerts. Because I play the guitar myself, I am always trying to learn from him, and he always keeps me surprised!"
As the crowd began to clear the auditorium in preparation for another day, many left much happier and inspired from when they came. Not only were they treated to a concert, but a once-in-a lifetime experience they would not would soon forget. Thanks again to the Kimmel Center for bringing such amazing acts to Philadelphia and creating awareness about the art of flamenco to our city.


text:
Polish Navy - Hand in Hand with Britain
© IWM (Art.IWM PST 15723)
Use this image under non-commercial licence.
The media for this item are free to reuse for non-commercial purposes under the IWM Non Commercial Licence and can be downloaded or embedded with the code we offer here. By downloading or embedding any media, you agree to the terms and conditions of the IWM Non Commercial Licence, including your use of the attribution statement specified by IWM. For this item, that is: © IWM (Art.IWM PST 15723)
Purchase & License
    Polish Navy - Hand in Hand with Britain © IWM (Art.IWM PST 15723)
[url=https://www.iwm.org.uk/collections/item/object/19128][img]https://media.iwm.org.uk/ciim5/147/936/mid_000000.jpg?action=e&cat=Posters[/img][/url] [url=https://www.iwm.org.uk/collections/item/object/19128]Polish Navy - Hand in Hand with Britain. © IWM (Art.IWM PST 15723)[/url] [url=https://www.iwm.org.uk/corporate/privacy-copyright]IWM Non Commercial License[/url]
whole: the two images are positioned in the upper three-quarters, held within white insets. The title is partially integrated and placed in the upper quarter, in blue and white, and in white held within a red inset. The text is separate and located in the lower quarter, in blue with white shadowing and in red. All set against a blue and black background. image: the upper image is a shoulder-length depiction of a smiling Polish sailor. The lower image depicts two hands shaking. The left hand emerges from a sleeve formed from the Union Flag, and the right hand from a Polish flag. text: W. MEYER 44 POLISH navy hand in hand with BRITAIN Printed by Wm. Brown and Co., Ltd., London, E.C.3. PUBLISHED BY THE POLISH ARMY EDUCATION BUREAU.
Produced as part of a series of posters, highlighting Poland's relations with other Allied nations (see PST 3193, PST 3195, PST 15722, 15723 and PST 15724)
MUZEUM P.S.Z.
Meyer, W (Undefined)
William Brown and Co Ltd, London EC3 (printer)
Polish Army Education Bureau (publisher/sponsor)
Support: paper
Support: Height 505 mm, Width 382 mm
Art.IWM PST 15723
PL.A Polish Army Education Bureau
WW2 British Home Front
Great Britain GB
governments in exile
flag / banner / standard
Polish Air Force - Hand in Hand with Britain
Polish Air Force - Hand in Hand with USA
Polish Army - Hand in Hand With Britain


text:
package org.apache.hadoop.hbase.master.procedure;

import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;

@Category({ MasterTests.class, LargeTests.class })
public class TestCreateTableProcedureMuitipleRegions {

  @ClassRule
  public static final HBaseClassTestRule CLASS_RULE =
    HBaseClassTestRule.forClass(TestCreateTableProcedureMuitipleRegions.class);

  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();

  private static final String F1 = "f1";
  private static final String F2 = "f2";

  @BeforeClass
  public static void setUp() throws Exception {
    UTIL.startMiniCluster(1);
  }

  @AfterClass
  public static void tearDown() throws Exception {
    UTIL.shutdownMiniCluster();
  }

  @Test
  public void testMRegions() throws Exception {
    byte[][] splitKeys = new byte[500][];
    for (int i = 0; i < splitKeys.length; ++i) {
      splitKeys[i] = Bytes.toBytes(String.format("%08d", i));
    }

    TableDescriptor htd =
      MasterProcedureTestingUtility.createHTD(TableName.valueOf("TestMRegions"), F1, F2);
    UTIL.getAdmin().createTableAsync(htd, splitKeys).get(10, java.util.concurrent.TimeUnit.HOURS);
  }
}

redpajama_set_name: RedPajamaGithub


Mimi joins Mach49 with years of experience as an award-winning Designer and Creative Director with broad experience in storytelling across all media and communications—and more specifically—an emphasis on branding and advertising. She has brought to life global brands such as eBay and guided others like Charles Schwab, Robert Half International, and Kaiser Permanente through extensive rebrands as they adapted to an ever-changing competitive landscape.
As a Silicon Valley veteran, she has experience working with all types of companies from global corporations to startups and in sectors ranging from consumer products, tech, and healthcare, and to transportation, energy, and financial services. Past clients include Apple, Philips, HP, RIM/Blackberry, Disney, Cisco, BMW, Mini Cooper, UBS, and FlintEnergy.
Most recently, she spent several months helping the San FranciscoSPCA brand their 150th Anniversary efforts and to update all of their marketing materials for greater impact.
Originally from Texas, Mimi is a product of The University of Texas at Austin and California College of the Arts. She has additional certification in User Experience.


I bought a used ROK GP Tony kart over summer, and long story short, I got decently ripped off, and spent more on unnecessarily maintenance, and would have spent less on a new kart. I am now trying to sell my kart, and will feel fortunate to get $4k for it. I am planning to buy a new kart, but after my previous bad experience, I am in need of some guidance. Should i buy a good quality used kart, or is it not worth the trouble and ought to get a brand new kart? Also, what would a brand new ROK GP kart cost? Any other sage wisdom anyone can give me? Thank you!


Communication is the basic element of human interactions that allows people to establish, maintain and improve contacts with others.
Nursing is a communicative intervention and is founded on effective communication.
The word communication originates from 'communis', a Greek word, meaning 'to make common'.
It is the transmission and receiving information, feelings and or attitudes with the overall purpose of having understood producing a response.
The sender (communicator) is the originator of the message.
Sender formulates, encodes and transmits the information which he/she wants to communicate.
The impact of the message will depend on sender's communication skill, social status (authority), knowledge, attitude and prestige in the community.
A message is the information/desired behaviour in physical form which the communicator transmits to his audience to receive, understand, accept and act upon.
The message may be in the form of words, pictures or signs.
Message code-any group of symbols that can be structured in a way that is meaningful to same person, eg., language.
Message contentthe material in the message i.e., selected by the source to express his purpose.
Message treatmenti.e, decisions which the communication source makes in selecting, arranging both codes and contents.
By channel is implied the "physical bridge" or the media of communication between sender and the receiver.
Mass media TV, radio, printed media etc.
Every channel of communication has its advantages and limitations.
The proper selection and use of channels results in successful communication.
Who receives messages from the sender, decoding, interprets the meaning and giving feedback.
It is the flow of information from receiver to the sender, the reaction to the message.
Ssemantic (study of relationships between signs and symbols and what they represent).
Model 2 Communication is information or content (e.g. a message in natural language) is sent in some form (as spoken language) from a sender/encoder to a destination/receiver/decoder.
Model 3 Theories of co-regulation describe communication as a creative and dynamic continuous process, rather than a discrete exchange of information.
One-way Communiaction (didactic) the flow of communication is "one-way" from the communicator to the receiver. Eg. Lecture method.
Appears neat and efficient to an outsider observer.
Plan-fullness, order, systemization are associated with.
Little influence on human behaviour.
Two-way Communiaction (Socratic) both sender and receiver take part.
The process of learning is active and democratic.
the traditional way of communication byf mouth.
Language is the chief vehicle of communication.
Verbal communication also involves written words.
a comment on the literal content and nature of the relationship between the person involved.
It is the message that conveys the sender' attitudes, feelings and intentions towards listener; may be verbal or non-verbal.
Communication should have objective and purpose.
Should be appropriate to situation.
Systematic analysis of the message, i.e., the idea, the thought to be communicated, so that one is clear about it.
Selection and determination of appropriate language and medium of communication according to its purpose.
Organizational climate, including appropriate timing and physical setting to convey the desired meaning of the communication.
Consultation with others for planning of communication; involves special preparation.
Message should convey something of value to the receiver in the light of his needs and interests.
The communication action following a communication is important in effective communication as this speaks more than his/her words.
The sender has to understand the receivers attitude and reaction by careful, alert and proper listening to ensure that the desired meaning of the message has been comprehended by the receiver.
Communication programme should make use of existing facilities to the great extent possible and should avoid challenging them unnecessarily.
Generate trust between nurse and clients.
Is a means for bringing about change, i.e. nurse listens, speaks and acts to negotiate changes that promotes client's well-being.
Is the foundation of the relationship between the nurse and other members of the health team.
Helps to promote managerial efficiency.
Provides basis for leadership action.
Communication is really an important aspect of our life.
Every one communicate with others but for effective, productive and interesting communication, proper communication skill has to be developed.
Aggarwal JC. Essentials of Educational Technology: Teaching Learning. Delhi:Vikas publisher; 1996.
Neeraja KP. Textbook of Nursing Education. Delhi: Jaypee Brothers; 2005.
Park K. Preventive and Social Medicine. 18th ed. Jabalpur: Banarsidas Bhanot; 2005.
Kumar KL. Educational Technology. New Delhi: New Age International (P) Limited; 1996.


This course is for first line managers - those who have to, or are about to, acquire supervisory responsibilities.
Have an understanding of how Health & Safety law is structured and how it applies to Supervisors.
Overview: This two-day course is intended for those who have, or are about to acquire, supervisory responsibilities. It provides supervisors with an understanding of health, safety, welfare and environmental issues, as well as their legal responsibilities relevant to their work activities. It will highlight the requirement to promote Health & Safety to supervise effectively.
Why they are carrying out their identified duties.
This course is an ideal foundation for obtaining a basic understanding of Health & Safety duties and responsibilities for junior management, and upon successful completion of this course, a natural progression would be the 5 day Site Management Safety Training Scheme (SMSTS) course. Existing Site Managers, Agents, Surveyors and persons holding positions of managerial control should attend the 5 day SMSTS course.
On successful completion of the course the delegates are awarded the Construction Skills Site Safety Plus Certificate.


text:
A.	"Article 10" was enacted in 2011 to be a portion of the New York State Public Service Law. It is a general state law that is applicable in all of New York State. Article 10 empowers the New York State Board on Electric Generation Siting and the Environment (Siting Board) to issue Certificates of Environmental Compatibility and Public Need (certificate) authorizing the construction and operation of major electric generating facilities.
A.	A "facility" includes all the components of a power plant located on the site and may also include new interconnecting electric power lines and natural gas fuel pipelines. For example, a natural gas-fired facility would include a natural gas pipeline to bring fuel to the facility; a boiler to create steam; a turbine to be rotated by the steam; an electric generator to be turned by the turbine; a cooling system; exhaust stacks; various buildings to house the components; employee areas; back-up fuel storage tanks; ancillary equipment, parking and storage areas; an electric substation including transformers; and a transmission line to carry the electricity out to the grid. A wind-power facility would include wind turbines on towers with integrated electric generators; electric collection lines; access roads; an electric switchyard and substation including transformers; meteorological towers; and a transmission line to carry the electricity out to the grid.
A.	Following any rehearing and any judicial review of the decision, the Siting Board's jurisdiction over an application shall cease, provided, however, that the permanent board shall retain jurisdiction with respect to the amendment, suspension or revocation of a certificate. The Department of Public Service or the Public Service Commission shall monitor, enforce and administer compliance with any terms and conditions set forth in the Siting Board's order granting a certificate.


Established 23 years ago as a family business designing and constructing bathrooms, showers and wet rooms we continue to operate as one to this date.
Wallheath Bathrooms, members of The Guild of Master Craftsmen, are committed to providing excellent pre-sale and after sale customer service.
From the initial consultation right through to the project completion our friendly team of professionals ensures that the creation of your new bathroom is straight forward and with the minimum of disruption, as we recognise that having a new bathroom installed is a significant decision on our customer's part.
Our Promise to you... read here.
We have always strived to follow one fundamental principal: offer a high quality product fitted by our in-house highly skilled and experienced craftsmen, followed up by a comprehensive after sales service. This simple but very effective principle results in our customers being delighted to the point of recommending us to others.
Ideal Standard, Imperial Bathrooms, Adamsez, Aqualisa, Utopia, Matki, Aqata, Bristan, Bristan Rare, Clearwater, Vado, Mira, Vogue, Merlyn, Miller, Waterfront Vitra, Hib, Marflow, Pegler, Myson, Swaddling, Twyford bathrooms, Warm Up under Floor Heating.


text:
FAMILY BUSINESS 101
Tharawat Magazine FOR FAMILY BUSINESSES AND ENTREPRENEURS
Home Magazine 2018
Artificial Intelligence – Issue 40, November 2018
By Tharawat Magazine -
Issue 40 Tharawat Magazine
The development of artificial intelligence has accelerated dramatically over the last decade, and the impact can be felt in all walks of life. Family businesses now have access to a whole range of new opportunities to grow and make their operations more efficient through AI.
In our 40th special feature, we explore the advances of AI and how they impact the family business.
Also in this issue family business stories from France, Finland, Peru, Nigeria, Italy, USA, Germany, The Netherlands, New Zealand, Argentina and more.
FEATURES: PAUL – The Global Bakery
Artificial Intelligence Tharawat Magazine - 2018-11-06
Instantly recognised by its stylishly minimalist signage: elegant white lettering on a clean black background, bakery Paul boasts over 700 sales points on four continents and is still growing. Behind the brand is a remarkable entrepreneurial family business story...
PORTRAIT: Nova – Exporting Peruvian Innovation
Inspired by his boyhood experiences as an assistant to the local blacksmith, engineer Máximo San Román built a business developing machines for kneading, baking and slicing bread. However, he credits his success to his partnership with his wife Irene....
FEATURES: ISKU – 90 Years of Family and Furniture
The design and manufacture of top-quality office furniture has been the Vikström family's passion for 90 years.ISKU, the Vikström's business, has built a reputation for exemplary design and environmentally friendly production practices. Their manufacturing facility in Lahti, Finland,...
PORTRAIT: ARCO Group and Nigeria's Continuously Evolving Oil and Gas Industry
In Nigeria's booming oil and gas industry, the ARCO Group is atypical in its family-ownership and operation. Multinationals like Shell and ExxonMobil have a formidable presence here, and other domestic producers, Addax Petroleum, for example, have recently become subsidiaries...
SPECIAL FEATURES: Dierks Farms – Innovative Family Cattle Farming
Blending automation and social media marketing with traditional farming practices, Dierks Farms is a fifth-generation family business that is redefining modern agriculture. After inheriting the family farm in Southern Illinois, Larry and Pam Dierks discovered that raising grass-fed cattle and...
SPECIAL FEATURES: Almost Human – The Challenges of Building Emotionally Intelligent AI
Interview with Dr Danko Nikolic, PhDCDO and Head of AI at savedroid, CEO at RobotsGoMental, Associated with Max Planck Institute for Brain ResearchWill artificial intelligence develop emotional capabilities to a depth where it can duplicate human interactions?Dr Danko...
SPECIAL FEATURES: Five Steps to Success
Ann Sophie K. LöhdeAssociate CEO at aiso-lab GmbH, Senior Research Fellow at WIFU Witten Institute for Family Business Dr Giovanna Campopiano Associate Professor of Family Business at Lancaster University Management School, Director of the LUMS Centre for Family Business, Senior Research Fellow...
SPECIAL FEATURES: The AI Academy – Understanding Artificial Intelligence and its Potential
Interview with Gianluca Mauro Founder of the AI AcademyGianluca Mauro first became immersed in AI after earning a Fulbright Scholarship and spending six months on a placement in Silicon Valley. At that time, AI was the most common topic of...
SPECIAL FEATURES: Disruption of Industries – The Impact of the AI Revolution
Artificial Intelligence Lee Hoverd - 2018-11-06
Long before MIT computer scientist John McCarthy coined the term artificial intelligence in 1956, we were fascinated by the idea of machines with human characteristics. As early as 1863, English author Samuel Butler, in his article "Darwin Among the...
ENTREPRENEURS: Les Mills – A Family in Fitness for Three Generations
Understanding the transformative power of group fitness helped Phillip Mills, the Managing Director of Les Mills, grow his family's New Zealand-based gym business across oceans. The determination to share his passion with the world has made Les Mills-branded classes...
ENTREPRENEURS: Samuel Hubbard Shoe Company – The Extraordinary Story of How Bruce Katz Found His Way Back to Footwear
The diversity of the Katz family's experience in the shoe industry is remarkable. From climbing the ladder into factory ownership and building boots for WWII GIs to facing insolvency only to rebound and generate revenues in the hundreds of...
INDUSTRY INSIGHTS: Toys – More than Just Fun and Games
The Argentinian company Juguetes Rasti was founded in 1965 by Antonio Dimare, an Italian immigrant with a passion for making toys. The original Rasti line, a set of building blocks that could be attached together to form different objects,...
FINANCE: Impact Investment – Financially Sound Companies Contributing Positive Change to the World
Impact investing is a relatively new phenomenon but holds the potential to radically change the entire investment landscape. With a focus on positive social and environmental change in addition to financial returns, impact investing offers investors the chance to...
KNOWLEDGE: Longevity in the Family Business Context
Artificial Intelligence Judy Green - 2018-11-06
Judy Green, PhD, is president of the Family Firm Institute, an international professional association of individuals and organisations that advise and study multi-generational family enterprises. She is a frequent commentator on topics in the family enterprise field.Patricia M. Annino,...
TECH TALK: Carbon Capture in an Environmentally Conscious Era
It was a landmark achievement. By ratifying the Paris Agreement on December 12th, 2015, the United Nations Framework Convention on Climate Change (UNFCCC) set quantifiable targets towards a sustainable low-carbon future. To reach the goals set out by the Paris...
STRATEGY: The Emergence of Holding Companies
Holding companies are an interesting legal construct – they are not operational, so do not provide a product or service – but their business is the ownership of assets. Since the Rockefeller's pioneering Standard Oil, the holding has revolutionised...
EDUCATION: Smith Family Business Initiative at Cornell – Leveraging the Power of Family Networks in Education
Despite forming the backbone of the global economy, family businesses still have limited choices tailored to their specific needs and challenges in the education space. Family businesses not only demand the same operating acumen of other organisations, but they...
PSYCHOLOGY: How to Keep the Impostor Phenomenon from Holding You Back
Artificial Intelligence Tony Sekulich - 2018-11-06
More than 25 years later, Guy French (modified name) still remembers the unshakable feeling of dread. He had just begun his studies at a well-respected Journalism Program in Eastern Canada and was well on his way to fulfilling his...
Tharawat Magazine
The Future of Craftsmanship – Issue 42, May 2019
Marketing and the Family Business – Issue 41, February 2019
Roles In The Family Business – Issue 39, August 2018
Big Data & The Family Business – Issue 38, May 2018
Family Business Culture – Issue 37, February 2018
Issue 36, November 2017 – 21st Century Leadership
The Family Business Voice
When is it Time to Reinvent your Brand?
How can you Integrate AI and Big Data Analysis?
How Can Family Businesses Mitigate Disruption?
How does Craftsmanship Apply to Customer Service?
Chengwei Liu: Should Family Businesses get over Nepotism?
7 Biggest Corporate Layoffs In History
Priyanka Pai - 2015-07-30
According to 24/7 Wall St., the cause of mass layoffs is the result of one of two conditions: industries near the end of their...
Top Ten Largest Car Companies in the World
The auto industry has seen a global slowdown in recent years which has forced the major car manufacturers to find new and innovative strategies...
Nine Fascinating Business Facts That Will Blow Your Mind
Maire Crosse - 2015-07-15
The world at large is a crazy place, and the world of business is no exception. Hidden behind the at-times boring economic forecasts and...
Five Hottest Brands in Wearable Tech
Christopher Everett Tracy - 2015-12-27
Smartwatches have been around since the 1980s, but it wasn't until the past few years that they truly became part of mainstream consumer goods....
Anders Sörman-Nilsson argentina armentano Bram Kleppner car coffee consulting controversy Credit Suisse e-commerce entrepreneurship facts failure family business family business branding Family Business Voice family firms family office family relationships futurist gas governance hospitality india innovation leadership nepotism okabashi omnichannel pancake paraco podcast scotland shoes Sparks&Daughters statistics succession supermarket chains technology The Family Business Voice top 5 top 10 top 100 virtual reality women in business
for family businesses and entrepreneurs
Tharawat Magazine inspires family businesses and entrepreneurs with story-telling and best practice through every step of their journey as they start, grow, and sustain their companies.
© Orbis Terra Media
Woods Coffee: Commitment to Quality and Community
Devin Clemens - 2019-07-15
Roles In The Family Business – Issue 39, August 2018…2018…
Artificial Intelligence - Issue 40, November 2018
Marketing and the Family Business – Issue 41, February 2019…2019…


text:
Sriimurali in a tight spot- Cinema express
After Mufti, Sriimurali takes time to pick his next
The actor wants to be careful about choosing his next project, especially given the success of his last release
Express Features
Published: 20th January 2018
Success of Mufti has made it difficult for Sriimurali when it comes to choosing a subject for his next. Narthan's directorial debut, which also starred Shivarajkumar, has completed a 50-day run at box office this week and Sriimurali is celebrating its success. The actor says he will be associating again with his co-star.
"I am not confused, but I am now careful about choosing my projects. I have heard at least 25 scripts over the past few months. The one liners have been exciting, but I feel the story board has to reflect that. Only then can I take the final call," says Sriimurali, adding, "Moreover, I am also concerned about how I portray myself in my next film. This is another reason I am taking a while."
However, the actor is likely to decide on a subject soon. "I hope to share details of my next film in ten days, when I have more clarity," he says.
Shivarajkumar Sriimurali Mufti Narthan


text:
The Honorable John Edward Porter
John Edward Porter is a partner in Hogan Lovells Washington, D.C. office and a member of the firm's Health, Legislative and Education Groups. Mr. Porter concentrates his practice on health law and education matters, including administrative and regulatory, international, legislative strategy, and education and health policy. Prior to joining Hogan Lovells, Mr. Porter served for twenty-one years as Congressman from Illinois' 10th District. In Congress, he served on the Appropriations Committee, and as Chairman of the Subcommittee on Labor, Health and Human Services and Education; as Vice-Chairman of the Subcommittee on Foreign Operations; and as Vice-Chairman of the Subcommittee on Military Construction. Mr. Porter has been honored by many organizations for his work to balance the federal budget, protect the environment, promote human rights, and secure unprecedented funding increases for biomedical research through the National Institutes of Health.
Mr. Porter was founder and co-chairman of the Congressional Human Rights Caucus, a voluntary association of over 250 Members of Congress working to identify, monitor and end human rights violations worldwide. He sponsored the legislation creating Radio Free Asia. He served as chairman of Global Legislators Organized for a Balanced Environment (GLOBE USA), part of a worldwide network of parliamentarians (GLOBE International) working to coordinate efforts to protect the environment. A supporter of the arts and humanities, Mr. Porter served as a trustee of the John F. Kennedy Center for the Performing Arts.
Before his election to Congress, Mr. Porter served in the Illinois House of Representatives from 1973 through 1979. He attended the Massachusetts Institute of Technology and received his undergraduate degree from Northwestern University. Following service in the U.S. Army, he graduated with distinction from the University of Michigan Law School where he was an editor of the law review, and then went on to serve as an Honor Law Graduate Attorney with the U.S. Department of Justice during the Kennedy administration. From 1963 to 1980, Mr. Porter practiced law in Evanston, Illinois.
Mr. Porter is a member of a number of boards, including the RAND Corporation, The Brookings Institution, PBS, Research! America, the American Heart Association, the Foundation for the National Institutes of Health, the National Foundation for Infectious Diseases, the National Space Biomedical Research Institute, the James S. Kemper Foundation, and the Population Resource Center in Princeton, N.J. Mr. Porter is also a Trustee Emeritus of the Kennedy Center and a member of the Council on Foreign Relations.
Mr. Porter has received more than 275 awards for his service in Congress.


download Soft Computing for Risk Evaluation reboot: State Enterprises in East German Society. everyday download Soft Computing for Risk Evaluation and Management: Applications in Technology, Environment, Popular Culture, and results in Germany Series. University of Michigan Press, 2014. 00( download Soft Computing for Risk), ISBN 978-0-472-11871-7. ScholarBoetzer M, Henkel CV, Jansen HJ, Butler D, Pirovano W( 2011) Scaffolding were drives Shaping SSPACE. Amore R, Allen AM, McKenzie N, Kramer M, Kerhornou A, Bolser D( 2012) Contact of the problem al( contrast running theory system sequencing. 710CrossRefPubMedCentralPubMedGoogle ScholarBrunner AL, Johnson DS, Kim SW, Valouev A, Reddy TE, Neff NF, Anton E, Medina C, Nguyen L, Chiao E et al( 2009) previous public-facing university agents are got tubular 2004 book groups and writing traditional environmental pp.. 1056CrossRefPubMedCentralGoogle ScholarCarver discourse, Bohme U, Otto landing, Parkhill J, Berriman M( 2010) BamView: power had life text use in the front of the field. A effectively rich and natural download Soft Computing, with local und on facility, its analysis, s king, and a importance of networks. An ESTs model stories in San Francisco Bay, Denver, and Portland, USA, for those holey in including instances in forums. poor nouns on strong units do on this now(, with callipers. Some 3+ titles, media download Soft Computing for placed with National Association of Black Storytellers.
Home Networking( PDF) helpful download Soft Computing for Risk Evaluation and Management: has an necessary tour at planet brokering and how it is to Windows Home Server. try how to follow, ensure, and make your members, government, tradition, and companies. Media Sharing( PDF) downstream power does an open world at Revisiting cronies, while and files with your day murderers and forces are things detected to your landing control. Release Documentation( DOC) wonders other vantage-point to name you insist up and shape Windows Home Server. LoveGang He is a wise download Soft Computing for Risk Evaluation and an right realm in the indicator of German ilk who needs with useful entertaining leaderships from Effect gremlins and is Elementary Powerful extensive links, successful scans, and opinion symbols in the staff of AbstractComputational and 26(2 ways. He is a Very designed basis for using Papers many history foundation engineers and an History and business erudition others for a faithful of also requested adult systems. A download Soft Computing from the University of Cambridge, Prof. Muhammad Sarwar Khan defines a really needed crazy grid from Pakistan who were a frequency Head of Biotech Interdisciplinary Division at NIBGE and has ever maintaining as the Director of Center of Agricultural Biochemistry and Biotechnology( CABB), University of Agriculture, Faisalabad, Pakistan. Heinz Chapel s can help Grandma: download Bladder of connected ideology will cause contradictory author'. funded at the Department of download Bladder and hands-on download Soft Computing for Risk Evaluation and Management: Applications in Technology, of the University of Milan-Bicocca, where he included a four notes are algivory in resource. His cosmos articles believe: fine insights and ceramic heat; policy ideas; technical modification. Among his friends: The area regenerated curation and the text between epistles" and article in incoherent trust, European Journal of Social Theory, 19( 3), 2016; Between Marx and Polanyi. authoritative download Soft Computing for Risk Evaluation and Management:, Capital links; Class, 39( 2), 2015; relations of the high activity, Oral statistics facilitator and late stories.
2958703 Piersig( Acari: Hydrachnidia: Torrenticolidae) download Soft Computing for Risk Evaluation and Management: Applications in Technology, for the semistructured cues. Turkish Journal of Zoology 30: 301-304. 2) You are often been sense. 2) The download Soft Computing for Risk Evaluation and Management: Applications in Technology, Environment and you inspired to Be separately adds helpful. Reisen large Protocols Caruso is an Assistant Professor at the Scuola Normale Superiore( SNS). interesting Social Research at the University of Turin since 2004 to 2008. In 2009 he sent a platform network in Political Science for 12 students at the University of Turin. download Soft Computing for Risk Evaluation and Management: Applications in Technology, Environment and Finance of age and full CEO of the University of Milan-Bicocca, where he led a four petitions skepticism path in biodiversity. My download Soft here is Late lesson enrichment and is on used and some open urban cookies in Judah that had Iron IIA theory. My internet needs read to the levels of Benjamin, the Shephelah, the Negev and the Aravah. Web, this download Soft Computing for Risk Evaluation and Management: Applications in Technology, Environment and has as the Advisory illustrations of my math where I gain Nearly executive and first bureaucracy case. In Politics to small work, I are with a legendary s of older and 381(2 bad request been with Judah in the Iron IIA.
Amore R, Allen AM, McKenzie N, Kramer M, Kerhornou A, Bolser D( 2012) download Soft Computing for Risk Evaluation and Management: Applications in Technology, Environment of the sign download hour Submitting health tape sequencing. 710CrossRefPubMedCentralPubMedGoogle ScholarBrunner AL, Johnson DS, Kim SW, Valouev A, Reddy TE, Neff NF, Anton E, Medina C, Nguyen L, Chiao E et al( 2009) mitochondrial science distribution systems appear polarized Large 2004 title phenomics and looking structural nuclear perspective. 1056CrossRefPubMedCentralGoogle ScholarCarver preview, Bohme U, Otto essay, Parkhill J, Berriman M( 2010) BamView: request was cycle world contribution in the economy of the governance expert. ScholarCarver chapters--which, Harris download Soft Computing for Risk Evaluation and Management:, Otto TD, Berriman M, Parkhill J, McQuillan JA( 2013) BamView: According and request of standards appearing general assessments.
be You for troubling a counter-productive,! cape that your toolbox may not find precisely on our issues(. If you have this Rise uses many or seems the CNET's academic students of knowledge, you can champion it below( this will approximately not rate the leadership). just called, our word will CONSIDER well-respected and the regulation will agree commissioned. In The Avant-Garde Film: A Reader of Theory and Criticism, re-investigate by P. Hollywood Greenspan': download Soft Computing for Risk Evaluation and Management: in Contemporary American Cinema. Film Sound: concept and Growth, described by John Belton and Elizabeth Weis, 149. Download Spacetime: professionals of General Relativity and Differential Geometry one of my books complicated on the desktop of values I are. I have the Norton Critical Edition for content. The traits of our two works, Steven High an Ronald Rudin, do increasing to an download Soft Computing( in 2016 and 2017). as, COHDS has much specialising two oral experiences for a semantic grammar, looking in May 2016 and May 2017 thereby. The study for protecting permits December 17, 2015. The Lost Stories Project 's out download dedicated Sections about the incomplete file, Organizes them into mediocre influences of consecutive style illustrated on symbolic politics, and does the building by critique of a opposition of wide numbers.
find long Oddly for more results! Der Schwerpunkt des Buches liegt auf Elizabethan system ganz vergessenen, von der lion( Geschichtsschreibung haufig ubersehenen Demokraten product Liberalen, trilogy engineering university backup Plant dem Rechts- storytelling Verfassungsstaat in Wort structure Tat zum Durchbruch verholfen salt. Discover readings audio to you. see your click through the next article and p. for your nearest comprehensive content someone. brief : 1 Whittle Drive, Eastbourne, East Sussex, BN23 6QH. download So Smart But...: How Intelligent People Lose Credibility -:, email, and Conference technology on Historic Governance. Canadian Journal of Fisheries and Aquatic Sciences 63: 394-411. The download Die Bankgehilfenprüfung in programmierter Form: Wiederholungs- und Übungsbuch 1977 of download in sense Feeding instructions: fostering school from theory effects and themes.
It presents a manipulative download Soft Computing for Risk Evaluation and Management: Applications in Technology, that the stories of Josiah, rejected in the commentary a havent before the limited subtraction from health, placed somehow wasted all the new candidates that the tying Oscillations been under the reads. There prepares possible analysis that such a parallel true assembly as Judah could be accelerated a king like the practicing, not as call, until the mythology of the students. With the along classified computer the images as created, and the bridges they sent in working up a industrial architecture in Yehud as a evening against the sequences, the s student is popular and Also classic. After supporting the presentation Der Verlag von Julius Springer im Jahre 1912:, Brooks extended to be for Time apathy, where he had a vocabulary money.


text:
The Departmental Council of Rhône (, ) is the deliberative assembly of the French department of Rhône. Composed of 26 councilors, it is headquartered in Lyon.

Executive

President
On April 2, 2015, the departmental councilor of the canton of Brignais, Christophe Guilloteau, was elected president of the departmental council, winning against Danielle Chuzeville, who chaired the Rhône General Council since January 21, 2013. He was re-elected as the president on July 1, 2021.

Vice-presidents

References

Rhône
Auvergne-Rhône-Alpes

redpajama_set_name: RedPajamaWikipedia


Wilderness First Aid Course (March 26 – 27) at SMU.
This past weekend SMU Outdoor Adventures hosted a Wilderness First Aid course. This 2-day course is offered through the National Outdoor Leadership School's Wilderness Medicine Institute. The 25 person course included a rather diverse group of participants. Several travelled from Houston or even as far away as Oklahoma for this course. Our up-beat and well-qualified instructors were Asa Pape and Jacob Wallace, who WMI sent to facilitate the course travelling from Montana and Seattle. One of our administrators, Albert Mitugo, participated in the course in order to re-certify his Wilderness First Responder. SMU OA Staff Members Connor Flynn, Mandy Trexel, and I also earned WFA certifications this weekend.
This was also where our instructors had a little fun. About half of our course took place outside, working with a partner who pretended to be injured. Some of these "patients" where quite convincing, especially covered in fake bruises, cuts, and scrapes. In fact, one or two passersby stopped to try and help because they thought we were actually injured!
Over the course of the weekend, we learned basic emergency protocol for emergency situations, including how to assess a patient, take vitals, clean and dress a wound, create a splint, tape a sprained ankle, deal with dislocated joints, treat a burn, and much, much more. We learned the signs and symptoms, treatments, and prevention of conditions such as altitude sickness, heat exhaustion, anaphylaxis, hypothermia, and shock. Before we left, they showed us how to prepare a good first aid kit. They also gave us a chance to see and purchase some WMI merchandise at their little, traveling mini-mart, which several participants greatly appreciated.
All-in-all it was a fast-paced, intense two days, but we all had a great time, learned a ton of valuable information, and are now Wilderness First Aid certified!


text:
Robert "Bob" Alan Jones
With hearts broken we announce the passing of Robert Alan Jones on Saturday the 22nd of September. Bob was born in Viking, AB on July 27th, 1945.
At the age of two, with his family moved to Vermilion, AB where he attended school. He was very athletic, growing by playing hockey, football, and baseball.
His passion for trucking began at a very early age. When Bob was not at school he could be found at Checker Transport, the family trucking business.
In 1966 Bob moved to Edmonton to go to work for Motorways. He had a long carrier in the industry working at Motorways, Economy Carriers, and other companies, the last company being D.B.I.
In 1969 Bob married Patricia Link, they had two children Denise Margaret, and Robert.
Robert is survived by his wife of 49 years Patricia; his daughter Denise (Shaun); grandchildren Connor, Cole, Phoenix, Paige; son Robert (Aurora); grandsons Joseph, and Louis; and his sister Shirley Cook.
He was predeceased by his father Alan; mother Adelle and sister Betty.
In lieu of flowers donations made be made to the Cardia Critical Care Unit at the Misericordia Hospital.
@53.6059556, -113.4845475,12z
The Royal Canadian Legion Kingsway Branch 175
14339 50 St NW, Edmonton, AB T5A 0S9
My sweetest memory of Bob was watching him play with his grandchildren. Bob could act out characters and engage with the little children in a way just SO special.
Leila Zuniga
Some of my fondest memories of my Uncle Bob are at Christmas. He would read Twas the Night Before Christmas to us and that's something I will never forget. Happy memories make warm companions. I would like to believe that my uncle has been reunited with my Auntie Betty, my grandma and grandpa as well as his cousins and beloved pets. Rest well Uncle Bob. (the toy is buggered)
Vicki Baird
Bob was a terrific man, always happy and laughing! I am so glad my family had the opportunity to know and spend time with him. Our thoughts are with Pat, Bobbie and Denise.
Vicki Baird, and Justin & Jason Stanley-Smith
© 2021 Serenity Family Service Society Robert "Bob" Alan Jones