text:
/**
    auth module needs the type of authentication ("Basic" or "Digest").
    After the rule to check the password is an authn_<type>_<name>
    sublibrary (just a C file).

    With this solution each server may has its own authentication type.
    After the checking of the password is done by a library linked to the
    mod_auth library.
 */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <pwd.h>
#include <time.h>

#include "ouistiti/httpserver.h"
#include "ouistiti/utils.h"
#include "ouistiti/hash.h"
#include "ouistiti/log.h"
#include "mod_auth.h"
#include "authn_none.h"
#ifdef AUTHN_BASIC
#include "authn_basic.h"
#endif
#ifdef AUTHN_DIGEST
#include "authn_digest.h"
#endif
#ifdef AUTHN_BEARER
#include "authn_bearer.h"
#endif
#ifdef AUTHN_OAUTH2
#include "authn_oauth2.h"
#endif
#include "authz_simple.h"
#include "authz_file.h"
#include "authz_unix.h"
#include "authz_sqlite.h"
#include "authz_jwt.h"

#define auth_dbg(...)

#ifndef RESULT_401
#error mod_auth require RESULT_401
#endif
#ifndef RESULT_403
#error mod_auth require RESULT_403
#endif

#ifdef DEBUG
#warning "debug mode in unsafe"
#endif

typedef struct _mod_auth_s _mod_auth_t;
typedef struct _mod_auth_ctx_s _mod_auth_ctx_t;

static void *_mod_auth_getctx(void *arg, http_client_t *ctl, struct sockaddr *addr, int addrsize);
static void _mod_auth_freectx(void *vctx);
static int _home_connector(void *arg, http_message_t *request, http_message_t *response);
static int _authn_connector(void *arg, http_message_t *request, http_message_t *response);
#ifndef AUTHZ_JWT
static char *authz_generatetoken(const mod_auth_t *mod, const authsession_t *info);
#endif

static const char str_auth[] = "auth";
static const char str_cachecontrol[] = "Cache-Control";

const char str_status_approving[] = "approving";
const char str_status_reapproving[] = "reapproving";
const char str_status_activated[] = "activated";
const char str_status_repudiated[] = "repudiated";

struct _mod_auth_ctx_s
{
	_mod_auth_t *mod;
	http_client_t *ctl;
	char *authenticate;
	authsession_t *info;
	char *authorization;
};

struct _mod_auth_s
{
	mod_auth_t	*config;
	const char *type;
	authn_t *authn;
	authz_t *authz;
	size_t typelength;
};

const char str_authenticate[] = "WWW-Authenticate";
const char str_authorization[] = "Authorization";
const char str_anonymous[] = "anonymous";

static const char str_xtoken[] = "X-Auth-Token";
static const char str_xuser[] = "X-Remote-User";
static const char str_xgroup[] = "X-Remote-Group";
static const char str_xhome[] = "X-Remote-Home";

authn_rules_t *authn_rules[] = {
#ifdef AUTHN_NONE
	&authn_none_rules,
#else
	NULL,
#endif
#ifdef AUTHN_BASIC
	&authn_basic_rules,
#else
	NULL,
#endif
#ifdef AUTHN_DIGEST
	&authn_digest_rules,
#else
	NULL,
#endif
#ifdef AUTHN_BEARER
	&authn_bearer_rules,
#else
	NULL,
#endif
#ifdef AUTHN_OAUTH2
	&authn_oauth2_rules,
#else
	NULL,
#endif
};

authz_rules_t *authz_rules[] = {
	NULL,
#ifdef AUTHZ_SIMPLE
	&authz_simple_rules,
#else
	NULL,
#endif
#ifdef AUTHZ_FILE
	&authz_file_rules,
#else
	NULL,
#endif
#ifdef AUTHZ_UNIX
	&authz_unix_rules,
#else
	NULL,
#endif
#ifdef AUTHZ_SQLITE
	&authz_sqlite_rules,
#else
	NULL,
#endif
#ifdef AUTHZ_JWT
	&authz_jwt_rules,
#else
	NULL,
#endif
};

static const hash_t *_mod_findhash(const char *name, int nameid)
{
	const hash_t *hash_list[] =
	{
		hash_md5,
		hash_sha1,
		hash_sha224,
		hash_sha256,
		hash_sha512,
		hash_macsha256,
		NULL
	};

	static const hash_t *hash = NULL;
	for (int i = 0; i < (sizeof(hash_list) / sizeof(*hash_list)); i++)
	{
		hash = hash_list[i];
		if (hash != NULL &&
			((name != NULL && !strcmp(name, hash->name)) ||
				(nameid == hash->nameid)))
			break;
	}
	return hash;
}

static int _mod_sethash(const _mod_auth_t *mod, const mod_auth_t *config)
{
	int ret = EREJECT;
	if (config->algo)
	{
		mod->authn->hash = _mod_findhash(config->algo, -1);
	}
	if (mod->authn->hash != NULL)
	{
		ret = ESUCCESS;
	}
	else if (mod->authn->hash == NULL && hash_sha256)
	{
		mod->authn->hash = hash_sha256;
		ret = ESUCCESS;
	}

	if (ret == EREJECT)
	{
		warn("auth: bad algorithm %s (%s | %s | %s | %s | %s)",
			config->algo,
			(hash_sha1?hash_sha1->name:""),
			(hash_sha224?hash_sha224->name:""),
			(hash_sha256?hash_sha256->name:""),
			(hash_sha512?hash_sha512->name:""),
			(hash_macsha256?hash_macsha256->name:""));
	}

	return ret;
}

#ifdef FILE_CONFIG
struct _authn_s
{
	void *(*config)(const config_setting_t *);
	authn_type_t type;
	const char *name;
};

struct _authn_s *authn_list[] =
{
#ifdef AUTHN_BASIC
	&(struct _authn_s){
		.config = &authn_basic_config,
		.type = AUTHN_BASIC_E,
		.name = "Basic",
	},
#endif
#ifdef AUTHN_DIGEST
	&(struct _authn_s){
		.config = &authn_digest_config,
		.type = AUTHN_DIGEST_E,
		.name = "Digest",
	},
#endif
#ifdef AUTHN_BEARER
	&(struct _authn_s){
		.config = &authn_bearer_config,
		.type = AUTHN_BEARER_E | AUTHN_REDIRECT_E,
		.name = "Bearer",
	},
#endif
#ifdef AUTHN_OAUTH2
	&(struct _authn_s){
		.config = &authn_oauth2_config,
		.type = AUTHN_OAUTH2_E | AUTHN_REDIRECT_E,
		.name = "oAuth2",
	},
#endif
#ifdef AUTHN_NONE
	&(struct _authn_s){
		.config = &authn_none_config,
		.type = AUTHN_NONE_E,
		.name = "None",
	},
#endif
};

static int authn_config(const config_setting_t *configauth, mod_authn_t *mod)
{
	int ret = EREJECT;

	char *type = NULL;
	config_setting_lookup_string(configauth, "type", (const char **)&type);
	if (type == NULL)
	{
		return ret;
	}

	const struct _authn_s *authn = NULL;
	for (int i = 0; i < (sizeof(authn_list) / sizeof(*authn_list)); i++)
	{
		if (!strcmp(type, authn_list[i]->name))
			mod->config = authn_list[i]->config(configauth);
		if (mod->config != NULL)
		{
			authn = authn_list[i];
			break;
		}
	}

	if (authn != NULL)
	{
		mod->type |= authn->type;
		mod->name = authn->name;
		ret = ESUCCESS;
	}
	return ret;
}

struct _authz_s
{
	void *(*config)(const config_setting_t *);
	authz_type_t type;
	const char *name;
};

struct _authz_s *authz_list[] =
{
#ifdef AUTHZ_UNIX
	&(struct _authz_s){
		.config = &authz_unix_config,
		.type = AUTHZ_UNIX_E,
		.name = "unix",
	},
#endif
#ifdef AUTHZ_FILE
	&(struct _authz_s){
		.config = &authz_file_config,
		.type = AUTHZ_FILE_E,
		.name = "file",
	},
#endif
#ifdef AUTHZ_SQLITE
	&(struct _authz_s){
		.config = &authz_sqlite_config,
		.type = AUTHZ_SQLITE_E,
		.name = "sqlite",
	},
#endif
#ifdef AUTHZ_SIMPLE
	&(struct _authz_s){
		.config = &authz_simple_config,
		.type = AUTHZ_SIMPLE_E,
		.name = "simple",
	},
#endif
#ifdef AUTHZ_JWT
	&(struct _authz_s){
		.config = &authz_jwt_config,
		.type = AUTHZ_JWT_E,
		.name = "jwt",
	},
#endif
};

static void authz_optionscb(void *arg, const char *option)
{
	mod_auth_t *auth = (mod_auth_t *)arg;

	if (utils_searchexp("home", option, NULL) == ESUCCESS)
		auth->authz.type |= AUTHZ_HOME_E;
	if (utils_searchexp("token", option, NULL) == ESUCCESS)
		auth->authz.type |= AUTHZ_TOKEN_E;
	if (utils_searchexp("chown", option, NULL) == ESUCCESS)
		auth->authz.type |= AUTHZ_CHOWN_E;
	if (utils_searchexp("management", option, NULL) == ESUCCESS)
		auth->authz.type |= AUTHZ_MNGT_E;

	if (utils_searchexp("cookie", option, NULL) == ESUCCESS)
		auth->authn.type |= AUTHN_COOKIE_E;
	if (utils_searchexp("header", option, NULL) == ESUCCESS)
		auth->authn.type |= AUTHN_HEADER_E;
	if (utils_searchexp("redirect", option, NULL) == ESUCCESS)
		auth->authn.type |= AUTHN_REDIRECT_E;
}

static int authz_config(const config_setting_t *configauth, mod_authz_t *mod)
{
	int ret = EREJECT;
	const struct _authz_s *authz = NULL;
	for (int i = 0; i < (sizeof(authz_list) / sizeof(*authz_list)); i++)
	{
		if (authz_list[i]->config != NULL)
			mod->config = authz_list[i]->config(configauth);
		if (mod->config != NULL)
		{
			authz = authz_list[i];
			break;
		}
	}
	if (authz != NULL)
	{
		mod->type |= authz->type;
		mod->name = authz->name;
		ret = ESUCCESS;
	}
	return ret;
}

static void *auth_config(config_setting_t *iterator, server_t *server)
{
	mod_auth_t *auth = NULL;
#if LIBCONFIG_VER_MINOR < 5
	const config_setting_t *configauth = config_setting_get_member(iterator, "auth");
#else
	const config_setting_t *configauth = config_setting_lookup(iterator, "auth");
#endif
	if (configauth)
	{
		auth = calloc(1, sizeof(*auth));
		/**
		 * signin URI allowed to access to the signin page
		 */
		config_setting_lookup_string(configauth, "signin", &auth->redirect);
		if (auth->redirect == NULL || auth->redirect[0] == '\0')
			config_setting_lookup_string(configauth, "token_ep", &auth->redirect);
		config_setting_lookup_string(configauth, "protect", &auth->protect);
		config_setting_lookup_string(configauth, "unprotect", &auth->unprotect);
		/**
		 * algorithm allow to change secret algorithm used during authentication default is md5. (see authn_digest.c)
		 */
		config_setting_lookup_string(configauth, "algorithm", &auth->algo);
		/**
		 * secret is the secret used during the token generation. (see authz_jwt.c)
		 */
		config_setting_lookup_string(configauth, "secret", &auth->secret);

		const char *mode = NULL;
		config_setting_lookup_string(configauth, "options", &mode);
		if (ouistiti_issecure(server))
			auth->authz.type |= AUTHZ_TLS_E;
		if (mode != NULL)
		{
			authz_optionscb(auth, mode);
		}
		config_setting_lookup_int(configauth, "expire", &auth->expire);

		int ret;
		ret = authz_config(configauth, &auth->authz);
		if (ret == EREJECT)
		{
			err("config: authz is not set");
		}

		ret = authn_config(configauth, &auth->authn);
		if (ret == EREJECT)
		{
			err("config: authn type is not set");
		}
	}
	return auth;
}
#else
static const mod_auth_t g_auth_config =
{
	.authz = &(mod_authz_t){
		.config = &(authz_sqlite_config_t){
			.dbname = "/etc/ouistiti/auth.db",
		},
		.type = AUTHZ_SQLITE_E,
		.name = "sqlite",
	},
	.authn = &(mod_authn_t){
		.config = &(authn_basic_config_t){
			.realm = NULL,
		},
		.type = AUTHN_BASIC_E,
		.name = "Basic",
	},
};

static void *auth_config(void *iterator, server_t *server)
{
	return (void *)&g_auth_config;
}
#endif

static void *mod_auth_create(http_server_t *server, mod_auth_t *config)
{
	_mod_auth_t *mod;

	srandom(time(NULL));

	if (!config)
		return NULL;

	mod = calloc(1, sizeof(*mod));
	mod->config = config;

	mod->authz = calloc(1, sizeof(*mod->authz));
	mod->authz->type = config->authz.type;
	mod->authz->name = config->authz.name;

	mod->authz->rules = authz_rules[config->authz.type & AUTHZ_TYPE_MASK];
	if (mod->authz->rules == NULL)
	{
		err("authentication storage not set, change configuration");
		free(mod->authz);
		free(mod);
		return NULL;
	}

#ifdef AUTHZ_JWT
	/**
	 * jwt token contains user information
	 * it is useless to "join" the token to the user.
	 */
	mod->authz->generatetoken = authz_generatejwtoken;
#else
	if ((config->authz.type & AUTHZ_TOKEN_E) &&  (authz_rules[config->authz.type & AUTHZ_TYPE_MASK])->join == NULL)
	{
		err("Please use other authz module (sqlite) to enable token");
		config->authz.type &= ~AUTHZ_TOKEN_E;
	}
	else
		mod->authz->generatetoken = authz_generatetoken;
#endif

	mod->authz->ctx = mod->authz->rules->create(server, config->authz.config);
	if (mod->authz->ctx == NULL)
	{
		free(mod->authz);
		free(mod);
		return NULL;
	}

	mod->authn = calloc(1, sizeof(*mod->authn));
	mod->authn->config = config;
	mod->authn->server = server;
	mod->authn->type = config->authn.type;
	mod->authn->rules = authn_rules[config->authn.type & AUTHN_TYPE_MASK];

	_mod_sethash(mod, config);

	if (mod->authn->rules == NULL)
		err("authentication type is not availlable, change configuration");
	else
	{
		mod->authn->ctx = mod->authn->rules->create(mod->authn, mod->authz, config->authn.config);
	}
	if (mod->authn->ctx)
	{
		mod->type = config->authn.name;
		mod->typelength = strlen(mod->type);
		httpserver_addmod(server, _mod_auth_getctx, _mod_auth_freectx, mod, str_auth);
		if (mod != NULL && (config->authz.type & AUTHZ_TOKEN_E) &&
			(mod->authn->config->secret == NULL || strlen(mod->authn->config->secret) == 0))
		{
			err("auth: to enable the token, set the \"secret\" into configuration");
		}
	}
	else
	{
		if (mod->authz->rules->destroy)
			mod->authz->rules->destroy(mod->authz->ctx);
		free(mod->authz);
		free(mod->authn);
		free(mod);
		mod = NULL;
	}

	return mod;
}

static void mod_auth_destroy(void *arg)
{
	_mod_auth_t *mod = (_mod_auth_t *)arg;
	if (mod->authn->ctx  && mod->authn->rules->destroy)
	{
		mod->authn->rules->destroy(mod->authn->ctx);
	}
	if (mod->authz->ctx && mod->authz->rules->destroy)
	{
		mod->authz->rules->destroy(mod->authz->ctx);
	}
	free(mod->authn);
	free(mod->authz);
#ifdef FILE_CONFIG
	free(mod->config);
#endif
	free(mod);
}

static void *_mod_auth_getctx(void *arg, http_client_t *ctl, struct sockaddr *addr, int addrsize)
{
	_mod_auth_ctx_t *ctx = calloc(1, sizeof(*ctx));
	_mod_auth_t *mod = (_mod_auth_t *)arg;

	ctx->mod = mod;
	ctx->ctl = ctl;

	if (mod->authz->type & AUTHZ_HOME_E)
		httpclient_addconnector(ctl, _home_connector, ctx, CONNECTOR_AUTH, str_auth);
	httpclient_addconnector(ctl, _authn_connector, ctx, CONNECTOR_AUTH, str_auth);
	/**
	 * authn may require prioritary connector and it has to be added after this one
	 */
	if(mod->authn->rules->setup)
		mod->authn->rules->setup(mod->authn->ctx, ctl, addr, addrsize);

	return ctx;
}

static void _mod_auth_freectx(void *vctx)
{
	_mod_auth_ctx_t *ctx = (_mod_auth_ctx_t *)vctx;

	if (ctx->info)
	{
		free(ctx->info);
		if (ctx->authorization)
			free(ctx->authorization);
	}
	free(ctx->authenticate);
	free(ctx);
}

static int _home_connector(void *UNUSED(arg), http_message_t *request, http_message_t *response)
{
	int ret = EREJECT;
	const authsession_t *info = httpmessage_SESSION(request, str_auth, NULL, 0);

	if (info && info->home)
	{
		const char *home = info->home;
		/**
		 * disable home redirection for websocket
		 */
		const char *websocket = httpmessage_REQUEST(request, "Sec-WebSocket-Version");
		if (websocket && websocket[0] != '\0')
			return ret;
		const char *uri = httpmessage_REQUEST(request, "uri");
		size_t homelength = strlen(home);
		if ((homelength > 0) &&
			(strncmp(home + 1, uri, homelength - 1) != 0))
		{
			dbg("redirect the url to home %s", home);
#if defined(RESULT_301)
			httpmessage_addheader(response, str_location, home);
			httpmessage_appendheader(response, str_location, "/", NULL);
			httpmessage_result(response, RESULT_301);
			ret = ESUCCESS;
#endif
		}
	}
	return ret;
}

static int _authz_computepasswd(const hash_t *hash, const char *user, const char *realm, const char *passwd,
			char *string, int stringlen)
{
	char hashpasswd[32];
	void *ctx;

	ctx = hash->init();
	if (realm)
	{
		hash->update(ctx, user, strlen(user));
		hash->update(ctx, ":", 1);
		hash->update(ctx, realm, strlen(realm));
		hash->update(ctx, ":", 1);
	}
	hash->update(ctx, passwd, strlen(passwd));
	hash->finish(ctx, hashpasswd);

	base64->encode(hashpasswd, hash->size, string, stringlen);
	return 0;
}

int authz_checkpasswd(const char *checkpasswd, const char *user, const char *realm, const char *passwd)
{
	int ret = EREJECT;
	auth_dbg("auth: check %s %s", passwd, checkpasswd);
	if (checkpasswd[0] == '$')
	{
		const hash_t *hash = NULL;
		char hashtype = checkpasswd[1];
		if (checkpasswd[1] == 'a')
		{
			hashtype = checkpasswd[2];
		}
		const char *checkrealm = NULL;
		int realmlength = 0;
		/**
		 * If the realm is linked to the password,
		 * it must be the same as the requested realm.
		 * If no realm is available with the password,
		 * we check directly the password
		 */
		checkrealm = strstr(checkpasswd, "realm=");
		if (checkrealm)
		{
			checkrealm += 6;
			realmlength = strpbrk(checkrealm, ";$") - checkrealm - 1;
			if (strncmp(checkrealm, realm, realmlength))
				return ret;
		}
		else
			realm = NULL;

		hash = _mod_findhash(NULL, hashtype);

		checkpasswd = strrchr(checkpasswd + 1, '$');
		if (checkpasswd)
			checkpasswd++;
		if (hash && checkpasswd)
		{
			char b64passwd[50];
			_authz_computepasswd(hash, user, realm, passwd, b64passwd, sizeof(b64passwd));

			auth_dbg("auth: check %s %s", b64passwd, checkpasswd);
			if (!strcmp(b64passwd, checkpasswd))
				ret = ESUCCESS;
		}
		else
			err("auth: %.3s not supported change password encryption", checkpasswd);
	}
	else if (!strcmp(passwd, checkpasswd))
	{
		ret = ESUCCESS;
	}
	return ret;
}

#ifndef AUTHZ_JWT
static char *authz_generatetoken(const mod_auth_t *config, const authsession_t *UNUSED(info))
{
	int tokenlen = (((24 + 1 + sizeof(time_t)) * 1.5) + 1) + 1;
	char *token = calloc(1, tokenlen);
	char _nonce[(24 + 1 + sizeof(time_t))];
	int i;
	for (i = 0; i < (24 / sizeof(int)); i++)
	{
		*(int *)(_nonce + i * 4) = random();
	}
	_nonce[24] = '.';
	time_t expire = (config->expire * 60);
	if (expire == 0)
		expire = 60 * 30;
	expire += time(NULL);
	memcpy(&_nonce[25], &expire, sizeof(time_t));
	base64_urlencoding->encode(_nonce, 24, token, tokenlen);
	return token;
}
#endif

#ifdef AUTH_TOKEN
static const char *_authn_gettoken(const _mod_auth_ctx_t *ctx, http_message_t *request)
{
	const _mod_auth_t *mod = ctx->mod;
	const char *authorization = NULL;
	/**
	 * The authorization may be accepted and replaced by a token.
	 * This token is available inside the cookie.
	 */
	if (mod->authn->type & AUTHN_HEADER_E)
	{
		authorization = httpmessage_REQUEST(request, str_xtoken);
		if (authorization != NULL && authorization[0] != '\0')
		{
			auth_dbg("token from headers");
			return authorization;
		}
	}

	authorization = cookie_get(request, str_xtoken);
	if (authorization != NULL && authorization[0] != '\0')
	{
		auth_dbg("token from cookie");
		return authorization;
	}
	return NULL;
}

int authn_checksignature(const char *key,
		const char *data, size_t datalen,
		const char *sign, size_t signlen)
{
	if (hash_macsha256 != NULL && key != NULL)
	{
		void *ctx = hash_macsha256->initkey(key, strlen(key));
		if (ctx)
		{
			hash_macsha256->update(ctx, data, datalen);
			char signature[HASH_MAX_SIZE];
			size_t len = hash_macsha256->finish(ctx, signature);
			if (signlen < len)
			{
				err("auth: signature buffer too small");
				len = signlen / 3 * 2;
			}
			char b64signature[(int)(HASH_MAX_SIZE * 1.5) + 1];
			base64_urlencoding->encode(signature, len, b64signature, sizeof(b64signature));
			auth_dbg("auth: signature %s", b64signature);
			if (!strncmp(b64signature, sign, signlen))
				return ESUCCESS;
		}
	}
	return EREJECT;
}

int authn_checktoken(_mod_auth_ctx_t *ctx, const char *token)
{
	int ret = ECONTINUE;
	_mod_auth_t *mod = ctx->mod;

	const char *user = NULL;
	const char *data = token;
	const char *sign = strrchr(token, '.');
	if (sign != NULL)
	{
		size_t signlen = 0;
		const char *end = strchr(sign, ';');
		if (end != NULL)
			signlen = end - sign - 1;
		else
			signlen = strlen(sign);
		size_t datalen = sign - data;
		sign++;
		if (authn_checksignature(mod->authn->config->secret, data, datalen, sign, signlen) == ESUCCESS)
		{
			ctx->info = calloc(1, sizeof(*ctx->info));
			strncpy(ctx->info->type, str_xtoken, FIELD_MAX);
			if (user == NULL)
				user = mod->authz->rules->check(mod->authz->ctx, NULL, NULL, token);
			if (user == NULL)
			{
				user = str_anonymous;
			}

#ifdef AUTHZ_JWT
			if (jwt_decode(token, ctx->info) == ESUCCESS)
			{
				auth_dbg("auth: jwt user %s", ctx->info->user);
				ret = EREJECT;
			}
			else
#endif
			if (user != NULL)
			{
				mod->authz->rules->setsession(mod->authz->ctx, user, ctx->info);
#ifndef DEBUG
				time_t now = time(NULL);
				if (mod->config->expire > 0 &&
					ctx->info->expires > now &&
					(ctx->info->expires + mod->config->expire) < now)
					ret = EREJECT;
#else
				ret = EREJECT;
#endif
			}

			if (ctx->info->token[0] == '\0')
			{
				strncpy(ctx->info->token, sign, TOKEN_MAX);
			}
		}
		else
		{
			warn("auth: token with bad signature");
		}
	}
	return ret;
}

int authn_checktokens(_mod_auth_ctx_t *ctx, const char *token)
{
	int ret = ECONTINUE;
	_mod_auth_t *mod = ctx->mod;
	const char *string = token;
	do
	{
		if (!strncmp(string, str_xtoken, sizeof(str_xtoken) - 1))
		{
			string += sizeof(str_xtoken) - 1 + 1; // +1 for the tailing '='
		}
		ret = authn_checktoken(ctx, string);
		string = strstr(string, str_xtoken);
	} while ((ret == ECONTINUE) && (string != NULL));
	return ret;
}
#endif

static const char *_authn_getauthorization(const _mod_auth_ctx_t *ctx, http_message_t *request)
{
	const _mod_auth_t *mod = ctx->mod;
	const char *authorization = NULL;
	/**
	 * with standard authentication, the authorization code
	 * is sended info header
	 */
	if (authorization == NULL || authorization[0] == '\0')
	{
		authorization = httpmessage_REQUEST(request, str_authorization);
	}
	/**
	 * to send the authorization header only once, the "cookie"
	 * option of the server store the authorization inside cookie.
	 * This method allow to use little client which manage only cookie.
	 */
	if (authorization == NULL || authorization[0] == '\0')
	{
		authorization = cookie_get(request, str_authorization);
		warn("auth: cookie get %s %p",str_authorization, authorization);
	}

	if (authorization != NULL && strncmp(authorization, mod->type, mod->typelength))
	{
		err("auth: type mismatch %.*s, %.*s", (int)mod->typelength, authorization, (int)mod->typelength, mod->type);
		authorization = NULL;
	}
	return authorization;
}

static int _authn_setauthorization_cookie(const _mod_auth_ctx_t *ctx,
			const char *authorization, const authsession_t *info,
			http_message_t *response)
{
#ifdef AUTH_TOKEN
	_mod_auth_t *mod = ctx->mod;

	if (mod->authz->type & AUTHZ_TOKEN_E)
	{
		char *token = mod->authz->generatetoken(mod->config, info);
		const char *key = ctx->mod->config->secret;
		if (hash_macsha256 != NULL && key != NULL)
		{
			void *hctx = hash_macsha256->initkey(key, strlen(key));
			if (hctx)
			{
				hash_macsha256->update(hctx, token, strlen(token));
				char signature[HASH_MAX_SIZE];
				int signlen = hash_macsha256->finish(hctx, signature);
				char b64signature[(int)(HASH_MAX_SIZE * 1.5) + 1];
				base64_urlencoding->encode(signature, signlen, b64signature, sizeof(b64signature));
				cookie_set(response, str_xtoken, token, ".", b64signature, NULL);
				if (mod->authz->rules->join)
					mod->authz->rules->join(mod->authz->ctx, info->user, b64signature, mod->config->expire);
			}
		}
		else if (mod->authz->rules->join)
			mod->authz->rules->join(mod->authz->ctx, info->user, token, mod->config->expire);
		free(token);
	}
	else
#endif
	if (authorization != NULL)
	{
		cookie_set(response, str_authorization, authorization, NULL);
	}
	cookie_set(response, str_xuser, info->user, NULL);
	if (info->group[0] != '\0')
		cookie_set(response, str_xgroup, info->group, NULL);
	if (info->home[0] != '\0')
		cookie_set(response, str_xhome, "~/", NULL);
	return ESUCCESS;
}

static int _authn_setauthorization_header(const _mod_auth_ctx_t *ctx,
			const char *authorization, const authsession_t *info,
			http_message_t *response)
{
#ifdef AUTH_TOKEN
	_mod_auth_t *mod = ctx->mod;

	if (mod->authz->type & AUTHZ_TOKEN_E)
	{
		char *token = mod->authz->generatetoken(mod->config, info);
		httpmessage_addheader(response, str_xtoken, token);
		const char *key = ctx->mod->config->secret;
		if (hash_macsha256 != NULL && key != NULL)
		{
			void *hctx = hash_macsha256->initkey(key, strlen(key));
			if (hctx)
			{
				hash_macsha256->update(hctx, token, strlen(token));
				char signature[HASH_MAX_SIZE];
				int signlen = hash_macsha256->finish(hctx, signature);
				char b64signature[(int)(HASH_MAX_SIZE * 1.5) + 1];
				base64_urlencoding->encode(signature, signlen, b64signature, sizeof(b64signature));
				httpmessage_appendheader(response, str_xtoken, ".", b64signature, NULL);
				if (mod->authz->rules->join)
					mod->authz->rules->join(mod->authz->ctx, info->user, b64signature, mod->config->expire);
			}
		}
		else if (mod->authz->rules->join)
			mod->authz->rules->join(mod->authz->ctx, info->user, token, mod->config->expire);
		free(token);
		httpmessage_addheader(response, "Access-Control-Expose-Headers", str_xtoken);
	}
	else
#endif
	if (authorization != NULL)
	{
		httpmessage_addheader(response, str_authorization, authorization);
	}
	httpmessage_addheader(response, str_xuser, info->user);
	httpmessage_addheader(response, "Access-Control-Expose-Headers", str_xuser);
	if (info->group[0] != '\0')
	{
		httpmessage_addheader(response, str_xgroup, info->group);
		httpmessage_addheader(response, "Access-Control-Expose-Headers", str_xgroup);
	}
	if (info->home[0] != '\0')
	{
		httpmessage_addheader(response, str_xhome, "~/");
	}
	return ESUCCESS;
}

static int _authn_checkauthorization(_mod_auth_ctx_t *ctx,
		const char *authorization, http_message_t *request)
{
	int ret = ECONTINUE;
	_mod_auth_t *mod = ctx->mod;
	const mod_auth_t *config = mod->config;
	const char *authentication = strchr(authorization, ' ');
	const char *method = httpmessage_REQUEST(request, "method");
	const char *uri = httpmessage_REQUEST(request, "uri");

	if (authentication)
		authentication++;
	else
		authentication = authorization;
	/**
	 * The current authentication is made by the client (the browser).
	 * In this case the client compute the autorization for each file to download.
	 * With redirection to the login page, all files should contain the code
	 * to compute the autorizarion. But it is impossible to do it. Then
	 * only the method HEAD is used to login and the client must send
	 * same autorization for all files to download.
	 * WARNING: It is incorrect to use this method for security.
	 * The authorization is always acceptable and it is dangerous.
	 */
	if (config->redirect)
		method = str_head;
	const char *user = mod->authn->rules->check(mod->authn->ctx, method, uri, authentication);
	if (user != NULL)
	{
		if (ctx->info == NULL)
		{
			ctx->info = calloc(1, sizeof(*ctx->info));
			ctx->info->expires = mod->config->expire * 60;
			ctx->info->expires += time(NULL);
			mod->authz->rules->setsession(mod->authz->ctx, user, ctx->info);
			strncpy(ctx->info->type, mod->type, FIELD_MAX);
			ctx->authorization = strdup(authorization);
		}

		if (!strcmp(ctx->info->status, str_status_reapproving) && mod->authz->type & AUTHZ_MNGT_E)
		{
			warn("auth: user \"%s\" accepted from %p to change password", ctx->info->user, ctx->ctl);
			ret = EREJECT;
		}
		else if (strcmp(ctx->info->status, str_status_activated) != 0)
		{
			err("auth: user \"%s\" is not yet activated (%s)", ctx->info->user, ctx->info->status);
		}
		else
		{
			warn("auth: user \"%s\" accepted from %p", ctx->info->user, ctx->ctl);
			ret = EREJECT;
		}
	}
	return ret;
}

static int auth_redirect_uri(_mod_auth_ctx_t *ctx, http_message_t *request, http_message_t *response)
{
	int ret = ESUCCESS;
	const _mod_auth_t *mod = ctx->mod;
	const mod_auth_t *config = mod->config;

	httpmessage_addheader(response, str_location, config->redirect);

	const char *uri = httpmessage_REQUEST(request, "uri");
	const char *query = httpmessage_REQUEST(request, "query");
	if (utils_searchexp(query, "noredirect", NULL) != ESUCCESS &&
			utils_searchexp(uri, config->protect, NULL) != ESUCCESS)
	{
		http_server_t *server = httpclient_server(httpmessage_client(request));
		const char *scheme = httpserver_INFO(server, "scheme");
		const char *host = httpserver_INFO(server, "host");
		if (host == NULL)
		{
			host = httpmessage_SERVER(request, "addr");
		}
		const char *port = httpserver_INFO(server, "port");
		const char *portseparator = "";
		if (port[0] != '\0')
			portseparator = ":";
		const char *query = httpmessage_REQUEST(request, "query");
		const char *queryseparator = "";
		if (query[0] != '\0')
			queryseparator = "?";
		httpmessage_appendheader(response, str_location, "?redirect_uri=",
			scheme, "://", host, portseparator, port, uri, queryseparator, query, NULL);
	}

	httpmessage_addheader(response, str_cachecontrol, "no-cache");

	httpmessage_result(response, RESULT_302);
	ret = ESUCCESS;

	return ret;
}

static int _authn_challenge(_mod_auth_ctx_t *ctx, http_message_t *request, http_message_t *response)
{
	int ret = ECONTINUE;
	const _mod_auth_t *mod = ctx->mod;
	const mod_auth_t *config = mod->config;
	const char *uri = httpmessage_REQUEST(request, "uri");

	ret = mod->authn->rules->challenge(mod->authn->ctx, request, response);
	if (ret == ECONTINUE)
	{
		if (mod->authn->type & AUTHN_COOKIE_E)
			cookie_set(response, "X-Auth-Token", "", ";Max-Age=0", NULL);

		ret = ESUCCESS;
		auth_dbg("auth challenge failed");
		const char *X_Requested_With = httpmessage_REQUEST(request, "X-Requested-With");
		if (X_Requested_With && strstr(X_Requested_With, "XMLHttpRequest") != NULL)
		{
			httpmessage_result(response, RESULT_403);
		}
		else if (config->redirect)
		{
			int protect = 1;
			/**
			 * check the url redirection
			 */
			const char *redirect = strstr(config->redirect, "://");
			if (redirect != NULL)
			{
				redirect += 3;
				redirect = strchr(redirect, '/');
			}
			else
				redirect = config->redirect;
			if (redirect[0] == '/')
				redirect++;
			protect = utils_searchexp(uri, redirect, NULL);
			if (protect == ESUCCESS)
			{
				/**
				 * the request URI is the URL of the redirection
				 * the authentication has to accept (this module
				 * reject to manage the request and another module
				 * should send response to the request0.
				 */
				httpmessage_result(response, RESULT_200);
				ret = EREJECT;
			}
			else if (config->authn.type & AUTHN_REDIRECT_E)
			{
				ret = auth_redirect_uri(ctx, request, response);
			}
			else
			{
				httpmessage_addheader(response, str_location, config->redirect);
				httpmessage_addheader(response, str_cachecontrol, "no-cache");
				httpmessage_result(response, RESULT_302);
				ret = ESUCCESS;
			}
		}
		else
		{
			httpmessage_result(response, RESULT_401);
		}
	}
	return ret;
}

static int _authn_checkuri(const mod_auth_t *config, http_message_t *request, http_message_t *response)
{
	const char *uri = httpmessage_REQUEST(request, "uri");
	int ret = ECONTINUE;
	int protect = 1;

	/**
	 * check uri
	 */
	protect = utils_searchexp(uri, config->unprotect, NULL);
	if (protect == ESUCCESS)
	{
		auth_dbg("unprotected uri %s", config->unprotect);
		ret = EREJECT;
	}
	protect = utils_searchexp(uri, config->protect, NULL);
	if (protect == ESUCCESS)
	{
		auth_dbg("protected uri %s", config->protect);
		httpmessage_result(response, RESULT_403);
		ret = ESUCCESS;
	}
	return ret;
}

static int _authn_connector(void *arg, http_message_t *request, http_message_t *response)
{
	int ret = ECONTINUE;
	_mod_auth_ctx_t *ctx = (_mod_auth_ctx_t *)arg;
	const _mod_auth_t *mod = ctx->mod;
	mod_auth_t *config = mod->config;
	const char *authorization = NULL;

	/**
	 * authz may need setup the user setting for each message
	 **/
	if(mod->authz->rules->setup)
		mod->authz->rules->setup(mod->authz->ctx);

	ret = _authn_checkuri(config, request, response);
	auth_dbg("auth: checkuri %d", ret);
#if 0
	/**
	 * If ctx->info is set, this connection has been already authenticated.
	 * It should be useless to authenticate again, but if another connection
	 * try to unauthenticate, this may break the security.
	 */
	if (ret == ECONTINUE && ctx->info != NULL)
	{
		ret = EREJECT;
	}
#endif

	/**
	 * The header WWW-Authenticate inside the request
	 * allows to disconnect the user.
	 */
	authorization = httpmessage_REQUEST(request, str_authenticate);
	if (ret == ECONTINUE && authorization != NULL && authorization[0] != '\0')
	{
		ret = ESUCCESS;
	}
	auth_dbg("auth: authenticate %d", ret);

#ifdef AUTH_TOKEN
	if (ret == ECONTINUE && mod->authz->type & AUTHZ_TOKEN_E)
	{
		authorization = _authn_gettoken(ctx, request);
		auth_dbg("auth: gettoken %d", ret);
		if (mod->authn->ctx && authorization != NULL && authorization[0] != '\0')
		{
			ret = authn_checktokens( ctx, authorization);
		}
	}
#endif
	authorization = _authn_getauthorization(ctx, request);
	auth_dbg("auth: getauthorization %d", ret);
	if (ret != ESUCCESS && mod->authn->ctx && authorization != NULL && authorization[0] != '\0')
	{
		ret = _authn_checkauthorization( ctx, authorization, request);
	}
	auth_dbg("auth: checkauthorization %d", ret);

	if (ret != EREJECT)
	{
		if (ctx->info != NULL)
		{
			free(ctx->info);
			ctx->info = NULL;
		}
		httpmessage_SESSION(request, str_auth, "", 0);
		ret = _authn_challenge(ctx, request, response);
	}
	else
	{
		httpmessage_SESSION(request, str_auth, ctx->info, sizeof(*ctx->info));
		if (ctx->info && mod->authn->type & AUTHN_HEADER_E)
		{
			_authn_setauthorization_header(ctx,
					authorization, ctx->info,
					response);
		}
		else if (ctx->info && mod->authn->type & AUTHN_COOKIE_E)
		{
			_authn_setauthorization_cookie(ctx,
					authorization, ctx->info,
					response);
		}

		if (ctx->info && mod->authz->type & AUTHZ_CHOWN_E)
		{
			auth_setowner(ctx->info->user);
		}
	}
	/**
	 * As the setup, the authz may need to cleanup between each message
	 **/
	if (mod->authz->ctx  && mod->authz->rules->cleanup)
	{
		mod->authz->rules->cleanup(mod->authz->ctx);
	}
	return ret;
}

const module_t mod_auth =
{
	.name = str_auth,
	.configure = (module_configure_t)&auth_config,
	.create = (module_create_t)&mod_auth_create,
	.destroy = &mod_auth_destroy
};

#ifdef MODULES
extern module_t mod_info __attribute__ ((weak, alias ("mod_auth")));
#endif

redpajama_set_name: RedPajamaGithub


text:
Unikowice  () is a village in the administrative district of Gmina Paczków, within Nysa County, Opole Voivodeship, in south-western Poland, close to the Czech border. It lies approximately  south-east of Paczków,  west of Nysa, and  west of the regional capital Opole.

Typical for the region, the German name of the village derives from the name of the Lokator who brought German farmers to the village which was a typical Waldhufendorf.

The village has a population of 360.

References

Unikowice

redpajama_set_name: RedPajamaWikipedia


text:
Ferdinand Münz (1888-1969) was an Austrian chemist who first synthesized EDTA (ethylenediaminetetraacetic acid) at the IG Farben in 1935, patented both in Germany (anonymously) and in the USA  (with his name), with the aim of producing a citric acid substitute, in order to reduce the German government's dependence on imports of chemical products from abroad. Münz noted that an aminocarboxylic acid worked much better as a chelating agent than citric acid and therefore thought that a polyaminopolycarboxylic acid would have worked even better.

In 1945 he worked closely with the future Nobel laureate Kurt Alder (1902-1958). In 1949 they published a paper together on diene synthesis and additions.

See also
 EDTA

References

1888 births
1969 deaths
20th-century German chemists
20th-century Austrian chemists
Scientists from Frankfurt
University of Vienna alumni


Another cast member has been announced for the live-action Dora the Explorer movie with Madeleine Madden (Picnic and Hanging Rock). Madden's role has not been revealed, and I honestly have no idea who she could be. Maybe Backpack? I'll be honest, I'm still surprised that this movie is being made.
Madden is joining Isabela Moner, Eugenio Derbesz, Micke Moreno, and Adriana Barraza. Danielle Sanchez-Witzel and Nicholas Stoller are writing the script that James Bobin will use to direct the film. Michael Bay is also producing.
Dora the Explorer currently has a release date of August 2, 2019.


We're offering an Intro to Bridges lunch on Sun., Apr. 12, 12:15 to 2:00PM in Pastor Dave's office. If you're considering membership at BCC, or would like to know more about our ministries, please join us. RSVP via evelyn.sigg@connectbcc.org.


text:
Nightexpress é uma empresa da Alemanha que fora fundada em 1984. A empresa está localizada em Frankfurt, na Alemanha.

Empresas aéreas da Alemanha


text:
2017-08-04 · Engines & Components
Agritechnica: MAN Engines Presenting Global Innovations for Agricultural Machinery and Cogeneration
Newly developed 9 L class diesel engine for tractors and harvesters; new gas engine based on E32 bridges performance gap in cogeneration engines
MAN Engines will be presenting a diesel engine with nine-litre displacement for agricultural applications for the first time.
At Agritechnica 2017 – the largest agricultural equipment trade fair in the world hosted in Hanover, Germany – MAN Engines will be presenting a diesel engine with nine-litre displacement to the international public for the first time. From the outset, the straight-six engine was designed and constructed as a completely new conception, especially for off-road uses. This allows the latest unit in MAN Engines' portfolio to close a gap in performance between the existing D08 and D26 engine series. Conventional applications for the 9 L unit are agricultural, such as in tractors or harvesters.
For the first time, MAN Engines is also exhibiting an E32 series-based gas engine with 450 kWmech. The twelve-cylinder gas engine achieves this performance level in 50 Hz operation at 1,500 rpm, as well as in the 60 Hz variant at 1,800 rpm. The E3262 LE2x2 is designed for operation with biogas or special gases. The possible applications also include the very wide field of cogeneration for the industrial, commercial, municipal and leisure sectors. This also sees MAN Engines bridge a gap in the existing range of gas engines. At the same time, customers will receive a modern unit with improved efficiency levels.
Both new products can be viewed at Agritechnica between 12 and 18 November at the exhibition centre in Hanover at the MAN Truck & Bus booth (C45 in Hall 16).
Florian Schaffelhofer
Vogelweiherstr. 33
E-mail: florian.schaffelhofer@man.eu

redpajama_set_name: RedPajamaCommonCrawl


The examiner pronates his hand and links his fingers with that of the patient's fingers.
Normally, the thumb extends, though the terminal phalanx may flex slightly.
In the presence of pyramidal lesion the thumb adducts and flexes strongly.


Did you know that kitchen remodel projects can have up to a 80 percent return on investment? That's right, our home remodel services are conducted to improve the value of your home. We can help! Call to schedule an appointment today. Estimates are free.
We have over 25 years experience designing, manufacturing, finishing and installing cabinetry.


text:
Fear Factory's Dino Cazares: Bullet Hits Car Windshield, Police Investigating
Joe DiVita Published: January 22, 2021
Gary Wolstenholme, Getty Images
A bullet has struck the windshield of Fear Factory guitarist Dino Cazares' car in Los Angeles, prompting an investigation by the Los Angeles Police Department.
Yesterday (Jan. 21), Cazares uploaded two photos to Twitter. One was of the shattered windshield on his car, where a bullet had struck and became lodged in the broken glass. In the second photo, an outstretched hand in a black latex glove is seen holding the bullet in question.
Cazares, who recently resurrected Fear Factory after a drawn-out legal battle over rights to the name, was asked by police if he had any known enemies, to which he replied, "Yes," and proceeded to name three individuals, though he did not mention any of them by name in the post.
"LAPD said it looks like a 45 caliber, it's a big bullet," wrote the guitarist.
One fan on Twitter questioned why a bullet of this size was not capable of breaking entirely through the windshield. Clarifying the image seen above where the bullet is seen protruding from the car's protective glass front, Cazares explained, "The bar that holds the dash and windshield stopped the bullet from going in."
Fear Factory are expected to release their first new album since 2015's Genexus this year, which Cazares announced on social media back in September. He's since started a crowdfunding campaign for financial support for "newly incurred production costs" for the album, which spurred singer Burton C. Bell to distance himself from the move, saying he had no involvement in it.
Not long after, Bell officially quit Fear Factory and professed he would continue making new music with Ascension of the Watchers.
70 Best Rock + Metal Albums of 2020
Source: Fear Factory's Dino Cazares: Bullet Hits Car Windshield, Police Investigating
Filed Under: Dino Cazares, Fear Factory


I love painting from life. It gets me out of my studio, enjoying new environments, and challenges me to paint differently than I do on my studio pieces. Often, when painting from life, I am much more direct and aggressive because I am in time constraints.
Just getting started after the first 20 min.
I joined CAW studio in Sacramento yesterday. It was inspiring to be around other working artist using different mediums; among them a pastel and watercolor artists. The model sat for three hours, taking breaks every 20 minutes. This process is great because it allows me to step back from the piece every 20 minutes and evaluate my next step. I also learned from those around me watching other artists use different approaches, techniques and styles, to create their work.
I love the atmosphere of live painting sessions. It was easy to get into a groove with the soft jazz playing in the background, a beautiful model and bright colored flowers surrounding her. During this session I worked on color tones and brush quality leaving some edges more expressive and soft.
I titled this piece "Life of Spring," which is symbolic for all of us - new life, new beginning, the cold of winter slips away and incandescent beauty comes and replaces the bleakness. Spring is a promise of Hope and Peace that resurrects each year.
Life of Spring, Oil on Canvas Board, 14x11. This Alla Prima piece is for sale. Please contact me directly for inquiries.


text:
package cn.oftenporter.porter.core.annotation.deal;

/**
 * @author Created by https://github.com/CLovinr on 2016/9/27.
 */
public final class _UnNece
{
    String value;

    public String getValue()
    {
        return value;
    }
}


text:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.pronoia.camel</groupId>
    <artifactId>blueprint-sample</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <name>An OSGi Service Consumer Testing Sample</name>

    <modules>
        <module>service-interface</module>
        <module>service-one</module>
        <module>service-two</module>
        <module>camel-consumer</module>
        <module>blueprint-consumer</module>
        <module>scr-consumer</module>
        <!--
        <module>itest</module>
        -->
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <camel-version>2.18-SNAPSHOT</camel-version>
        <slf4j-version>1.7.13</slf4j-version>
        <activemq-version>5.13.3</activemq-version>
        <activemq-junit-version>5.13.3</activemq-junit-version>
    </properties>

    <dependencies>
        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-version}</version>
        </dependency>

        <!-- Test Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j-version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Test Logging
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j-version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        -->

    </dependencies>

    <build>
        <defaultGoal>install</defaultGoal>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <archive>
                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.19.1</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8.2</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.5.1</version>
            </plugin>

            <plugin>
                <groupId>biz.aQute.bnd</groupId>
                <artifactId>bnd-maven-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>bnd-process</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>


We will guide your building project through the process below, ensuring it is inspiring and enjoyable. We offer a uniquely bespoke service focusing on residential projects solely for individual clients. This has allowed us to develop a client-led practice philosophy dedicated to achieving design excellence down to the smallest detail.
Although we offer a full service we can also work with your specific requirements.
We will visit the site and draw on our experience to advise you on the best way forward for your project. Following this we will write to you setting out our terms of appointment.
After a measured site survey, we will work with you to develop a detailed initial brief. From this initial brief, our creative team will prepare concept design proposals, testing and developing the brief, whilst presenting a concept for the overall look and feel of the space. This will include materials/finishes and general aesthetic through precedent boards and 3D images/visualisations.
These options and proposals will lead discussion as we develop the design and firm up the brief with you, either for progression into planning or for pricing.
Once we have gained planning permission, we will begin the tender process. This is the stage where detailed design takes place and we will produce a full tender package to be priced by Contractors. This package will include a full specification of all materials to be used and throughout the process we will assist you as much as you require in choosing finishes, by preparing developed mood boards, 3D images and obtaining samples. We will use our experience of products and suppliers to advise where necessary. In addition to this we also offer a separate service where we can source fabrics, curtains, carpets and free-standing furniture.
Typically during tender, at least 3 Contractors will price the building works, which ensures competitive pricing and value for money. We have built up a wide network of professional Contractors and consultants and will advise on their assistance where necessary. Once a Contractor has been chosen we will prepare an industry-standard building contract. This will form the legal basis of your agreement with the Contractor and will ensure the obligations of both parties are met - in particular that the building is constructed within the agreed time frame and budget.
During construction, your point of contact would be directly with us. We will deal with the day-to-day running of the site and all contract administration. We work in close contact with the Contractor and meet them on site once a week to check progress and discuss details.
We encourage regular meetings with you, to suit your schedule, to make sure everyone is kept up-to-date and aware of progress.
We have extensive practical job running experience and will ensure the project is built as per the design and to a high quality finish.
We can also design all of the fitted furniture and any bespoke fixtures/ fittings, including kitchens if required.


text:
Home»News»NBA: New York Knicks vs Philadelphia 76ers Prediction & Match Preview
NBA: New York Knicks vs Philadelphia 76ers Prediction & Match Preview
By The West News November 8, 2021 Updated: November 8, 2021 3 Mins Read
On Monday, the New York Knicks and the Philadelphia 76ers will face off for the second game in the 2021-22 NBA season at Wells Fargo Center.
In the rematch, the Knicks were winners by a score of 112-99. Since then, the Sixers have improved significantly and will be anxious to avenge that defeat. New York has a 6-4 record this season, while Philadelphia is 8-2.
Fixture – New York Knicks vs Philadelphia 76ers | 2021-22 NBA Season.
Date & Time – Monday, November 8, 2021; 7:00 PM ET (Tuesday, November 9, 2021; 5:30 AM IST)
Venue – Wells Fargo Center, Philadelphia, PA.
New York Knicks Preview
The New York Knicks have just suffered a 109-126 loss to the Cleveland Cavaliers. In the second half of the game, the Knicks were unable to stay up with their opponents. During that time, they were outscored by 21 points.
Julius Randle led the squad with 19 points, while Derrick Rose (17 points) started in place of Kemba Walker (rest). New York's defence faltered once again, failing to make key stops at critical moments in the game. Their dependence on offence caused them to lose their third game in a row.
Despite their recent struggles, the New York Knicks still have one of the league's top rosters. They have a good chance of going 2-0 against the Sixers if they put together a strong defensive performance.
2nd half is underway. Let's get it. pic.twitter.com/y3ELAXtMLk
— NEW YORK KNICKS (@nyknicks) November 8, 2021
New York Knicks Predicted Lineup
G – Kemba Walker, G – Evan Fournier, F – RJ Barrett, F – Julius Randle, C – Mitchell Robinson
Philadelphia 76ers Preview
The Philadelphia 76ers come into this game riding a six-game winning streak. Despite the absence of key starters Tobias Harris and Danny Green, they defeated the Chicago Bulls 114-105 in their last game.
During the game, Joel Embiid led the way with 30 points and 15 rebounds, while Furkan Kormaz came off the bench to score 25 points. Philadelphia as a team shot a remarkable 53.1 per cent from the field. They acquired an advantage thanks to their bench production, which resulted in 40 points compared to Chicago's 27.
Philadelphia 76ers Predicted Lineup
G – Tyrese Maxey, G – Seth Curry, F – Paul Reed, F – Furkan Korkmaz, C – Joel Embiid.
Knicks vs 76ers Match Prediction
In comparison to the New York Knicks, the Philadelphia 76ers have been in excellent shape. However, Matisse Thybulle's presence on the injury list owing to Covid-19 rules has exacerbated the Sixers' injury issues. This could cause them to struggle against New York, which boast one of the league's greatest offensive units this season. These factors favour the Knicks, making them the odds-on favourites to win the game.
NBA New York Knicks News Philadelphia 76ers Sports


To contact Stefan J, please log in to your account.
Business announcements: 2019's Biggest Launch - No Joke!! Set to change two industries!!
***CALLING ALL AUSSIES & KIWIS*** Biggest Prelaunch in AU/NZ history!!
The mobile revolution is here to stay - or is it?
Success is just like finding a Husband or Wife... You have to keep dating till you find the right one. Keep looking if one doesn't work.


text:
Betina Riegelhuth (født 17. Juni 1987 i Oslo, Norge) er en norsk håndboldspiller som spiller for Storhamar IL og Norges håndboldlandshold. Hun fik debut på det norske landshold i 2010 i en kamp . Hendes første slutrunde var ved EM i håndbold 2014 i Ungarn og Kroatien. Hun har tidligere optrådt for de danske mestre fra Team Esbjerg.

Hun er lillesøster til Linn-Kristin Riegelhuth Koren.

Meritter med landsholdet
 VM i håndbold:
 Vinderf: 2015
 EM i håndbold:
 Vinder: 2014

Kilder

Eksterne henvisninger

Håndboldspillere fra Norge
Håndboldspillere fra Storhamar Håndball
Håndboldspillere fra Bækkelagets Sportsklub


Fires destroy three buildings in Pontiac: Fire has taken its toll on three Pontiac families this week.
Since Sunday, three fires have destroyed property in Campbell's Bay, outside of Quyon and in Pontiac Station.
The barn fire at Sutton property on the Wolf Lake Road started early Jan. 17. Quyon Fire Chief Leo Ladouceur reported that when the fire trucks arrived 20 minutes after receiving the call, all that was left of the barn were beams and a shell. Firefighters are blaming electrical problems. The barn was completely destroyed in the blaze and 13 beef cows died.


The Cornell classic kitchen is an elegantly styled timber door in a neutral colour. It has a range of kitchen units available including curved doors. It is supported by an option of the Cornell painted which has a choice of 30 stunning colours.


text:
Willowdale, Nova Scotia could be the following places in Nova Scotia:
Willowdale, Halifax, Nova Scotia
Willowdale, Pictou, Nova Scotia


text:
using System;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;

// ReSharper disable CheckNamespace
namespace SharpRemote
// ReSharper restore CheckNamespace
{
	public partial class BinarySerializer
	{
		private void EmitReadSingleton(ILGenerator gen, MethodInfo factoryMethod)
		{
			gen.Emit(OpCodes.Call, factoryMethod);
		}

		[Pure]
		private bool IsSingleton(Type type, out MethodInfo method)
		{
			if (!_getSingletonInstance.TryGetValue(type, out method))
			{
				var factories = type.GetMethods()
					.Where(x => x.GetCustomAttribute<SingletonFactoryMethodAttribute>() != null)
					.Concat(type.GetProperties()
						.Where(x => x.GetCustomAttribute<SingletonFactoryMethodAttribute>() != null)
						.Select(x => x.GetMethod)).ToList();

				if (factories.Count == 0)
					return false;

				if (factories.Count > 1)
					throw new ArgumentException(string.Format("The type '{0}' has more than one singleton factory - this is not allowed", type));

				method = factories[0];
				if (method.ReturnType != type)
					throw new ArgumentException(string.Format("The factory method '{0}.{1}' is required to return a value of type '{0}' but doesn't", type, method));

				var @interface = type.GetInterfaces().FirstOrDefault(x => x.GetCustomAttribute<ByReferenceAttribute>() != null);
				if (@interface != null)
				{
					throw new ArgumentException(string.Format(
						"The type '{0}' both has a method marked with the SingletonFactoryMethod attribute and also implements an interface '{1}' which has the ByReference attribute: This is not allowed; they are mutually exclusive",
						type,
						@interface));
				}

				_getSingletonInstance.Add(type, method);
			}

			return true;
		}
	}
}


Have you ever passed a vehicle and noticed that the driver was looking at his phone instead of the road ahead of him? The widespread use of mobile phones means that they are about as standard in vehicles as radios these days. When a driver takes his eyes off the road to look at his phone, even for just a second, then he is placing himself and other vehicles near him at risk. The same goes for any other distraction, including eating, talking, or doing anything else while driving. At Nahon, Saharovich & Trotz, our Jackson distracted driving accident attorneys are ready to help guide you through the legal process and help you seek compensation to which you are legally entitled. In more than 25 years handling these cases, we have recovered over $1 billion in compensation for our clients. Our attorneys are ready to take your call.
A recent study indicated that distracted driving plays a large role in a majority of car crashes. One particular study found that in 52% of motor vehicle accidents, drivers had been on their phones at the time of or shortly before the collision. The study also found that texting, browsing social media, and reading/sending emails are the most common driver distractions, with the average length of distraction being 135 seconds. Since distracted driving accidents in Jackson usually occur in just a split second, even glancing at a phone or other device for a few seconds makes a driver more susceptible to being involved in a wreck.
Distracted driving can be proof of negligence. To succeed on a personal injury claim for damages, you will need to demonstrate the defendant owed you a legal duty, breached that duty, and that you sustained damages as a result of that breach. If a driver is distracted by someone or something else, he may suffer a lapse in judgment that ends up resulting in a collision with another car or pedestrian.
Succumbing to distractions behind the wheel may seem like a minor issue to a driver in the Jackson area, but it may lead to devastating harm. If it happens on a major interstate highway like I-20, I-220, or I-55, the high speeds of the vehicles involved mean that the resulting collision likely will be serious. Even on a city street like Bailey Avenue, Hume Avenue, or Ellis Avenue, checking a text message or fiddling with the GPS may cause a serious crash within seconds. Jackson witnessed 23 deaths in car accidents in 2014, for example, and some of those victims might be alive today if the drivers involved had been paying attention to the road.
A person injured in a motor vehicle collision must pursue a bodily injury claim in a timely manner and should consider retaining a distracted driving accident lawyer in Jackson. Statutes of limitations exist to establish a deadline for bringing claims in order to avoid stale or fraudulent claims. Statutes of limitations also purport to keep evidence fresh and relevant, as evidence may disappear over time. Further, memories can fade as time goes on. Statutes of limitations are usually strict deadlines with very rare exceptions, and if an injured party files a lawsuit after the statute has expired, the action can be promptly dismissed.
Under Mississippi law, a distracted driving accident victim must typically either settle his or her bodily injury claim or file a lawsuit within three years of the date of the accident. Different rules apply if the defendant is a government entity within the State of Mississippi, such as the City of Jackson. If the parties do not reach an amicable agreement to settle, or if a lawsuit is not properly filed with the appropriate court within that relevant period, then that claim would be time-barred and the injured party's right to sue for his or her injuries can be lost forever. The clock starts running on the date of the accident even if the injury or harm is not immediately known. A lawyer with experience handling car accidents in Jackson can conduct an investigation to confirm the identities of all defendants involved.
If you have been injured in a crash with a distracted driver, it is important to consult with a lawyer who is knowledgeable of the legal procedures you must comply with in order to seek recovery for your injuries and other losses. Nahon, Saharovich & Trotz has been handling personal injury matters for more than 25 years. Call our Jackson distracted driving accident lawyers toll-free at 800-LAW-4004 or complete our online form to set up a free consultation with a car crash attorney. We represent people injured throughout the South, including in Tennessee, Arkansas, Mississippi, Missouri, and Kentucky. NST is the way to go.


Stan passed away about 6 years ago....killed in a automobile accident while driving to a work site in the early part of the morning...it was dark...raining...and that was it. Anyone who knew me and Stan knew we like brothers...My heart aches with a sick pain that likely will never go away. He left behind a beautiful wife and twin boys to carry on his name. I love you Stan...and will always hold you in my heart.
You are visiting the placeholder page for Stan Toloczko. This page is here because someone used our placeholder utility to look for Stan Toloczko. We created this page automatically in hopes Stan Toloczko would find it. If you are not Stan Toloczko, but are an alumni of Hyde Park High School, register on this site for free now.


If you're a drummer and are looking for a pair of decent or even the best in-ear monitors (IEMs) that you can either use in the studio during practice, or even live on-stage, this is all you need to know. There are so many choices out there and it might even be quite challenging to find which ones are more suitable for you. There quite a few things that you should take into account before selecting your in-ear monitors, and these include sound quality, design and comfort, and price, but ultimately, you shouldn't just settle for anything mediocre – you should look for the best.
Drummers play an important role in a band. Drums are very important instruments when creating and playing many types of music. Contrary to popular belief that the vocalist of a band or the conductor in an orchestra is the "leader of the band", many musicians will agree that it's actually the drummer who plays as the anchor of the group. The drumbeats dictate the tempo, speed, and all other elements and exciting things you can add on to your music to make it sound like how it's supposed to sound or how you want it to sound. While every piece of instrument is important, the drums are always the ones that are most noticeable. If the drummer is out of tune or isn't playing his piece right, it affects the whole band. If the drummer doesn't do something that he's supposed to do, then that's easily recognizable by the audience or the listener. If the vocalist decides not to hit the high note, it's okay. If the guitarist misses a note, it's still okay. But if the drummer doesn't play on a certain beat or slows down, the entire band is affected.
With that being said, it is just right to say that drummers deserve the best in-ear monitors. In-ear monitors are basically earphones. When playing along with a band or in front of a cheering and screaming audience, it is easy to lose focus. You will most likely not hear the instrument you are playing or the music of the rest of your band mates. Drummers need these in-ear monitors so that they can hear the music they're playing and stay on the right beat because again, they are the anchor of the band and losing the right tempo, rhythm and timing will affect the entire band.
The in-ear monitors included on the list below are made not just for drummers. In fact, most of these items are made for all kinds of musicians, audiophiles and even simple music enthusiasts. No matter what your purpose is when shopping for the best in-ear monitors for drummers, there are certain characteristics, features and considerations you need to take a look at. Remember that what's good and effective for one musician may not necessarily be the same for the other so it still boils down to personal preference. But the qualities that are discussed here should be present across all kinds of in-ear monitors before one deserves to be considered the best and worthy of your purchase.
If you're a drummer looking for a pair of in-ear monitors, you must realize that you are not merely getting a pair that you will use for leisure listening. This is a pair you will use for work (or your hobby). You must get the most natural-sounding best in-ear monitors that can produce clear and crisp audio with good bass response because the better the sound, the better you can coordinate your music with the rest of the band and the better you can feel the vibe. When you feel the vibe, it translates to the music you play. Most definitely, you should choose one with superior sound quality and do not settle for anything less than that.
Noise isolation is so important when it comes to in-ear monitors. In fact, this feature is so important and it is highly recommended for you to skip any pair of in-ear monitors that don't have this feature. Sound isolation is the ability to cancel outside noise so you can focus on the sound you hear directly from your in-ear monitors – which is precisely why you're getting a pair like this. Without a guarantee of effective noise isolation, your best in-ear monitors become useless. Furthermore, noise isolation is important because it's actually an ear safety feature. If you can't hear the sound from your in-ear monitors well because of outside noise, the tendency is for you to increase the volume. When the volume gets too loud, of course, that cannot be healthy for your ears.
If you will notice, in-ear monitors for drummers are usually earbuds. Full-sized headphones might be good in the studio but if you wear these for hours, it gets tiring, heavy and inconvenient. Some earbuds might have too much pressure on the ears so it is best to have one that is designed to fit most ear sizes securely. Many best in-ear monitors for drummers include several tips in the package with varying sizes so you can change the ones you have to ones that are most comfortable to use. Whether you're on the stage, in the studio, in band practice or you're just listening to music for hours, it would be great to have such a comfortable pair.
Probably the main reason why earbuds/earphones are most common for drummers is because in-ear monitors stay in place. Full-sized headphones will most likely fall off as soon as you bop your head to the beat, play the drums too passionately, etc. It is just right for you to find a pair of in-ear monitors that will stick to your ears no matter what. Sometimes the size of the ear tips is what matters. As mentioned above, most packages come with several sizes of ear tips so that you can choose one which fits securely into your ears – not only will this stop your in-ear monitors from falling but this also plays a role in blocking out noise. There are also around or over-the-ear earphones that hold on securely to your ears because it is designed to wrap around your ear. On the list below, you will find the best in-ear monitors for drummers in both these designs – earbuds and over-the ear – so you can narrow down your choices easily.
Audio-Technica, as most of us already know by now, is definitely one of the best brands when it comes to audio equipment, particularly headphones and earphones. They have several models of full-sized headphones that are being used by many music professionals and audiophiles and so far, they have not disappointed anyone. When it comes to finding the best in-ear monitors for drummers, you will realize that the good ones are usually pricey – and naturally, if you're spending a lot of your hard-earned money on something, you can't go for a hit or miss, trial or error kind of selection process. Thankfully, Audio-Technica is giving you the chance to own a pair of in-ear monitor headphones that are fairly priced, attractive-looking and simply hits all the features you need in all the right places. The Audio-Technica ATH-IM70 Dual Symphonic-Driver In-Ear Monitor Headphones sells for only a little over $100 but you can find these on sale for a few dollars less. For its price, you are guaranteed that you are getting the value of every penny you spend on it.
The Audio-Technica ATH-IM70 Dual Symphonic-Driver Best In-Ear Monitors give you very clear, crisp, rich and accurate sound, thanks to its built-in dual symphonic drivers. You get the necessary punch on the bass and good emphasis on the treble – it basically delivers any drummer's needs when it comes to getting the right sound. As of writing time, it has already received many of outstanding reviews from amateur and professional drummers alike. Owners of this pair of in-ear monitor headphones have nothing but great things to say especially with the sound quality and the sturdy built of this product. As soon as you hold this pair in your hands, you already feel how durable it is and you get the confidence that this will last for a long time. Comfort is also topnotch. The Audio-Technica ATH-IM70 Dual Symphonic-Driver In-Ear Monitor Headphones is built with an ergonomic design and soft ear tips that fits securely into the ears so you won't have to worry about your earphones getting lose while playing the drums with all your might. If you are willing to shell out a bit of money on a pair of in-ear monitors, this one will be an investment you won't regret.
This next pair that took the second spot on this list of the best in-ear monitors for drummers is not really made for drummers only but for all kinds of musicians. You can use it on stage, in the studio or even on the go and you will still be very satisfied with what it can offer. Just half the price of the Audio-Technica that went right before this, the MEE Audio M6 PRO Universal-Fit Noise-Isolating Musician's In-Ear Monitors sells for only $50 or even less. You can choose from clear or smoke colors, which are both very attractive looking pairs. More importantly, for its price, it is quite a powerful and remarkable pair. In fact, almost 900 online customers have given these earphones an average of 4.1 out of 5 stars in ratings with very satisfied feedback and comments.
The MEE Audio M6 PRO Universal-Fit Noise-Isolating Musician's In-Ear Monitors is great for drummers as the sound produced is studio-tuned, crystal clear with a deep punch of bass – exactly what drummers usually look for from in-ear monitors. It has an impressive noise-isolating feature as well that makes this pair even more functional and enjoyable to use. What's even better is that it is comfortable to wear and its universal-fit feature gives you a secure fit. The detachable cables come with a built-in microphone and remote with volume control so you can use this on smartphones, tablets and your computer as well. For its price, you are actually getting a bargain as the package already includes an extra cable, 6 sets of silicone ear tips, foam ear tips and a protective carrying case. While this is a very durable pair that's meant to last even if you intend to use this for hours on end every single day, you can have more confidence and peace of mind as the manufacturer throws in a year's warranty.
Another Audio-Technica earned its well-deserved spot on this list. Though it might seem like an expensive choice as the Audio Technica ATH-IM02 SonicPro Balanced In-Ear Monitor Headphones sells within the $170 range, you are actually getting quite a deal from this as it used to sell at $300 – so you have to realize, you're getting the sound quality and build quality of a $300 pair of in-ear monitor headphones for a very low price. It is a very worth-it purchase and happy customers can prove that. Today, this pair has already received plenty of positive reviews from critics, customers, and audiophiles.
The most important feature that the Audio Technica ATH-IM02 SonicPro Balanced In-Ear Monitor Headphones can offer is its amazing sound quality. It is able to produce such clear, pure and crisp sound through its exclusive dual balanced armature drivers. It is very comfortable to wear too thanks to its ergonomic design that comes with formable wire cables. The cables are actually detachable too. In addition, this pair has a horn-shaped conductor pipe which the manufacturer calls the "Acoustic Horn". This feature allows reduction of acoustic radiation resistance for an even more natural production of sound.
The Audio Technica ATH-IM02 SonicPro Balanced In-Ear Monitor Headphones is a very durable pair of headphones. Many of the customers who already own this pair shared that this pair feels expensive and once you hold it, you know that it's a sturdy piece of device. Each package already includes a carrying case which is perfect for the drummer on the go, three pairs of silicone earpieces in small, medium and large so you can choose whatever gives you the most comfortable fit and medium-sized comply foam earpieces.
Again, the Audio Technica ATH-IM02 SonicPro Balanced In-Ear Monitor Headphones aren't the cheapest you'll find in the market. It isn't the most expensive either as there are some drummer best in-ear monitors that can cost you a lot more. But with the comfort, sound quality and durability this pair offers, you are guaranteed that you're getting a good deal out of these Audio Technica headphones.
Of course, a list like this, especially for a pair of earphones that's meant for musicians, wouldn't be complete with one from Shure. The brand is known for making more than satisfying audio equipment that even audiophiles would appreciate. There's no wonder why thousands of customers have opted for the Shure SE215-CL Sound Isolating Earphones and so far, it has received an average of 4.1 out of 5 stars rating from over 2,000 online customers. It gained an impressive number of good reviews from critics and customers from other sites too. It used to sell at $200 but Shure slashed down the price to just less than $100. You are getting the value of a more expensive pair of earphones at an affordable price, so it's a winning situation for you! Now don't get confused with the model number. The SE215-CL is the same with the SE215-K. The -CL means "clear" and the -K means "black", which are the colors available for these best in-ear monitors.
Why is the Shure SE215-CL Sound Isolating Earphones great for drummers? It is actually great for any kind of musician but drummers in particular will love how such a small of earphones can prevent outside noise pretty well. This pair does that with its sound isolation technology that makes this ideal to use whether you're drumming on-stage, inside the studio for recording or for band practice and even when you're on the go. It is very comfortable to wear too, thanks to its optimized nozzle angle that securely fits right in your ears. The sound quality is also amazing. Drummers would love that rich bass and impressive trebles and you can get that from this pair.
A pair of really good in-ear monitors for drummers is worth the investment. You must know by now that a full-size pair of headphones is rather uncomfortable to wear especially if you're banging the drums away with all your passion, not to mention all that sweat contained in the earpieces! This model is comfortable, it has great sound quality and it is durable too. It's just a bonus you get additional soft and flexible sound isolating sleeves or ear tips that come in multiple sizes so you can get your perfect fit. And you even get a carrying case with the package too! Despite its higher than usual price, you are still getting a bargain with the Shure SE215-CL Sound Isolating Earphones.
A fairly new model that was announced in the earlier part of this year (2016), the Fender FXA2 Professional In-Ear Monitor Headphones is part of a series of Fender In-Ear Monitors and the FXA2 is actually the more affordable pair compared to the other ones. Priced sensibly, it still isn't cheap at all yet these are professional best in-ear monitors so you can expect superior quality that's unlike any other random cheap pair you'll find off the shelf. Just one look at the Fender FXA2 will already give you the impression that it is truly remarkable. It is very solid and the construction is just so durable so you can expect it to last for many years. As of writing time, it is still just a few months' old so there's really no proof yet that it is a strong and long-lasting pair but again, the quality is very promising.
The Fender FXA2 Professional In-Ear Monitor Headphones features custom 9.25mm precision rare-earth drivers that come with a Groove-Tuned port. The 3D-printed DHT shell fits 95% of your ears so for a more comfortable and secure feeling, plus it does so well in sound isolation too. The sound is so natural, lifelike and clear, thanks to its impressive 8Hz-23kHz frequency response. The sound also remains distortion-free with its 112dB at 1mW frequency response.
The other pairs on this series – FXA5, FXA6, FXA7 have even more powerful features but of course, it comes with a price. The FXA7, in particular, sells at the very top of the range. However, whether you're an amateur musician, you play drums only as a hobby or if you're a professional, you will still love what the Fender FXA2 Professional In-Ear Monitor Headphones can offer. For its reasonable price, you are getting a great deal as the package already includes a deluxe carrying case, SureSeal tips, cleaning tool and the cable. There are already a few reviews coming from critics and professionals that you can find online. So far, there are not many helpful feedback you can find from actual customers simply because this is a new product. However, if you compare the features of this pair to other pairs in this price range, you will see how outstanding the FXA2 is and buying it is not really a risk, rather a great opportunity for you to enjoy drumming on stage or in the studio more.
From a quite pricey pair right before this, we're moving on to a more affordable yet equally attractive and impressively powerful pair of in-ear monitors. The GranVela® X6 PRO Noise-Isolating Musician's In-Ear Monitors sells at a very competitive price and you can choose from black, blue, red, and red and blue. Again, you have to understand that since it's a rather affordable pair, you can't expect performance like one that would cost a few hundred dollars; however, in its price range, this is definitely one of the best and you can even compare it to ones that cost double or triple its price. What's make this pair of in-ear monitors special is its great sound quality. Through its detachable high quality cables that come with gold plated connectors, you can enjoy seamless connection with great frequency response. Furthermore, according to happy owners who generously left high ratings and good feedback, these earphones produce rich bass and clear and natural sound.
Another important feature that all best in-ear monitors for drummers must have is the ability to isolate outside noise. The GranVela® X6 PRO Noise-Isolating Musician's In-Ear Monitors have an excellent sound isolation technology which allows you to hear every important detail of the music you're listening to or playing along to while blocking out the excessive outside noise so you can maintain your focus. You can even enjoy using this pair whether you're on stage on in the studio and you can use it for hours on end, as it is lightweight and very comfortable to wear. It features a low-profile design with an optimized nozzle angle so that the earphones would fit securely and comfortably into your ears. The over-the-ear fit is so secure and comfy so even if you're playing the drums with all your might, you won't have worries about the earphone falling off.
An additional feature that you will also appreciate is that the GranVela® X6 PRO Noise-Isolating Musician's In-Ear Monitors has an in-line control and in-line microphone. So when you're done with band practice or a performance, you can still use this pair to listen to music and even make and receive calls on your smartphone.
For most drummers, the basic requirements for a good pair of in-ear monitors are clear sound and excellent noise isolation. The Westone UM Pro20 High Performance Dual Driver Noise-Isolating In-Ear Monitors is quite an investment as it sells at the top of the price spectrum, but it does its job well and you know you're not getting just any mediocre pair. A cheaper version came out at just half the price, which has a single driver or you can spend $100 more to get the triple driver version. But based on critic reviews as well as comments from professional drummers, the dual driver version is more than enough for one to be satisfied with performance. This is a professional's pair and whether you're playing drums for a small group or you're on an arena's stage, you will still appreciate the range and output the Westone UM Pro20 High Performance Dual Driver Noise-Isolating In-Ear Monitors can produce. It's so good at noise isolation and in fact, you can get up to 25dB of ambient noise reduction. This is great for drummers, bass players and guitarists and other musicians looking for the best in-ear monitors.
Rich bass, impressive trebles and overall great sound quality that's clear, natural and crisp are what you can expect from the Westone UM Pro20 High Performance Dual Driver Noise-Isolating In-Ear Monitors. It is just a bonus that it's very comfortable and convenient to wear too. Its design features and up and over cable routing that keeps your earphones secure into your ears and helps prevent micro phonics too. So far, it has received hundreds of positive customers ratings from critics, customers and reviewers from other a wide array of websites. The package is already complete so you'd only have to spend for this pair once. The Westone UM Pro20 High Performance Dual Driver Noise-Isolating In-Ear Monitors already comes with premium comfort tips, and EPIC replaceable cable, mini-monitor vault and a cleaning tool. The manufacturer even throws in a 2-year warranty for added peace of mind and confidence for the customers.
Another GranVela made it to this list and thankfully, it's another pair of budget headphones minus the cheap features. Best for musicians including drummers, DJ's and even for working out, the GranVela® A8 High Fidelity Dual Symphonic-Driver Earphones are sold at a very sensible price. Now the GranVela® A8 High Fidelity Dual Symphonic-Driver Earphones might be affordable but it sure is powerful and comparable to the more expensive pairs you'll find in the market today. It is great that these in-ear monitors are built with superior quality materials such as a high-quality synthetic housing and lightweight shell. These are very durable and sturdy materials so you know that this pair is strong enough to last for many years of daily use (and sometimes even abuse). More importantly, these best in-ear monitors with detachable cables are so comfortable to wear. The package includes fours pairs of ear tips so you can choose the one with the best fit not only for comfort but also for more effective noise isolation.
The best feature of the GranVela® A8 High Fidelity Dual Symphonic-Driver Earphones are its built-in dual symphonic drivers that make sound quality so clear, crisp and natural. You get the necessary bass punch you need as a drummer and those impressive trebles too. In fact, many customers claim that the A8 is chance they had to take as the brand is not the most popular when it comes to audio equipment and thankfully, this model was a pleasant surprise. It sounds and feels so much better than expected, and for its price, you might probably be expecting a cheap pair but once you hold the A8, you get that feeling that it's actually expensive.
Now this professional pair does more work than just being used by musicians in the studio or on stage. The GranVela® A8 High Fidelity Dual Symphonic-Driver Earphones has detachable cables and best of all, this pair has a built-in microphone. Use it to listen to music on your smartphone and take calls hands-free or attach it to your computer for voice or video conferencing purposes.
Outstanding customer reviews and ratings of the SoundSprocket PA-1 Pro Audio says a lot about this pair of in-ear monitors. It isn't as expensive as many of the pairs discussed before this number and it probably isn't the most popular pair as well; however, it does its job so impressively and once you own one, you'll never want to work with another pair of in-ear monitors again. It is very affordable too considering its power and features. Selling at only $140, it has been said that the SoundSprocket PA-1 Pro Audio is comparable to earphones and best in-ear monitors that are double its price.
Before we proceed on describing how amazing the sound quality is, it would be great to describe how nice the actual product is. The cables are braided so that tangles can be prevented and it makes the pair sturdier too. There are two extra jacks that come with the package so you can use it with practically all kinds of audio equipment and sources you are using. The cable is long enough and the earpiece securely and comfortably fits into the ear – perfect for drummers who move a lot as they play passionately along with the beat on-stage. It's just awesome that you also get a single-button control and an in-line microphone built with this pair too so you can use it not only when playing or listening to music but also for hands-free calls too. The package comes with three pairs of ear tips in different sizes so you can get the perfect fit not only for comfort but for more effective noise isolation too. Lastly, you get a nice-looking round carrying case where all the extra jacks, small items and the actual in-ear monitors can be stored when not in use.
Without a question, construction, durability and comfort is topnotch with the SoundSprocket PA-1 Pro Audio. When it comes to sound quality, it is superior too. In fact, as mentioned, the sound quality you get out of this pair is comparable to more expensive ones so getting the chance to simply listen to music or play the drums with these on your ears will always be a pleasure. The audio is so natural, clear, crisp and very precise with just the right richness of bass and pureness of sound. Spending more than 100 dollars might be a little too much for some but if you're a professional or you're an amateur drummer who needs to step up on his career, then this pair is a very practical investment you will surely not regret.
Probably not the most important requirement but something good to have as well is an attractive pair of in-ear monitors. Especially if you're a drummer playing live, you'd want something that looks good on stage or on your music videos. Very simple yet elegant and classy at the same time, the Wi Digital SEBD10 Wi Sure-Ears Professional Noise-Isolating In-Ear Monitors Optimized for Bass Drums and Keyboards comes in polished silver brass and will look, feel and sound good in any stage setup.
The best feature that owners of this pair of the best in-ear monitors love about is the comfort it can offer. It feels and fits so comfortable, it is easy to wear, convenient and light on your ears so even if you use it for hours on end, you won't feel any pressure at all. Its universal secure-fit feature also comes in handy for drummers who would bang their heads along with the beat while playing on-stage. The cable is so durable too so you know that it will last for many years of daily use. Its exclusive tangle and kink-resistant design is something to love about this pair too. The actual in-ear monitors are compatible with almost all audio equipment and systems.
Whether you're sweating it out on stage or you're going for a run or a workout schedule in the gym, you can use your Wi Digital SEBD10 Wi Sure-Ears Professional Noise-Isolating In-Ear Monitors Optimized for Bass Drums and Keyboards too as it is sweat-proof and designed to handle all types of weather conditions and even very heavy perspiration.
Most importantly, the Wi Digital SEBD10 Wi Sure-Ears Professional Noise-Isolating In-Ear Monitors Optimized for Bass Drums and Keyboards produces such an impressive sound quality. It gives you rich bass, good trebles and ultra-clear and crisp sound that are so precise and accurate. It does so well in noise isolation too so that you can focus while playing and drown out the bad noise from the outside.


Order within 8 hours 28 minutes and it ships today!
Become a student from Gryffindor with the help of this cool robe! This deluxe robe will make you feel like a real Hogwarts student! Practice magic and fight off He Who Shall Not Be Named with the help of this cool costume!


text:
Q: UIButton doesn't work inside UIPopoverController I have a UIViewController with some buttons that works fine when I add as subview, but when I present this viewcontroller in UIPopoverController none of the buttons trigger actions. Someone knows that problem ?
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"iPhoneStoryboard" bundle:nil];
menuViewController =  (MenuListViewController *)[storyboard instantiateViewControllerWithIdentifier:@"menuviewcontroller"];

Buttons inside viewcontroller works if I use:
[self.view menuViewController.view];

But I want to use
popover = [[UIPopoverController alloc]initWithContentViewController:menuViewController];

A: One thing to look at when you can't interact with UI elements, especially after frame resizes, is to check that your elements are not outside of their parents bounds, check my answer to this question

redpajama_set_name: RedPajamaStackExchange


Improving over a task with respect to a performance measure based on experience.
How do we gain Experience?
How should the Task be represented?
What algorithm should we use to learn it?
What type of learning is it?
Is the training experience representative of the performance goal?
The target function is what we're trying to figure out. It's the function that determines what the target attribute will be (as in, based on the input, what will the outcome be?).
We can write this as the following function, designed to look at the value of the board state and choose the most valuable next move.
This gives correct values, but is not operational (in that over any large gamestate this takes too long and eventually the generated game tree (expanding every state) becomes too massive to be functional).
We need to choose how to represent our function. Will it be a Neural Network? A collection of rules? A polynomial function?
The learning problem would then become figuring out the optimal values for the w0->w6 coefficients.
The problem with this polynomial is that we don't just need to know these facts, we want to know where on the board the pieces are.
As in, assign the current board value to be the learned value of the next board. This makes sense for functions which are more accurate towards the end of a game, but does seem counter-intuitive to be using the current function to refine training data used to refine the function.
We need to modify the above weights to come up with the best function. Hence we do the following.


text:
Susan Carr: My Language
7 May - 7 June 2021
Down in the Valley, 2021
"I believe art saves lives. The very act of making is a sacred act, an act of life." - Susan Carr
Mark Borghi in Sag Harbor is pleased to present an exhibition of recent work by Susan Carr, on view May 7 - June 7, 2021.
As a lifelong learner, Susan Carr uses archetypes, metaphors, history, naivety and psychological ideas in her work. These motifs act as springboards for further investigation through various mediums and materials. For Carr, humility and love are crucial ingredients to create art. Being a mother has been an indispensable and a vital part of her life and art practice, and she has found great joy and inspiration in the strength of her familial relationships. Carr often depicts children or child-like imagery in her work, noting: "I like the idea of happy children perhaps because I am painting a new history for myself, a history where smiling comes easy." Another reoccurring symbol in Carr's work is the eye, which she began painting after the death of her son as a means to communicate with him: "Some say the circle represents totality, wholeness, eternity, timelessness and perfection. I like to think that all of those meanings can be found within the eye."
My Language presents Carr's paintings and sculptures formed by a myriad of materials such as wood, yarn, rag and even life-size cotton dolls. The works are playful, vibrant and textural, characterized by her saturated palette and impasto technique that allows her figures to seemingly jump off their surface. Carr's relates her studio to a science lab, where she is in a constant state of discovery and exploration into new ways of seeing things. My Language is an examination of Carr's deeply intuitive and highly curious world.
In 1994 Carr earned her BFA from The School of The Museum of Fine Arts at Tufts University in Boston, MA. After winning the prestigious Fifth year "Traveling Scholars Award," she returned in 2003 to earn her MFA in video and photography. Carr works in many mediums including sculpture, painting, the written word and photography. She recently published a small memoir in 2019 called "Tensions" of prose, poetry, photography and paintings. Her work has been exhibited throughout the United States and is featured in public and private collections. She has been awarded two career development grants from the Massachusetts Cultural Council as well as grants from The Davenport Company. Carr currently lives and works in Cape Cod, Massachusetts.
Susan Carr, A drawing that became a sculpture, 2021 Sold
Susan Carr, Art is my Country, 2020
Susan Carr, Big Toy, 2020 Sold
Susan Carr, Bo Jangles, 2021
Susan Carr, Goddess, 2020 Sold
Susan Carr, Jester, 2019
Susan Carr, Pink Thrill, 2019
Susan Carr, Second Birth for Terra Mater, 2021
Susan Carr, Sexy Thoughts, 2019
Susan Carr, Totem, 2021 Sold
Susan Carr, Thinking Piece, 2020 Sold
Susan Carr, The Elder, 2019
Susan Carr, The Work, 2021
Susan Carr, Big Box of Paint, 2020 Sold
Susan Carr, Small Box of Paint, 2019
Susan Carr, Together, 2018
Susan Carr, A Flower, 2021 Sold
Susan Carr, My Language, 2021
Susan Carr, Standing on the Precipice, 2019 Sold
Susan Carr, The Brush and Its Lover, 2020
Susan Carr, Sweetie, 2021
Susan Carr, I know you can hear me, 2019
Susan Carr, Under the Stars, 2017
Susan Carr, Blue, 2020 Sold
Susan Carr, Under the Sun, 2019 Sold
Susan Carr, Everything, Nothing, 2020 Sold
Susan Carr, Bardo State, 2019
Susan Carr, Coming to, 2020
Susan Carr, The Procession, 2020 Sold
Susan Carr, Black Balloon, 2020
Susan Carr, Forever, 2020
Susan Carr, WAVES, 2020
Susan Carr, Just us, 2020
Susan Carr, Moment, 2020
Susan Carr, Wildman, 2021 Sold
Susan Carr, Warrior, 2021
Susan Carr, Kickin it, 2020
Susan Carr, It's You, 2021 Sold
Susan Carr, Down in the Valley, 2021
Susan Carr, Boat, 2020
Susan Carr, Fate, 2021 Sold
Susan Carr, Three Eyes, 2021
Susan Carr, The Watchers, 2021
Susan Carr, Riding the Grid, 2020
Susan Carr, Boink, 2021
Susan Carr, Rock n Rolla, 2020
Susan Carr, Doll, 2020
Susan Carr


Discussion in 'Company Events' started by ArkadiaBot, Nov 20, 2016.
Thanks for the feedback, I could not get my head round the 37000 points difference between the winner in cat 4 and the points total I ended up with.
I obviously need to skill more and look for a new gun as my Ark pea shooter Herman XP-1 Scanthi Edition @ 173.67 dps (with buffs)just doesn't cut the mustard in the event......... I guess something like the DOA Strikehammer Improved with a mod evil will give me about an extra 6 dps, but not sure its gonna help me kill that many more mobs to make a difference.
Interesting to hear I was so wide of the mark in respect to the amount of mobs per hour I killed, thanks again for the feedback.
almost a week and still no prizes handed out?
Ye i wonder the same thing it dosent motivate me much to join the next round.


text:
Home Editor's Pick FT night, morning markets allowed to operate from June 15
FT night, morning markets allowed to operate from June 15
PUTRAJAYA, June 6 — All open, morning and night markets as well as bazaars, in the Federal Territories will be allowed to operate beginning June 15, on condition the Health Ministry's standard operating procedures (SOPs) are adhered to.
Senior Minister (Security Cluster) Datuk Seri Ismail Sabri Yaakob said the operating hours for open and morning markets would be from 6am – 11am, night markets (4pm-10pm) and bazaars (5pm – 11pm).
"The SOP for stall spacing stipulates that booths must be positioned 1.5 metres to two metres apart, in an open space fenced area, to allow one-way traffic flow control.
"The markets include those which were allowed take-away orders only," he said adding that traders must wear protective clothings, gloves and facemask.
He said this at a press conference following the Special Ministerial Meeting on the Conditional Movement Control Order (CMCO) here today.
At the same time, traders and shoppers are required to download and use the MySejahtera application and Kuala Lumpur City Hall will have the right to shut down business premises if the SOPs are not followed.
Ismail Sabri said the SOPs could also be adopted by the local authorities for markets across the country.
Meanwhile, he said 21 individuals were detained and remanded yesterday for violating the CMCO directives.
He said compound notices were issued to 277 individuals for various CMCO offences but no one was compounded for going against the Aidilfitri visiting rule.
A total of 32 vehicles that attempted to travel across state lines without permission, were ordered to turn back, and such cross-border attempts were mostly recorded in Selangor, Pahang, Negeri Sembilan and Melaka.
Previous articleTengku Muhammad Taufik named Petronas President Wan Zulkiflee joins MAB as chairman
Next articleWill there be another CMCO extension? Wait for PM's announcement today
Special select committee on tobacco control bill to meet next week...
Ceiling price for chicken remains at RM9.40 per kg – KPDNHEP