text:
package org.alfresco.dropbox.service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.alfresco.dropbox.DropboxConstants;
import org.alfresco.dropbox.exceptions.DropboxAuthenticationException;
import org.alfresco.dropbox.exceptions.DropboxClientException;
import org.alfresco.dropbox.exceptions.FileNotFoundException;
import org.alfresco.dropbox.exceptions.FileSizeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.admin.SysAdminParams;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.oauth1.OAuth1CredentialsStoreService;
import org.alfresco.service.cmr.remotecredentials.OAuth1CredentialsInfo;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentIOException;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Status;
import org.springframework.social.connect.Connection;
import org.springframework.social.dropbox.api.Dropbox;
import org.springframework.social.dropbox.api.DropboxFile;
import org.springframework.social.dropbox.api.DropboxUserProfile;
import org.springframework.social.dropbox.api.Metadata;
import org.springframework.social.dropbox.connect.DropboxConnectionFactory;
import org.springframework.social.oauth1.AuthorizedRequestToken;
import org.springframework.social.oauth1.OAuth1Operations;
import org.springframework.social.oauth1.OAuth1Parameters;
import org.springframework.social.oauth1.OAuthToken;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestClientException;

/**
 *
 *
 * @author Jared Ottley
 */
public class DropboxServiceImpl
    implements DropboxService
{

    private static Log                    logger    = LogFactory.getLog(DropboxServiceImpl.class);

    private PersonService                 personService;
    private NodeService                   nodeService;
    private PermissionService             permissionService;
    private ContentService                contentService;
    private SysAdminParams                sysAdminParams;
    private AuthorityService              authorityService;
    private SiteService                   siteService;
    private BehaviourFilter               behaviourFilter;
    private OAuth1CredentialsStoreService oauth1CredentialsStoreService;

    private DropboxConnectionFactory      connectionFactory;

    private static final String           NOT_FOUND = "404 Not Found";

    public void setPersonService(PersonService personService)
    {
        this.personService = personService;
    }

    public void setNodeService(NodeService nodeService)
    {
        this.nodeService = nodeService;
    }

    public void setContentService(ContentService contentService)
    {
        this.contentService = contentService;
    }

    public void setPermissionService(PermissionService permissionService)
    {
        this.permissionService = permissionService;
    }

    public void setSysAdminParams(SysAdminParams sysAdminParams)
    {
        this.sysAdminParams = sysAdminParams;
    }

    public void setAuthorityService(AuthorityService authorityService)
    {
        this.authorityService = authorityService;
    }

    public void setSiteService(SiteService siteService)
    {
        this.siteService = siteService;
    }

    public void setBehaviourFilter(BehaviourFilter behaviourFilter)
    {
        this.behaviourFilter = behaviourFilter;
    }

    public void setConnectionFactory(DropboxConnectionFactory connectionFactory)
    {
        this.connectionFactory = connectionFactory;
    }

    public void setOauth1CredentialsStoreService(OAuth1CredentialsStoreService oauth1CredentialsStoreService)
    {
        this.oauth1CredentialsStoreService = oauth1CredentialsStoreService;
    }

    // Dropbox Connection

    private Connection<Dropbox> getConnection()
        throws DropboxAuthenticationException
    {
        Connection<Dropbox> connection = null;

        OAuth1CredentialsInfo credentialsInfo = oauth1CredentialsStoreService.getPersonalOAuth1Credentials(DropboxConstants.REMOTE_SYSTEM);

        if (credentialsInfo != null)
        {
            OAuthToken accessToken = new OAuthToken(credentialsInfo.getOAuthToken(), credentialsInfo.getOAuthSecret());

            try
            {
                connection = connectionFactory.createConnection(accessToken);
            }
            catch (HttpClientErrorException hcee)
            {
                if (hcee.getStatusCode().ordinal() == Status.STATUS_FORBIDDEN)
                {
                    throw new DropboxAuthenticationException();
                }

            }
        }

        logger.debug("Dropbox Connection made for " + AuthenticationUtil.getRunAsUser());

        return connection;
    }

    // Dropbox Authentication

    public String getAuthorizeUrl(String callbackUrl)
    {

        String authorizeUrl = null;

        if (callbackUrl != null)
        {
            OAuth1Parameters parameters = new OAuth1Parameters(callbackUrl);

            OAuth1Operations operations = connectionFactory.getOAuthOperations();

            OAuthToken requestToken = operations.fetchRequestToken(parameters.getCallbackUrl(), null);

            persistTokens(requestToken, false);

            nodeService.setProperty(personService.getPerson(AuthenticationUtil.getRunAsUser()), DropboxConstants.Model.PROP_OAUTH_COMPLETE, false);

            authorizeUrl = operations.buildAuthorizeUrl(requestToken.getValue(), parameters);

        }

        return authorizeUrl;
    }

    public boolean completeAuthentication(String verifier)
    {
        boolean authenticationComplete = false;

        if (verifier != null)
        {
            NodeRef person = personService.getPerson(AuthenticationUtil.getRunAsUser());

            if (nodeService.hasAspect(person, DropboxConstants.Model.ASPECT_DROBOX_OAUTH))
            {

                OAuth1Operations operations = connectionFactory.getOAuthOperations();

                OAuth1CredentialsInfo credintialsInfo = getTokenFromUser();

                OAuthToken accessToken = operations.exchangeForAccessToken(new AuthorizedRequestToken(new OAuthToken(credintialsInfo.getOAuthToken(), credintialsInfo.getOAuthSecret()), verifier), null);

                persistTokens(accessToken, true);

                nodeService.setProperty(person, DropboxConstants.Model.PROP_OAUTH_COMPLETE, true);

                authenticationComplete = true;
            }
        }

        return authenticationComplete;
    }

    private OAuth1CredentialsInfo getTokenFromUser()
    {
        return oauth1CredentialsStoreService.getPersonalOAuth1Credentials(DropboxConstants.REMOTE_SYSTEM);

    }

    private void persistTokens(OAuthToken token, boolean complete)
    {
        OAuth1CredentialsInfo credentialsInfo = oauth1CredentialsStoreService.getPersonalOAuth1Credentials(DropboxConstants.REMOTE_SYSTEM);

        oauth1CredentialsStoreService.storePersonalOAuth1Credentials(DropboxConstants.REMOTE_SYSTEM, token.getValue(), token.getSecret());

        if (credentialsInfo != null)
        {
            HashMap<QName, Serializable> properties = new HashMap<QName, Serializable>();
            properties.put(DropboxConstants.Model.PROP_OAUTH_COMPLETE, complete);

            NodeRef person = personService.getPerson(AuthenticationUtil.getRunAsUser());
            nodeService.addAspect(person, DropboxConstants.Model.ASPECT_DROBOX_OAUTH, properties);
        }
    }

    public DropboxUserProfile getUserProfile()
    {
        DropboxUserProfile profile;

        Connection<Dropbox> connection = this.getConnection();
        profile = connection.getApi().getUserProfile();

        logger.debug("Get Dropbox User Profile for " + AuthenticationUtil.getRunAsUser());

        return profile;
    }

    // Dropbox Actions

    public Metadata getMetadata(NodeRef nodeRef)
    {
        String hash = null;

        // Get the hash if it exists
        if (nodeService.getProperty(nodeRef, DropboxConstants.Model.PROP_HASH) != null)
        {
            hash = nodeService.getProperty(nodeRef, DropboxConstants.Model.PROP_HASH).toString();
        }

        String path = getDropboxPath(nodeRef) + "/" + nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);

        Metadata metadata;
        Connection<Dropbox> connection = this.getConnection();
        metadata = connection.getApi().getItemMetadata(path, hash);

        logger.debug("Get Metadata for " + path + ": " + this.metadataAsJSON(metadata));

        return metadata;
    }

    public Metadata copy(NodeRef originalNodeRef, NodeRef newNodeRef)
    {
        Metadata metadata;
        Connection<Dropbox> connection = this.getConnection();

        String from_path = getDropboxPath(originalNodeRef) + "/" + nodeService.getProperty(originalNodeRef, ContentModel.PROP_NAME);
        String to_path = getDropboxPath(newNodeRef) + "/" + nodeService.getProperty(newNodeRef, ContentModel.PROP_NAME);

        metadata = connection.getApi().copy(from_path, to_path);

        logger.debug("Copy " + from_path + " to " + to_path + ". New Metadata: " + this.metadataAsJSON(metadata));

        return metadata;
    }

    public Metadata createFolder(NodeRef nodeRef)
    {
        Metadata metadata;
        Connection<Dropbox> connection = this.getConnection();

        String path = getDropboxPath(nodeRef) + "/" + nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);

        metadata = connection.getApi().createFolder(path);

        logger.debug("Create Folder at " + path + ". New Metadata: " + this.metadataAsJSON(metadata));

        return metadata;
    }

    public Metadata delete(NodeRef nodeRef)
    {
        Metadata metadata;
        Connection<Dropbox> connection = this.getConnection();

        String path = getDropboxPath(nodeRef) + "/" + nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);

        try
        {
            metadata = connection.getApi().delete(path);

            logger.debug("Delete " + path + ". Deleted Metadata: " + this.metadataAsJSON(metadata));
        }
        catch (RestClientException rce)
        {
            if (rce.getMessage().equals(NOT_FOUND))
            {
                throw new FileNotFoundException(nodeRef);
            }
            else
            {
                throw new DropboxClientException(rce.getMessage());
            }
        }

        return metadata;
    }

    public Metadata delete(String path)
    {
        Metadata metadata;
        Connection<Dropbox> connection = this.getConnection();

        try
        {
            metadata = connection.getApi().delete(path);

            logger.debug("Delete " + path + ". Deleted Metadata: " + this.metadataAsJSON(metadata));
        }
        catch (RestClientException rce)
        {
            if (rce.getMessage().equals(NOT_FOUND))
            {
                throw new FileNotFoundException();
            }
            else
            {
                throw new DropboxClientException(rce.getMessage());
            }
        }

        return metadata;
    }

    public Metadata move(ChildAssociationRef oldChildAssocRef, ChildAssociationRef newChildAssocRef)
    {
        Metadata metadata;
        Connection<Dropbox> connection = this.getConnection();

        String from_path = getDropboxPath(oldChildAssocRef.getParentRef()) + "/"
                           + nodeService.getProperty(oldChildAssocRef.getChildRef(), ContentModel.PROP_NAME);
        String to_path = getDropboxPath(newChildAssocRef.getChildRef()) + "/"
                         + nodeService.getProperty(newChildAssocRef.getChildRef(), ContentModel.PROP_NAME);

        metadata = connection.getApi().move(from_path, to_path);

        logger.debug("Move " + from_path + " to " + to_path + ". New Metadata: " + this.metadataAsJSON(metadata));

        return metadata;
    }

    public Metadata getFile(NodeRef nodeRef)
    {
        Metadata metadata;
        Connection<Dropbox> connection = this.getConnection();

        String path = getDropboxPath(nodeRef) + "/" + nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);

        DropboxFile dropboxFile = connection.getApi().getFile(path);

        try
        {
            ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true);
            writer.guessEncoding();
            writer.setMimetype(dropboxFile.getContentType().split(";")[0]);
            writer.putContent(dropboxFile.getInputStream());
        }
        catch (ContentIOException cio)
        {
            cio.printStackTrace();
        }

        metadata = this.getMetadata(nodeRef);

        logger.debug("Get File " + path + ". File Metadata: " + this.metadataAsJSON(metadata));

        return metadata;
    }

    public Metadata putFile(NodeRef nodeRef, boolean overwrite)
    {
        // 150 MB
        final long MAX_FILE_SIZE = 157286400L;

        Metadata metadata = null;
        Connection<Dropbox> connection = this.getConnection();

        ContentReader contentReader = contentService.getReader(nodeRef, ContentModel.PROP_CONTENT);

        try
        {
            if (contentReader.getSize() < MAX_FILE_SIZE)
            {
                String path = getDropboxPath(nodeRef) + "/" + nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
                metadata = connection.getApi().putFile(path, getBytes(contentReader), null, overwrite, null);
            }
            else
            {
                throw new FileSizeException();
            }
        }
        catch (IOException ioe)
        {
            throw new DropboxClientException(ioe.getMessage());
        }

        logger.debug("Put File " + getDropboxPath(nodeRef) + "/" + nodeService.getProperty(nodeRef, ContentModel.PROP_NAME)
                     + ". File Metadata " + this.metadataAsJSON(metadata));

        return metadata;
    }

    public void persistMetadata(Metadata metadata, NodeRef nodeRef)
    {

        List<ChildAssociationRef> dropboxAssoc = nodeService.getChildAssocs(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX);

        ChildAssociationRef usersAssocRef;
        if (dropboxAssoc.size() == 0)
        {
            usersAssocRef = nodeService.createNode(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.TYPE_USERS);
        }
        else
        {
            usersAssocRef = dropboxAssoc.get(0);
        }

        List<ChildAssociationRef> usersAssoc = nodeService.getChildAssocs(usersAssocRef.getChildRef(), DropboxConstants.Model.ASSOC_USER_METADATA, QName.createQName(DropboxConstants.Model.ORG_DROPBOX_MODEL_1_0_URI, AuthenticationUtil.getRunAsUser()));

        ChildAssociationRef userAssocRef;
        if (usersAssoc.size() == 0)
        {
            userAssocRef = nodeService.createNode(usersAssocRef.getChildRef(), DropboxConstants.Model.ASSOC_USER_METADATA, QName.createQName(DropboxConstants.Model.ORG_DROPBOX_MODEL_1_0_URI, AuthenticationUtil.getRunAsUser()), DropboxConstants.Model.TYPE_METADATA);
        }
        else
        {
            userAssocRef = usersAssoc.get(0);
        }

        Map<QName, Serializable> properties = new HashMap<QName, Serializable>();
        properties.put(DropboxConstants.Model.PROP_REV, metadata.getRev());
        // properties.put(DropboxConstants.Model.PROP_REVISION, metadata.get)
        properties.put(ContentModel.PROP_MODIFIED, metadata.getModified());

        // If a hash is returned we might need to update it
        if (nodeService.getType(nodeRef).equals(ContentModel.TYPE_FOLDER) && metadata.getHash() != null)
        {
            // If the hash is not the same update it
            if (nodeService.getProperty(userAssocRef.getChildRef(), DropboxConstants.Model.PROP_HASH) != null)
            {
                if (!nodeService.getProperty(userAssocRef.getChildRef(), DropboxConstants.Model.PROP_HASH).equals(metadata.getHash()))
                {
                    properties.put(DropboxConstants.Model.PROP_HASH, metadata.getHash());
                }
            }
            else
            {
                properties.put(DropboxConstants.Model.PROP_HASH, metadata.getHash());
            }
        }

        behaviourFilter.disableBehaviour(userAssocRef.getChildRef(), ContentModel.ASPECT_AUDITABLE);
        nodeService.addProperties(userAssocRef.getChildRef(), properties);

    }

    public Map<QName, Serializable> getPersistedMetadata(NodeRef nodeRef)
    {
        Map<QName, Serializable> properties = null;
        List<ChildAssociationRef> childAssoc = nodeService.getChildAssocs(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX);

        ChildAssociationRef usersAssocRef;
        if (childAssoc.size() > 0)
        {
            usersAssocRef = childAssoc.get(0);

            List<ChildAssociationRef> userAssoc = nodeService.getChildAssocs(usersAssocRef.getChildRef(), DropboxConstants.Model.ASSOC_USER_METADATA, QName.createQName(DropboxConstants.Model.ORG_DROPBOX_MODEL_1_0_URI, AuthenticationUtil.getRunAsUser()));

            if (userAssoc.size() == 0)
            {
                throw new DropboxClientException("No Metadata for this User");
            }
            else
            {
                properties = new HashMap<QName, Serializable>();
                properties.put(DropboxConstants.Model.PROP_REV, nodeService.getProperty(userAssoc.get(0).getChildRef(), DropboxConstants.Model.PROP_REV));
                properties.put(ContentModel.PROP_MODIFIED, nodeService.getProperty(userAssoc.get(0).getChildRef(), ContentModel.PROP_MODIFIED));

                if (nodeService.getType(nodeRef).equals(ContentModel.TYPE_FOLDER))
                {
                    properties.put(DropboxConstants.Model.PROP_HASH, nodeService.getProperty(userAssoc.get(0).getChildRef(), DropboxConstants.Model.PROP_HASH));
                }
            }
        }

        return properties;
    }

    public boolean deletePersistedMetadata(NodeRef nodeRef)
    {
        boolean deleted = false;
        List<ChildAssociationRef> childAssoc = nodeService.getChildAssocs(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX);

        if (childAssoc.size() > 0)
        {
            ChildAssociationRef usersAssocRef = childAssoc.get(0);

            List<ChildAssociationRef> userAssoc = nodeService.getChildAssocs(usersAssocRef.getChildRef(), DropboxConstants.Model.ASSOC_USER_METADATA, QName.createQName(DropboxConstants.Model.ORG_DROPBOX_MODEL_1_0_URI, AuthenticationUtil.getRunAsUser()));

            if (userAssoc.size() > 0)
            {
                deleted = nodeService.removeChildAssociation(userAssoc.get(0));
            }

            if (getSyncCount(nodeRef) == 0)
            {
                nodeService.removeChildAssociation(childAssoc.get(0));
                nodeService.removeAspect(nodeRef, DropboxConstants.Model.ASPECT_DROPBOX);
            }
        }

        return deleted;
    }

    public boolean deletePersistedMetadata(final NodeRef nodeRef, String userAuthority)
    {
        boolean deleted = false;

        SiteInfo siteInfo = siteService.getSite(nodeRef);
        if (siteInfo != null)
        {
            if (authorityService.isAdminAuthority(AuthenticationUtil.getRunAsUser())
                || siteService.getMembersRole(siteInfo.getShortName(), AuthenticationUtil.getRunAsUser()).equals("SiteManager"))
            {
                deleted = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Boolean>()
                {
                    public Boolean doWork()
                        throws Exception
                    {
                        return deletePersistedMetadata(nodeRef);
                    }
                }, userAuthority);
            }
        }

        return deleted;
    }

    /**
     * All the user metadata for the synched users. User must be Repository Admin or Site Manager.
     *
     * @param nodeRef
     * @return
     */
    public Map<String, NodeRef> getSyncedUsers(NodeRef nodeRef)
    {
        Map<String, NodeRef> syncedUsers = new HashMap<String, NodeRef>();

        if (nodeService.hasAspect(nodeRef, DropboxConstants.Model.ASPECT_DROPBOX))
        {
            List<ChildAssociationRef> childAssoc = nodeService.getChildAssocs(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX);

            if (childAssoc.size() > 0)
            {
                ChildAssociationRef usersAssocRef = childAssoc.get(0);

                Set<QName> childNodeTypeQNames = new HashSet<QName>();
                childNodeTypeQNames.add(DropboxConstants.Model.TYPE_METADATA);
                List<ChildAssociationRef> userAssoc = nodeService.getChildAssocs(usersAssocRef.getChildRef(), childNodeTypeQNames);

                if (userAssoc.size() > 0)
                {
                    for (Iterator<ChildAssociationRef> iterator = userAssoc.iterator(); iterator.hasNext();)
                    {
                        ChildAssociationRef childAssociationRef = iterator.next();
                        syncedUsers.put(childAssociationRef.getQName().getLocalName(), childAssociationRef.getChildRef());
                    }
                }
            }
        }

        return syncedUsers;
    }

    /**
     * Is the node synced to Dropbox for the currently authenticated User
     *
     * @param nodeRef
     * @return
     */
    public boolean isSynced(NodeRef nodeRef)
    {
        boolean synced = false;

        List<ChildAssociationRef> childAssoc = nodeService.getChildAssocs(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX);

        ChildAssociationRef usersAssocRef;
        if (childAssoc.size() == 0)
        {
            usersAssocRef = nodeService.createNode(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.TYPE_USERS);
        }
        else
        {
            usersAssocRef = childAssoc.get(0);
        }

        List<ChildAssociationRef> userAssoc = nodeService.getChildAssocs(usersAssocRef.getChildRef(), DropboxConstants.Model.ASSOC_USER_METADATA, QName.createQName(DropboxConstants.Model.ORG_DROPBOX_MODEL_1_0_URI, AuthenticationUtil.getRunAsUser()));

        if (userAssoc.size() > 0)
        {
            synced = true;
        }

        return synced;
    }

    /**
     * Is the node synced to Dropbox for the user. Requires Admin or SiteManager role to run
     *
     * @param nodeRef
     * @param userAuthority
     * @return
     */
    public boolean isSynced(final NodeRef nodeRef, String userAuthority)
    {
        boolean synced = false;

        SiteInfo siteInfo = siteService.getSite(nodeRef);
        if (siteInfo != null)
        {
            if (authorityService.isAdminAuthority(AuthenticationUtil.getRunAsUser())
                || siteService.getMembersRole(siteInfo.getShortName(), AuthenticationUtil.getRunAsUser()).equals("SiteManager"))
            {
                synced = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Boolean>()
                {
                    public Boolean doWork()
                        throws Exception
                    {
                        return isSynced(nodeRef);
                    }
                }, userAuthority);
            }
        }

        return synced;
    }

    /**
     * Total number of users who have the node synced to their Dropbox account. If -1 is returned then the total could not be
     * determined.
     *
     * @param nodeRef
     * @return
     */
    private int getSyncCount(final NodeRef nodeRef)
    {
        int count = -1;

        AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Integer>()
        {
            public Integer doWork()
                throws Exception
            {
                int count = -1;

                List<ChildAssociationRef> childAssoc = nodeService.getChildAssocs(nodeRef, DropboxConstants.Model.ASSOC_DROPBOX, DropboxConstants.Model.ASSOC_DROPBOX);

                if (childAssoc.size() > 0)
                {
                    ChildAssociationRef usersAssocRef = childAssoc.get(0);

                    Set<QName> childNodeTypeQNames = new HashSet<QName>();
                    childNodeTypeQNames.add(DropboxConstants.Model.ASSOC_USER_METADATA);
                    List<ChildAssociationRef> userAssoc = nodeService.getChildAssocs(usersAssocRef.getChildRef(), childNodeTypeQNames);

                    if (userAssoc.size() >= 0)
                    {
                        count = userAssoc.size();
                    }
                }

                return count;
            }
        }, AuthenticationUtil.getAdminUserName());

        return count;
    }

    public String getDropboxPath(NodeRef nodeRef)
    {
        String path = nodeService.getPath(nodeRef).toDisplayPath(nodeService, permissionService);
        path = path.replaceFirst(DropboxConstants.COMPANY_HOME, sysAdminParams.getShareHost());
        path = path.replaceFirst(DropboxConstants.DOCUMENTLIBRARY, "");

        logger.debug("Path: " + path);

        return path;
    }

    private byte[] getBytes(ContentReader reader)
        throws IOException
    {
        InputStream originalInputStream = reader.getContentInputStream();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        final int BUF_SIZE = 1 << 8; // 1KiB buffer
        byte[] buffer = new byte[BUF_SIZE];
        int bytesRead = -1;
        while ((bytesRead = originalInputStream.read(buffer)) > -1)
        {
            outputStream.write(buffer, 0, bytesRead);
        }
        originalInputStream.close();
        return outputStream.toByteArray();
    }

    private String metadataAsJSON(Metadata metadata)
    {

        String json;

        json = "{ \"size\": \"" + metadata.getSize() + "\",\"{\"bytes\": " + metadata.getBytes() + ", \"is_dir\": "
               + metadata.isDir() + ", \"is_deleted\": " + metadata.isDeleted() + ", \"rev\": \"" + metadata.getRev()
               + "\", \"hash\": \"" + metadata.getHash() + "\", \"thumb_exists\": " + metadata.isThumbExists() + ", \"icon\": \""
               + metadata.getIcon() + "\", \"modified\": \"" + metadata.getModified() + "\", \"root\": \"" + metadata.getRoot()
               + "\", \"path\": \"" + metadata.getPath() + "\", \"mime_type\": \"" + metadata.getMimeType()
               + "\", \"contents\": \"" + metadata.getContents() + "\"}";

        return json;
    }

}

redpajama_set_name: RedPajamaGithub


text:
Ideas from Other Global Scenarios
In 23 Practices/Structures in Other Countries, 9d Scenarios for musical futures - a major special project
The Music Sector Model is Global
Emissions Scenarios
Future of Financial Institutions
Scenario Builders' GFC Summary
Scenario Structure
Scenario Process
Global Europe 2050
Comparison with Music Scenarios
Range of "Best" and "Worst" Case Scenarios
Final Critical Inputs into Music Scenarios
The model we presented in Special Article #4, Global Risk Factors and Music in Australia, was developed independently of other scenarios. That process gave us better insights into the likely scope of the music scenarios, through intensive analysis and some intuition. Since published arts sector-related scenario models are as scarce as hens' teeth and it was important to keep an open mind while developing one, this seemed sensible, and in retrospect I am glad I followed that approach. Of course the formal scenario literature provided substantial help, including the recognition that the initial identification of the multiple factors that could have impact on the music sector could be merged into what scenario planners call critical uncertainties.
One important result of the independent work was to define the Australian music sector as globally associated. The model flowchart to the right shows this, and places the critical uncertainties in a central position in the process of developing alternative futures.
Now the model is developed, and put it into a philosophical context in Scenarios, Virtual History, and Chaos, the time has come to check other scenario projects for independent intellectual support of the approach. Having identified the context of the Australian music sector as global, the search was for other global perspectives. In fact, not a lot of scenarios have global parameters because they are basically confined within national boundaries. But we found three, of which two were specific about critical uncertainties, and another used a short list of major variables which could be compared with the music sector research.
The first is the classic atmospheric emissions scenarios report published by the Intergovernmental Panel on Climate Change (IPCC) in 2000, familiar from previous work. The second study was undertaken by the World Economic Forum to analyse the alternative futures of financial institutions following the Global Financial Crisis. It was published in 2010. Thirdly, the European Commission published Global Europe 2050 in 2011 to study the future of the European Union. Each is discussed in turn, and related to the scenario model for the Australian music sector.
As noted above, two of the three scenario studies both identified two largely unrelated sets of critical uncertainties that positioned against each other yield four different scenarios. For example, if one of these uncertainties can be either "fast" or "slow", and the other "wet" or "dry", the four scenarios become "fast/wet", "fast/dry", "slow/wet" and "slow/dry" – combinations that are capable of producing very different futures, especially if either "fast" or "slow" , and either "wet" or "dry", is superior according to the scenario model. This example is of course merely indicative of the descriptions below. The point is that the four-scenario matrix works well in an actual inquiry, and will be adopted for the music sector scenarios.
The next step, in fact, is to identify two sets of critical uncertainties for the music sector to form the basis for telling the scenario stories for each matrix quadrant.
The Intergovernmental Panel on Climate Change (IPCC) began developing these scenarios in 1996, and the Special Report on Emissions Scenarios (SRES) was finally approved in 2000. This caused the replacement of previous scenarios developed for the IPCC's Second Assessment Report in 1992 which had themselves replaced the original scenarios for the First Assessment Report in 1990 – the IPCC was committed to scenario building virtually from the time it was founded in 1988.
The SRES went through the IPCC approval process too late for complete incorporation of its findings into the Third Assessment Report (2001), but draft scenarios were circulated to climate modellers to facilitate their input into that report. The scenarios played their greatest role in the Fourth Assessment Report in 2007. The formal scenario approach was abandoned in the Fifth Assessment Report (2014) in favour of alternative "representative concentration pathways" (RCPs), which limit atmospheric greenhouse gases to predetermined levels by 2100. Consequently, the role of scenarios has changed from estimating the future level of greenhouse gases resulting from different economic and environmental regimes. The new policy model implies the use of scenarios that are designed to achieve a target level of atmospheric greenhouse gases in 2100.
In the previous IPCC reports, mitigation to limit atmospheric greenhouse gas pollution was a subsequent step to reduce the economic growth rate to a sustainable level. In the new model, mitigation is built into the process to achieve the target greenhouse gas level. The introduction of RCPs is not incompatible with scenarios because there are alternative ways to achieve a target. Moreover, the IPCC reports go to great lengths to measure the intrinsic uncertainty of targeting future greenhouse gas levels. The left-hand box shows the range of emissions caused by fossil fuels in 2100. Gigatons carbon is one of the main indicators; more are discussed in the next section which compares the SRES scenarios for 2100.
The introduction of RCPs, therefore, has not replaced the need for scenarios because they are just as required as before to guide policies aimed at a particular emissions target. Of course, the stories themselves might have needed updating because they were written almost 20 years ago, but our concern here is the validity of the global scenario approach rather than the story details.
The two dimensions of the scenarios – the critical uncertainties – are illustrated by the well-known SRES tree diagram, shown in its original form above. The uncertainties expressed vertically are the contrast between growth-driven and environmentally sensitive policies, while the horizontal axis ranges from a global to a regional focus. As usual in scenario analysis, all scenarios were plausible, and all were equally likely.
The SRES, in summary, uses a classic scenario approach whose basic elements could be graphed in a flowchart resembling the music sector model.
The SRES report notes: "By 2100 the world will have changed in ways that are hard to imagine – as hard as it would have been at the end of the 19th century to imagine the changes of the 100 years since. Each storyline assumes a distinctly different direction for future developments, such that the four storylines differ in increasingly irreversible ways. Together they describe divergent futures that encompass a significant portion of the underlying uncertainties in the main driving forces. They cover a wide range of key "future" characteristics such as population growth, economic development, and technological change. For this reason, their plausibility or feasibility should not be considered solely on the basis of an extrapolation of current economic, technological, and social trends."
We are reminded by this of the basic rule that scenarios are not forecasts, but describe a range of different possible futures designed to assist long-term strategic planning.
Economic growth versus sustainability: Unless the fossil-intensive variant of A1 (A1FI) can be replaced by renewable energy (A1T), the level of atmospheric greenhouse gases will increase rapidly. In 1990, the carbon dioxide emissions from fossil fuel amounted to 6.0 gigatons of carbon (6.0 GtC). Emissions in 2100 in the fossil-intensive scenario (A1FI) are estimated to reach 30.3 GtC, compared with 13.1 GtC in the intermediate balanced-energy version and 4.3 GtC if fossil fuels are replaced by renewables. The environmentally oriented global scenario, B1, would cause emissions of 5.2 GtC in 2100.1
The global population in all three A1 scenarios, and the "green" B1 scenario, would be 7 billion in 2100 according to the detailed projections in the SRES report. The global GDP projection for 2100 in the three A1 scenarios is between $525 and $550 trillion at 1990 prices, compared with $328 trillion for B1. The per capita income ratio between developed countries and (then) emerging economics was 16.1 in 1990 – indicating a high degree of inequality (China was at an early stage of its economic revolution, and the BRIC acronym for Brazil, Russia, India and China, countries considered to be at a similar stage of newly advanced economic development, was coined as late as 2001). The projections for the A1 scenarios were 1.5 or 1.6 for the end of the 21st century, and 1.8 for B1 – suggesting that most countries will reach developed status during what is currently named the Asian century but includes Latin America and many countries in Africa and other regions.
Global versus regional: The above projections contrast starkly with the regionalised A2 scenario, and to a lesser extent with B2 despite its relative sensitivity to the environment. Estimated CO2 emissions for A2 for 2100 were 28.9 GtC, not much below A1FI, and 13.8 GtC for B2. Population was projected to reach an unsustainable 15.1 billion in B1 and 10.4 billion in B2 by 2100. World GDP in that year would be $243 trillion in B1 (to share among 15.1 billion people) and $235 trillion in B2. The per capita income ratio between developed and emerging economies would be reduced much less than for the globally oriented scenarios: to 4.2 for A2 and 3.0 for B2.
Therefore, based on sets of complex assumptions making up the critical uncertainties on whether the world puts its main policy priorities on growth or the environment, a global orientation is distinctly preferable to regionalism. The heterogeneous environmentally insensitive A2 scenario looks an even worse case than the global fossil-fuel dominated growth scenario, but both are unsustainable in the long term given the realism of the climate assumptions.
The most important finding apart from the environmental damage caused by greenhouse gases is that a world weaned off fossil fuels will secure similar economic growth to the other A1 variants – sustainable growth. It would become the new green solution. This ought to ring some very loud bells in the second decade of the 21st century – the message that fossil fuels must be phased out should be prominent in any current effort to interpret and plan for the future. In a highly interconnected world, this includes the music sector scenario project.
Following hot upon the heels of the Global Financial Crisis, the World Economic Forum (WEF) initiated a scenario-planning study to help define the future of the banking system and other financial institutions which had literally triggered the crisis in 2007. It included near term prospects to 2012 and scenarios to 2020, and was published in 2010. A companion volume presented the actual scenarios. This project has already benefited from the WEF's annual identification of global risk factors (Global Risk Factors and Music in Australia devotes a substantial section to the subject).
The purpose of this paper is to add to our ideas for developing the music sector scenarios, not to lament the past. Many have strong opinions about the continuing economic sluggishness that remain a concern in late 2014, fully seven years after the Global Financial Crisis struck. Some may wish to reflect on the scenario builders' summary that follows, but it shouldn't be allowed to affect the real purpose of this exercise. The following excerpts are from the beginning of the executive summary of the project. There is more detail there.2
Along the way to identifying the critical uncertainties, the WEF identified a set of key driving forces as they existed when the GFC hit. Population growth and structure were considered significant but fairly predictable and hard to influence. Economic forces were obviously of major importance, and political drivers become crucial in times of crises. Energy-related influences relate to the wealth distribution of fossil fuel exporters and the response to the threat of climate change, including the pricing of carbon emissions and policies on renewables.
The WEF authors proceeded to explain the situation that led to the Global Financial Crisis. The initial part of their summary is reproduced below3. It is important not only as a background to these particular scenarios but because it describes how the most serious recession since the 1930s was generated. Given that this has medium- to long-term consequences way beyond the financial sector, it is directly relevant to other globally based scenarios including the music project.
During the 20 years leading to the financial crisis in 2007, the global economy entered a period of remarkable macroeconomic stability. The principal strategies of the global banks were supported by a resurgent belief in free markets, small government and self-regulation. At the same time, the globalisation of financial markets and the growth of the emerging-market economies subtly shifted the prevailing macroeconomic order, precipitating a major restructuring of the global institutional investment landscape.
Within this environment, the wholesale financial system – in which we include corporate and institutional banks, traditional and alternative asset managers, sovereign and institutional investors, insurance providers and financial exchanges – enjoyed unprecedented earnings growth, particularly throughout the most recent credit cycle, thanks to expansionary monetary policies, financial globalization and sustained economic expansion.
The principal strategies of the global banks were supported by a resurgent belief in free markets, small government and self-regulation, supported by relaxations such as the 2004 amendment of the net capital rule for investment banks with assets over US$ 5 billion, which effectively shifted certain oversight responsibilities from the Securities and Exchange Commission and European Union regulators directly onto the banks themselves.
At the same time, the globalization of financial markets and the growth in emerging market economies subtly shifted the prevailing macroeconomic order, precipitating a major restructuring of the global institutional investment landscape. Globally, foreign ownership of financial assets reached US$ 67 trillion at the beginning of 2008, roughly one-third of total global financial assets, up from just US$ 17 trillion, or one-fifth of global financial assets, a decade earlier. By 2008, the central banks and sovereign funds of Asian and Middle Eastern countries were estimated to have amassed some US$ 7 trillion in combined assets.
Much of this purchasing activity was fuelled by countries with expansionary monetary policies that required them to accumulate sizable US dollar fixed income assets to limit currency fluctuations. This was particularly true for countries with trade surpluses in Asia and energy exporters in the Middle East. By adding significantly to demand for dollar assets, these policies flooded the market with liquidity, helping to generate significant upward pressure on dollar-denominated assets, and keeping interest rates on dollar-denominated debt low. This surfeit of liquidity contributed to significant behavioural and market distortions. Consumer and investor euphoria pushed down savings ratios in the OECD countries, despite rising disposable incomes.
In summary, by the beginning of 2007, the financial services landscape had changed dramatically from its condition in 1984. After nearly two decades of healthy growth, the industry as a whole had shifted towards larger levels of leveraged position-taking, aided by flush liquidity conditions and a permissive regulatory environment. The landscape as a whole had become much more tightly interlinked following the erosion of boundaries between financial business models. National boundaries also became significantly less important, resulting in increased correlation between global asset returns."
First and foremost, the WEF scenarios are based on two sets of critical uncertainties, as shown in the right-hand graph. The WEF scenario report (p 9) explains the model and sets the stage in what is a classical scenario-planning approach (italics added):
"In answering the project's central question, the scenarios vary along two critical uncertainties: the pace of the ongoing geo-economic power shift from today's advanced economies to the emerging world and the degree of international coordination on financial policy. These critical uncertainties have been defined based on a survey of the World Economic Forum's industry partners, interviews with leaders in the field, and extensive research. Based on this analysis, four plausible and compelling views emerge about how the global financial system might evolve between now and the year 2020. Each of these scenarios take a myriad of underlying driving forces into account – such as the evolution of energy and commodity prices, global economic growth, fiscal policies, trade regimes, climate change, exchange rate policies, extremism, demographics and global wealth distribution."
The scenario stories themselves are quite elaborate, designed to attract and engage the reader. They use the device of a fictive future commentator comparing the "current" state of affairs in 2020 with the situation back in 2008. There are also interviews with executives on what it is like working in 2020 in the world of a particular scenario. Such devices are sometimes used in scenario presentations to attract readers.
The brief summaries in the above matrix were derived from a table in each scenario showing "at a glance" how the financial regulations changed from 2008 to 2020 – "who leads?", "what is regulated?", "what cooperation exists?" and "what bodies dominate?". Of course, 80 words can give only a crude impression of the scenario details.4
The final important lesson from the WEF scenario work is its view on how scenarios develop and proceed. Reassuringly, the descriptions support our own independently developed flowchart for the music sector (shown in the beginning of this paper). It also illustrates the urgency to take the two last steps without which scenarios cannot be properly structured – formulating the central question (step 1) and the critical uncertainties (step 3).
Step 1: The central question in the WEF scenarios was: How might the governance and structure of the global financial system evolve over both the near-term and the long-term? The scenario horizon was 2020, 12 years after the GFC.
The central question for the music sector, with a 20-year horizon to 2035, has yet to be formulated.
Step 2: The driving forces were basically derived from WEF's annual global risk survey for 2008, which identified 34 global risk factors which the scenario team ranked according to their degree of importance for the development of financial markets and the degree of uncertainty about their future development.
Our published flowchart at the beginning of the paper identifies 11 driving forces – seven globally based and four that have more of an Australian orientation but with strong influences from abroad.
Step 3 (quoted in full): "Critical uncertainties are those driving forces that are both highly important and highly uncertain. Numerous critical uncertainties surround the future development of the global financial system, including changes in energy prices and the speed of global growth. The deductive approach to scenario development used for this project requires a focus on two important and largely independent critical uncertainties. Workshop participants identified the "degree of international coordination on financial policy" and the "pace of geo-economic power shifts" as the two most important critical uncertainties facing the global financial system. The two "macro" critical uncertainties have thus been defined based on a myriad of underlying driving forces, e.g. the evolution of energy and commodity prices, global economic growth, fiscal policies, trade regimes and exchange rate policies."
Identifying the critical uncertainties is a crucial next step in the scenario-building process for the music sector. Other inputs from the music sector scenarios come from the Music Trust including the Knowledge Base itself, and from the responses to the survey we conducted with music sector representatives around the middle of 2014.
Step 4: Constructing scenario frameworks. To develop four significantly different scenario stories, the two most important critical uncertainties are charted on two axes – the matrix illustration at the beginning of the section on scenario structure.
The music sector project will proceed in similar fashion.
Step 5: Developing scenario stories/reading the scenarios. Each quadrant of the framework represents a different possible future world, summarised in the graphics above. Of course, the WEF stories were not confined to a graph; neither will it be in the music sector study but matrix graphs will be used to convey key messages and findings.
The music sector graph includes an important process. Scenario planning is, as has often been said, the "art of strategic conversation".<Kees van der Heijden, Scenarios: The Art of Strategic Conversation. John Wiley & Sons, 1996. Scenarios cannot just be dumped on someone's desk expecting action. The scenario-planning efforts reported in this paper were all large-scale, involving extensive communication in general. The Music Trust benefits from its long association across the music sector but is constrained, like other arts organisations, by limited personnel and funds. The request for feedback is important for the development of acceptable scenarios that members across the music sector can accept and act upon.
The eight-step graphic shows that the process doesn't end here, though the WEF notes the subsequent steps without comment. The compilation of acceptable scenario stories is obviously only a means to an end and the final descriptions relate to the music sector.
Step 6: Stakeholder implications. The stakeholders are primarily the participants of the music sector itself, but it is so diverse that the scenarios, even after being approved in the feedback process, may need further detail to be useful to all concerned. Given that the total scenarios would be needed as a framework for "all things music", supplementary scenarios derived from the main set would be the natural extension. It would seem inadvisable to start all afresh on part of the music sector.
Step 7: Strategic options. Long-range planning is strategic by definition, whether developed by industry interests, educationalists, or in communication with government. Similar considerations apply when considering step 7 as when considering step 6. An overall music sector strategy should be part of the main scenarios, and supplemented as required for specific parts of the sector.
Step 8: Indicators and signposts. Situations change, and the landscapes defined by future scenarios are likely to change in many ways over five years, or less. The most important feature of step 8 is that it dovetails back to step 1, which concerns the formulation of the central question. Scenario planning should be seen as a continuing process and the central question based on current perceptions may not be the central question in five years' time if the indicators and signposts for the sector change. As is almost certain to happen.
These scenarios were commissioned by the European Commission to help assess the long-term future of the European Union (EU). The description is based on the executive summary which is available. It was published in October 2011.
It identified six relevant dimensions of the future:
Global demographic and societal challenges
Energy and natural resource security and efficiency, environment and climate change
Economy and technology prospects
Government and governance: EU frontiers, integration and global role
Territorial and mobility dynamics
Research, education and innovation.
It didn't develop this list, or the more detailed analysis reported below, into formal critical uncertainties. Despite this, the detailed approach to the identification of factors and how they affected the three EU scenarios has been most helpful, as shown below.
The scenarios were shaped with a view to combine the global perspectives (including future dynamics and trends that are mainly out of reach of EU policies), focusing on EU integration. The scenarios are deliberately Euro (EU)-centric. The focus is on three different EU trajectories, with the rest of the world as backdrop. The rest of the world may follow different trajectories depending on whether it does better, worse or similar to the EU. Reading the summary EU scenarios suggests that not all the nine global scenarios that are theoretically possible from a combination of global and EU variants are realistic (Table 1). The rest of the world wins out in the most pessimistic EU scenarios, and EU wins or retains share in the "EU renaissance" scenario. This is readily accommodated in the three EU scenarios.
The three EU scenarios were:
Nobody cares: standstill in European integration. Europe is seen in a process of prolonged "muddling through" in the absence of guiding and visionary actors and the lack of a redesigned policy framework. Economic growth remains low in Europe. The divergence between the EU and the leading world economies – USA in the short-medium term, but also China in the longer term – widens.
EU under threats: a fragmented Europe (global economic decline, with protectionist reactions, increased transaction costs, increasingly congested infrastructures). Risks include civil wars, nuclear conflicts, and radicalised governments. EU is heading towards breakdown.
EU renaissance: Global security is achieved, with the generalized enforcement of human rights and the rule of law. The world undergoes a global democratisation of power supported by increasingly active non-state actors, global public policy networks and the media. The EU is enlarged in the east and south, and political, fiscal and military integration is consolidated. There is strong public support for challenging targets such as climate change and energy efficiency. The EU manages to optimally design its technological and research policies, to target the right domains and methods.
Table 2 summarises the three scenarios in terms of each of the six dimensions.
The music sector model was developed independently of the Global Europe 2050 scenarios but the similarities are significant despite the different purposes leading to the development of the models, including the fact that Global Europe 2050 deals with the future of the entire European Union and our model with a small but important component of Australian social, cultural and economic life. Table 3 compares the basic global scenario components or dimensions (six in the European model and seven global components for music, plus four added when specifically addressing Australia).
At this level, both models are specific in addressing energy and the environment, the economy, global governance (which seems to have gained importance as a scenario factor in recent years), and innovation and related issues. The music sector model doesn't have a specific slot for what Global Europe 2050 calls "territorial and mobility dynamics" – but this largely concerns the positive and negative aspects of global urbanisation which is bound to be an increasingly serious factor as the world population keeps growing. Apart from the reminder that the Global Europe 2050 model provides, urbanisation is for better or worse part and parcel of global growth and distribution, and also of global governance which we have independently identified in the music sector model.
Global Europe 2050, on the other hand, does not specify cultural policy among the main dimensions, which is unsurprising as we are dealing with the basic building blocks for the entire EU scenarios. If we go into more detail by looking at each of the three scenario stories, however, the best case "EU renaissance" is quite specific in its identification of cultural policy as a positive factor, whereas the "business as usual muddling through" scenario ("nobody cares") and the worst-case "threats" scenario contain no mention of cultural policy. "Nobody cares" concentrates on the economy and welcomes cheap migrant workers. It appears from the scenario stories to be unconcerned with climate change, global governance, inequality, and even science and technology (at least these factors are not made explicit). The worst case scenario seems to be mildly concerned with foreign trade and investment and global governance but we can't be sure that the summary we read covers the full detail. Table 4 gives a general impression based on what we picked up from the scenario stories. It would need further research to confirm that this is exactly what the scenario builders intended, but it is close enough for our purposes.
The renaissance model, importantly, treats all 11 dimensions shown in Table 4 as positive inputs into what would also be a best case for the Australian music sector, if it was based on a similar model. Migration (into the EU) seems to be the one partial exception, possibly associated with the publicly perceived threat that may even have penetrated into the scenario planners' realm in view of the substantial net migration into Europe largely from the Middle East which started about 40 years ago. Australia is mainly a country of people who arrived since the late 18th century, and racial prejudice is not expected to enter our analysis.
How bad should the worst case be? The general opinion, which we share, is that scenarios that include, say, events like global wars or world-shattering natural disasters would change the whole context so much that proper analysis and planning becomes impossible. Rather, worst cases should describe an unfavourable future which remains potentially capable of remedy through mitigating policies.
Similar considerations apply to a "best case" scenario – it wouldn't be credible if it followed the teaching of Professor Pangloss in Voltaire's 1759 satirical novella Candide that "all is for the best in this best of all possible worlds" – a world that would continue to be best no matter what. 5 To be credible, any positive scenario needs to be nurtured and protected – the Pangloss view was ridiculed 250 years ago and remains naïve at best. The best case should be more like the EU "renaissance" scenario (or a scenario to replace fossil fuels) which is potentially achievable through realistic policies to counteract threats and develop opportunities.
Formulating the central question is the essential first step in the scenario-planning process. It needs to happen for the work to proceed. Secondly two sets of critical uncertainties need to be nominated. They need to be as independently of each other (uncorrelated) as possible. The project cannot develop until these two steps have been taken.
Putting Numbers on Our Cultural Assets: Not Yet Possible (27.3.2014)
How to Explore the Cultural Future (7.4.2014)
Cultural and Creative Activity in Australia (15.4.2014)
Global Risk Factors and Music in Australia (17.10.2014)
Scenarios, Virtual History, and Chaos (20.10.2014)
Ideas from Other Global Scenarios (8.12.2014)
Four Global Scenarios Set the Stage (18.12.2014)
Music Sector Structure for Scenarios (28.2.2015)
Valuing the Invaluable (5.3.2015)
Some Big Possible Positives – Or? (20.6.2015)
A First Set of Music Sector Scenarios (23.6.2015)
Global Leadership Challenges: A Missing Link in the Scenario Planning (31.10.2015)
Present and Future Changes and Their Role in the Scenarios (20.12.2015)
Complex Adaptive Systems and Music (9.1.2016)
Hans Hoegh-Guldberg. Entered on Knowledge Base 8 December 2014.
The timing of renewables replacing fossil fuels is important – the longer the delay, the less effect by the end of the century. The projections of fossil fuel emissions show 2020 and 2050 as intermediate years. In A1B, the "balanced" fuels variant, emissions reach 12.1 GtC in 2020 and 16.0 GtC in 2050, before declining to 13.1 GtC by 2100. In the "green" scenarios both A1T and B1 reach 10.0 GtC in 2020, 12.3 and 11.7 GtC, respectively, in 2050, and 4.3 and 5.2 GtC in 2100. The green scenarios are quicker off the mark with the introduction of renewables than the balanced-energy scenario whose emissions only start to reduce in the second half of the century. The comparison with the fossil-intensive growth scenario is blatant: emissions rise from 12.1 GtC in 2020 to 23.1 GtC in 2050 and 30.3 GtC in 2100. The path for the regionalised scenario A2 is almost as bad for the full period and actually worse in the second half: from 11.0 to 16.5 GtC to 2050 and then a jump to 28.9 GtC by 2100, suggesting that emissions under that scenario would keep growing into the 22nd century.↩
World Economic Forum in collaboration with Oliver Wyman, The Future of the Global Financial System: Navigating the Challenges Ahead, Geneva 2010.↩
See the companion volume containing the scenarios, pp 12-15 (slightly abbreviated).↩
The 80-word summaries omit a common feature in all four "at a glance" tables: "Western countries lead the development of standards for accounting, reporting and supervision, and export their regulatory structures to the rest of the world." There will be no replacement, in other words, in the conventional procedures of financial institutions which are western inventions – the critical uncertainties are nevertheless capable of producing four very different global situations in little more than a decade.↩
Pangloss was a parody of German philosopher Gottfried Leibniz and French mathematician Pierre Louis Maupertuis. Leibniz claimed in 1710 that the world he lived in was the best possible, basically because it has to be with an omni-benevolent God in charge. His critics, including Voltaire, argued that the actual degree of suffering was too severe to justify belief that God created the "best of all possible worlds" (Wikipedia).↩
Hans Hoegh-Guldberg
Hans founded his own consulting firm, Economic Strategies Pty Ltd, in 1984, following 25 years with larger organisations. He specialised from the outset in applied cultural economics — one of his first major projects was The Australian Music Industry for the Music Board of the Australia Council (published in 1987), which also marks his first connection with Richard Letts who was the Director of the Music Board in the mid-1980s. Hans first assisted the Music Council of Australia in 2000 and between 2006 and 2008 proposed and developed the Knowledge Base, returning in an active capacity as its editor in 2011. In November 2013 the Knowledge Base was transferred to The Music Trust, with MCA's full cooperation.
Between 2000 and 2010 Hans also authored or co-authored several major domestic and international climate change projects, using scenario planning techniques to develop alternative long-term futures. He has for several years been exploring the similarities between the economics of cultural and ecological change, and their continued lack of political clout which is to a large extent due to conventional GDP data being unable to measure the true value of our cultural and environmental capital. This was announced as a major scenario-planning project for The Music Trust in March 2014 (articles of particular relevance to the project are marked *, below).
https://www.musicinaustralia.org.au/authors/author/hans-hoegh-guldberg-2/
Instrumental Music Education
AMC, the Art Music Composers Organisation
APRA and AMCOS
Issues Mapping

redpajama_set_name: RedPajamaCommonCrawl


For the past two years, Eugene Tyler Band has been on the road, singing songs about angry people, judgmental dogs, powerlifting boozehounds, sexual underachievers and altar boys on acid. With twanging guitars and soaring vocals, the duo has been delivering jacked up acoustic sets to clubs, breweries, farmers markets and curbsides. Their sophomore record, Young Randy, is due out in 2018, and sees the band bringing the stripped down intensity of their live shows into the studio. In support of the new record, Eugene Tyler Band is on pace to play well over 100 shows this year, bringing their unique yet classic songwriting and guitar interplay to new and established audiences around the country.
More info available at eugenetylerband.com.


Arnot Realty Corporation, one of the largest real estate developers in the Southern Tier of NYS with a portfolio of over 1.5 million square feet of commercial real estate, has been a driving force in economic development for nearly a century.
Our portfolio includes the Arnot Mall, an enclose one million square foot shopping center; the Shops at Chambers, an open air shopping plaza; various office buildings located in Elmira, Horseheads, Big Flats and Corning; Hickory Grove Apartments which includes two luxury apartment communities; and over 200 acres of undeveloped land.
We are committed to providing our tenants, residents, and the broader community with outstanding Quality, Experience, and Convenience in everything we do.
Chemung County is poised in the southern Finger Lakes region of New York. Known best for its rolling hills, award winning wineries, glassmaking, fine arts and glacier carved lakes; the Finger Lakes of New York has become a popular tourist destination, drawing millions of tourists annually.
The Southern Tier has a strong industrial presence as home to major employers including Corning, Inc., Hardinge, Inc., Talisman Energy, CAF USA, Eaton Cutler-Hammer, Emhart Glass, General Revenue Corporation, The Hilliard Corporation, Howell Packaging, 1st Corporation, Kennedy Valve, St. Paul Travelers, Synthes USA, Vulcraft Group and many more.


Of Butterflies and Bees→Gardening Blog→Why we love front gardens!
This week we are working on a great new job to transform a small, overgrown Belsize Park front garden into a wildlife habitat. Columns of herbs adding a formal edge to the design. A palette of whites and purples aiming to delight the residents in all 7 of the flats. The planting of season round nectar rich plants aiming to attract all manner of butterflies and bees whilst adding texture and shape. We have also included the very lovely Rosa rugosa 'Scabrosa' to our planting list. Apart from being shade tolerant, it will provide lovely big hips in the Autumn, great for making rosehip syrup, or a delish rosehip jam.
So, why do we love front gardens? Because we say to all you folk out there, rip up the drive, get rid of that concrete and show your neighbours and the community around you, that front gardens can do more than looking beautiful – they can be beneficial too!


It's true, the capsule wardrobe is not for everyone. I get so many questions about this topic that I thought it would be a great time to do a pros and cons post. In the past, the pros outweighed the cons, but lately I've felt a shift in the opposite direction…you'll have to decide what you think! . PROS - I buy less clothes, which helps me save money and keeps me focused of purchasing quality over quantity. And there are less clothes in my closet, so my shelves and drawers stay more organized. Which means, getting dressed is much simpler and I tend to look more put together since I try to only keep items that still look and feel great. . CONS - Getting creative with my outfits has to be done through my shoes, coats, scarves, purses and jewelry, since I don't have a huge variety in my clothes. And I have to wash clothes more often, which has been difficult when traveling light. So, on that note, since I wash and wear the same items over and over, week after week, clothes get old and die off sooner. . So, what do you think...is the capsule wardrobe for you? If you are already deep into it, is there a pro or con that I missed? Let me know in the comments below!
Esta fue una de las nuevas imágenes que mostré en la pasada edición del @xposurexpf en Emiratos Árabes.Fue un verdadero placer asistir y disfrutar a este importante evento fotográfico. Una experiencia inolvidable. Espero que nos veamos pronto. This image was one of the new that I showed in the past edition of @xposurexpf at Arabian Emirates. It was a real pleasure to attend and enjoy of this important photo event. An unforgettable experience. Hope see you soon.
Pink. __________________________________________________ . . .


A basic knowledge of HTML tags is assumed, but if you need guidance, or for reference, use w3schools.com.
Title tags are important because they essentially tell search engines and people alike what the theme of that page will be, help Google decide the page relevancy to a user's search and act as a ranking factor.
Meta descriptions on the other hand act as a brief summary of what that page contains and are not a ranking factor but can reinforce a decision to click on your URL.
Avoid duplication – each page should be unique therefore each title tag and description should be too.
Include your keyword (at this point this is the page theme as search engines are very intuitive nowadays) in your title tag and your description.
Aim for your title and description to be 55 and 155 characters or less respectively and include your company name as such: "Page theme/keyword | Company Name".
To do an SEO health check on your title tags and descriptions, a page at a time, download the MozBar and click on the page analysis button. This will show you the information on title tags and meta descriptions for that page.
If you have a website with a fair number of pages you can use Google Search Console (previously called Webmaster Tools) to find a summary of your site's content. Doing this will allow you to identify any elements that are duplicated or are too long or too short.
Headings (H1, H2s etc), alt tags and keyword density should all be considered but this shouldn't be at the expense of how engaging and useful your content is. There's no point getting content found if it sounds spammy and repetitive.
Word count – as a guide aim for 300+ words as a minimum.
Keyword density – avoid sounding spammy but use your keyword and don't be afraid of using synonyms (Google's use of Latent Symantic Indexing means that it knows the general context of a page without you having to repeat your keywords).
Consider the use of keywords in your headings.
Use pictures – pictures are great at explaining things quickly and alt text helps describe the pictures to visually impaired customers.
Using the MozBar, pick the analyse page option. The page analysis button will let you check all of the on page factors that go into making a web page relevant for a particular query.
Google doesn't want multiple copies of the same information as they serve little purpose for a user's experience. It also looks as though you are trying to spam the search results by adding loads of pages on the same topic. You can do a simple check to see if Google thinks you have duplicate content on your site using a command in the Google search box.
In order to show you the most relevant results, we have omitted some entries very similar to the 282 already displayed.
Having some pages omitted is to be expected, especially on a large site. However, if you are experiencing issues getting pages indexed that you think should be indexed this could point to the issue. For pages that are duplicated due to filters (for instance search results on ecommerce sites) use a canonical tag to point to the main page. If, conversely, you have written a load of blogs on the same topic, make sure to see which page ranks best, has the most traffic and authority – collate all the copy from all other pages that is useful onto that page and then permanently redirect all other versions to the main one that will remain.
Google wants to provide users with content that provides relevant answers quickly. That means speed. We've all been on websites that take an age to load and our response was likely to leave the page and go elsewhere. An increase in mobile usage means that page load speed has become more of a ranking factor and slow load times should not be ignored.
There are loads of free tools for checking the speed of your site but you might as well go to the horse's mouth. Use the Google PageSpeedInsights or Pingdom Tools and you will get a list of suggestions for your developer. While the tool itself is free, asking your developer to make the changes may not be. However, if the site speed is dreadful (say 10/100), I'd suggest that a web development company should be fixing this for free as they built a site that is not up to scratch.
If you compare how many times you used your phone in a day to how many times you use your desktop you wouldn't be surprised to learn that having a mobile-friendly website is a ranking factor. Google wants to promote those sites that cater for users on mobile devices, especially now that they have a mobile first index. So if your site isn't mobile friendly yet, change that. There is a very quick and simple test you can run through Google's own Mobile-Friendly Test.
This is a quick way to identify what page resources Google can load and what it cannot, ie what Google can "see". This can highlight issues that can be addressed with your web developer.
There's no excuse for having huge image files on your site because there are so many free tools that will allow you to reduce the size and compress files without affecting image quality too much. It is a fine balance though. You need a good enough quality file to be useful to the user without them having to use all their data just to see a banner image.
Firstly, you need to crawl your site and look for files that are too big. You can do this with one of my favourite tools called Screaming Frog (free for up to 500 URLs).
Download the free version of Screaming Frog and make sure you select "check images" and the mode is on "spider".
Once that is done simply enter your website URL and click start. Once the crawl is finished you will be able to see all the images that Google can crawl on your site. Scroll along to image size and order by biggest size. If you have some large image files that you think you can reduce in size and compress get it sorted!
It's important to keep a check on pages that were once live and now are not. Pages that break (ie that give a 404 Page Not Found error) can occur for many reasons like accidental deletion or URL change. Although having 404 pages isn't of itself a ranking factor, the pages could still be indexed, generate traffic and have inbound links. If you lose these pages you lose the traffic and any value the link was passing to your website. Therefore it's always best practice to review your broken pages and redirect to a relevant page or simply fix them (unless they are causing duplicate content issues as mentioned above).
To identify broken pages you will need to log on to your Google Search Console and navigate to Crawl > Crawl Errors > "Not Found" tab. Here you will see a list of all the pages that Google has crawled which are providing a server response of 404.
You can then highlight all of these pages and download them to a file. There are tools you can use to further qualify all these URLs to see if they are worth redirecting but at this stage we just want to perform an SEO health check and not a full in-depth audit. Therefore do a visual check of all the URLs and check if you see any URLs that really should be working. Make a list and speak to your web developer, or if you have access, update your redirect list.
Although many websites use servers in foreign locations, there are still many people who believe that the location of your server can have an effect on your local search visibility. So if your website is hosted in Germany, Google is more likely to think that your website is more useful to German users than if it is in York in England, for example. It's not going to be a game changer if your site is hosted elsewhere, as Google takes into account many other variables like your Top Level Domain (eg .co.uk) or which territory you may have specified as being most relevant in Search Console; but if your server is located very far from the user, this could affect the speed at which the site loads for that user. So if you know that you want people in the UK to view your site and other territories are not so important to you, it stands to reason to host your site in the UK.
The main thing is that your website is hosted in a way that gives your users fast access to it. A way to do that is to make sure it's hosted locally.
You can check the location of your IP by going to a website that does this automatically, for example iplocation.net.
If you see an HTTPS before your domain name that means your website is secure, using SSL to move data. In other words, the data is encrypted and more secure than HTTP – extremely important for users, especially if they are adding payment details onto your site. As this provides more security for the user, Google is more likely to promote a site that uses HTTPS above one that uses HTTP.
If your website doesn't use HTTPS, don't panic. It may be that there's no business case for your website to change over to HTTPS. The acid test is to ask yourself "if I was a customer coming to my website, would I want any data I entered to be encrypted and secure? And do I want them to be shown a sign that says 'site not secure'?" Either way, I'd recommend making the move to HTTPS.
Google certainly seems to agree, and because of this HTTPS is fast becoming an expectation of many websites. Some browsers even warn users if the site they are entering is not on HTTPS.
Robots.txt is a file that acts as a map for Google and other bots. It tells Google how to crawl your website, what pages to crawl and what pages not to crawl and index, as well as the location of your sitemap. Google ideally wants to access everything so it can choose what is and isn't relevant, but you may decide that certain areas of your site should be off limits to Google, for example client login pages. By adding a snippet of code to this file you can tell Google not to crawl this area.
This file is important! Essentially, what you are doing is allowing or restricting access to the pages on your website. It is easy to accidentally write a snippet of code which tells Google not to crawl the entire site (we have seen this before).
If you have a robots.txt file it should be located on the root of your domain for example "www.example.com/robots.txt". You can easily check this file by going to Search Console > Crawl > "robots.txt Tester".
This will show you if there is a robots.txt file and if there are any suggestions for improvements. If you are in doubt as to whether a page is accessible you will also be able to type in the URL to see if it's blocked or not.
So there you have it: a cheap and cheerful website SEO health check!
Eleanor Reynolds has over 6 years experience in digital marketing and is a senior owned media consultant at Hallam Internet. Email eleanor.reynolds@hallam.co.uk. Twitter @HallamInternet.


Africa Oil & Power talks to Luris Mulla about developing South Sudan's economy and creating opportunities for its people.
Oil prices rise, Nigeria targets 3 mn bpd, Chad to get oil storage.
AOP talked to Prince Engr Arthur, Chairman of Oranto Petroleum, about key market trends in South Sudan, including new actors in the market, the country's exploration potential and the need for infrastructure to be developed.
AOP talked to Babatunde O. Odeyemi, General Manager of Nile Delta Petroleum Company Limited, about the differences in doing business in a mature market like Nigeria, versus a developing market like South Sudan.
AOP talks to Pioneer Energy about the obstacles Africa faces in attracting investment to key sectors, like power.
AOP talks to Sudd Petroleum Operating Company about the company's plans to restart production.


It's been a while since we have spoken about what's being going at Gath3r, so this blog is meant to serve as a teaser for great things to come.
Some background: Our original ICO was planned for the last quarter of last year, however due to the bear market and decline in crypto currency prices and general negative sentiment surrounding initial coin offerings and crypto currency in general, we decided to take a call and postpone our public sale until market conditions are more favorable. As with many other projects in this space we had limited funds and had to decide how to best use them. We chose to limit marketing and spend more on building out Gath3r and continue paying our developers.
Now as sentiment is starting to turn and we are seeing renewed interest in cryptocurrencies, you can expect a great many things to come in a short span of time. Some of these announcements will include new public sale dates, a number of partnerships and customers, new senior and junior team members and board members, a crucial and very exciting new feature for Gath3r (which we believe the community will love).
You can expect us to start making some announcements within the next few weeks! While we may have been quiet on the marketing side and not saying much, rest assured our team has been hard at work making new partnerships and building out Gath3r. We would like to thank all of our supporters for keeping faith and confidence in us.
Stay tuned to our Social Media channels for our upcoming announcements!


text:
"Friends of Baltimore" – Eagle block
I've just started Susan Garman's "Friends of Baltimore" pattern. Here's my first block! I've always wanted to do a Baltimore Album quilt, and I'm finding that intricate handwork is a great stress reliever. I was recently diagnosed with osteoarthritis, and I don't know how long I'll be able to do this kind of work, so I figured I better start now if I want to complete a quilt like this in my lifetime.
Baltimore Album quilts are a style that originated in Baltimore, Maryland, around 1840. Each block is intricate and different, and most feature flowers; buildings, ships and bouquets. Many of these quilts were signed, using ink, and embellished with embroidery. These were not common bed quilts. They were highly prized family heirlooms, and were carefully preserved, so a fair number of examples survive today.
In Susan Garman's design, the eagle holds an American flag (I embroidered my stars in the circular Colonial formation), and an olive branch and arrows, symbolizing America's desire for peace but readiness for war. In his beak, he holds a spray of wild red roses, the national flower. He also holds in his talons a "Liberty Pole" topped with a red "Liberty Cap." I was not familiar with the Liberty Pole until a few years ago, when researching my genealogy. I discovered that I am a descendant of Robert Philson (my fourth great grandfather), who was arrested after protesting taxes on whiskey during the Whiskey Rebellion. Here's information about him from Wikipedia:
Robert Philson (c. 1759 – July 25, 1831) was an Irish-American soldier and politician.
Philson was born in County Donegal, Ulster, Ireland, and immigrated to Pennsylvania with his uncle John Fletcher. They kept a store in Berlin, Bedford County, Pennsylvania.
In 1794, Philson was arrested for his involvement in the Whiskey Rebellion. He was sent to Philadelphia for trial, but he and his co-defendant, Herman Husband, were acquitted.[1]
Philson served as associate judge of Somerset County, Pennsylvania, for twenty years, and also served as a one-term congressman during the 16th United States Congress.
Philson was commissioned a brigadier general of the Second Brigade, Tenth Division, Pennsylvania militia on May 9, 1800. During the War of 1812, he served as a brigadier general of the Second Brigade, Twelfth Division, Pennsylvania Volunteers.
The Liberty Pole was used as a symbol of freedom during the American Revolutionary war, and was later used as a protest against federal taxes on whiskey during the Whiskey Rebellion. It was erected in towns across the thirteen colonies, and often topped with a Liberty Cap, which dates to the 4th century BC! It was used as a symbol during the French and American Revolutions, and starting in the 1790s, was used on U.S. coins, which featured Columbia/Liberty wearing the cap. It is usually portrayed as a red knit hat. (The pussyhat is an echo of this symbol!)
A note: Susan Garman died in January 2017; this was such a loss for the quilting community. Many of her patterns are available here: https://www.comequilt.com
"Friends of Baltimore" is available here:
https://www.comequilt.com/shop/Block-of-the-Month-Patterns/Friends-of-Baltimore.htm


Nuijten, Anne; Hoff, Inge; Høyland, Knut Vilhelm. (2018) Modeling Surface Temperatures for Snow-Covered Roads: A Case Study for a Heated Pavement in Bærum, Norway. Transportation Research Record. vol. 2672 (12).
Nuijten, Anne; Høyland, Knut Vilhelm. (2017) Modelling the thermal conductivity of a melting snow layer on a heated pavement. Cold Regions Science and Technology. vol. 140.
Nuijten, Anne. (2016) Runway temperature prediction, a case study for Oslo Airport, Norway. Cold Regions Science and Technology. vol. 125.
Nuijten, Anne; Høyland, Knut Vilhelm. (2016) Comparison of melting processes of dry uncompressed and compressed snow on heated pavements. Cold Regions Science and Technology. vol. 129.
Nuijten, Anne. (2018) The thermal conductivity of a melting snow layer and its effect on temperature prediction modelling of heated pavements. 2018. ISBN 978-82-326-2857-5.


text:
Moment of Truth on Forced Vaccines & The Courts
The Constitutionality of the Biden Vaccine Mandates | It was an Executive Order signed September 9th, 2021, that got everyone's attention. This EO required vaccination for all federal employees - that is unless you could get an exemption as required by law. But, it...
From When to Where to Why Was Jesus Born
Using the outline of a one-hundred-year-old service, we trace the reason for the coming of Jesus. Starting with the problem of sin entering the world when Adam and Eve ate the forbidden fruit to Jesus moving into our world. Along the way, we'll discover the enduring...
Twas the Blight Before Christmas, St. Fauci the Grinch…
When I was a child, I did childish things. For example, I was a staunch believer in Santa Claus. For a five-year-old kid, that's common sense, right? It had nothing to do with any religious belief. Seeing was believing! Christmas caroling, Christmas lights and...
Steps to Take Before Hospitalization & COVID-19 Treatment Guide
by DrLee4America
We now see government-dictated medical care at its worst in our history since the federal government mandated these ineffective and dangerous treatments for COVID-19, and then created financial incentives for hospitals and doctors to use only those "approved" (and...
Stopping the Threat that is China with a Pacific-Atlantic Alliance
by IQ al-Rassooli
I have been studying the latest reports about China and the Pacific countries. The rhetoric and military actions of the Chinese have gone up much higher in their pitch and numbers, indicating a possible early action against Taiwan. Secretary of State Anthony Blinken's...
China's Lust for Power is Only Just Beginning to Unfold
by Ilana Freedman
China stands at a definitive fork in the road - one that will determine the future of the world for generations to come. Xi Jinping, China's President, has made no secret about his dream to rule the world. He dreams of fulfilling the ancient vision of the 'middle...
Liberty Needs Disciples to Protect and Defend the Constitution
by Tim Aalders | Apr 13, 2021 | Constitution,
Guess what, America? A Revolution happened, and most of us were oblivious to it. Liberty needs Disciples to protect, defend, and teach the principles of the Constitution. Welcome to the Revolution!
How do you become a Disciple? Mr. Constitution, Tim Aalders, and his long-time friend and patriot, radio host Bryan Hyde, explain this not to be missed introduction to America's final revolution. Freedom rests on your commitment to defend your God-given rights because our elected officials care not about their oath to defend.
Tim Aalders
Known nationally as "Mr. Constitution," Co-Owner and Radio Host of "Freedom's Voice Talk Radio." which was nationally syndicated, reaching over 2.5 million listeners. Diverse Entrepreneur and Business owner having worked with international suppliers and vendors. Tim specializes in media, operations management, revenue generation, account expansion, vendor/client relations, sales, product management, start-up operations, contract negotiations, policy development, team building, and leadership. Author of "Constitution Betrayed; Disciples of Liberty." Tim has published over 600 audio, videos, and articles educating people on issues in Washington DC.
Meet a Man Who Relinquished His Political Party to Stay True to His Core Values
by Dr. Carol Swain | Mar 10, 2021 | Politics
Meet a man who relinquished his political party to stay true to his core values. Anything of great value comes with a cost. Vernon Jones is a well-known political figure, but he gained greater notoriety after leaving the democratic party in 2020. In this episode, Dr....
Congress Moves to Defund and De-power Police
by Lt. Randy Sutton | Mar 9, 2021 | Law and Order,
Candidate for Congress announces political action committee to provide loyalty to law-enforcement: Sam Peters was planning a congressional run in Nevada is a political activist devoted to putting candidates in office to support law-enforcement. Show host Randy Sutton...
The Disastrous Consequences of HR1280, the George Floyd Policing Act
by Dr. Ron and Linda Martinelli | Mar 8, 2021 | Law and Order,
HR1280, The George Floyd Policing Act, was passed by Congress. It is a disastrous and short-sighted law that endangers our first responder police officers' lives and removes their qualified immunity. Dr. Ron and Linda cannot fathom why our legislators endanger not...
Canceling Dr. Seuss, Masks Off in Texas and Sexual Harassment Claims
by Ladies of Liberty | Mar 8, 2021 | Lifestyle,
The cancel culture has gone wild with forcing the removal of books, documentaries, social media posts, businesses, and even presidents' and Supreme Court Justices. Are we really going off the deep end? Why are people falling for the cancel culture? How far does this...
Chaos, Division, and the Cancel Culture
by Tim Aalders | Mar 7, 2021 | Faith,
In a time of global chaos and political division, the questions are many and the answers are often in short supply. We hear phrases like 'Global Reset' and 'Agenda 21.' Concepts and organizational upheaval that will spin the world that we know into another orbit of...
Crisis of Compassion
by DrLee4America | Mar 6, 2021 | Healthcare,
What has happened to the doctor-patient relationship? Why are so many physicians abdicating their Oath of Hippocrates and saying they are not going to treat COVID? What is happening behind the scenes that BIG MEDICINE is participating in suppressing information on...
The Year America Lost Its Mind
by Ilana Freedman | Mar 5, 2021 | Politics,
Something happened to America this past year. It was the year when being white became a crime. It was the year of the pandemic. It was the year the election turned upside down. It was the year that America lost its mind. One of America's most insidious social...
Travel Withdrawals and Lifestyle Choices
Covid restrictions have decimated the travel industry like no other. As life slowly returns back to normal, we are all anxious to cruise and fly and soak up the sun and nightlife in faraway places once again. When will the normal return again, and will it ever be the...
Covid Vaccines: Risks the Media is Hiding
Talking today about the success with early home treatment for Covid-19 and the questions everyone is asking: What about the Covid vaccines? How effective are they? How safe are they? What are the risks we know? Who should consider the vaccine? If you have had Covid or...
The Great Reset by 2030
by Karen Schoen | Mar 4, 2021 | Politics,
Give Communists an inch, and they will take everything you own. On the current trajectory, personal ownership has become a thing of the past, explains Klaus Schwab of World Economic Forum, "You will own nothing by 2030, and you will be happy about it." Ever since I...
Joe Biden says Guns are a Threat to Government
by Tim Aalders | Mar 3, 2021 | Politics,
The problem is most people have no clue what the founders intended. Why? Because Democrats have refused to let it be taught. If Democrats succeed and infringe on the 2nd amendment⏤America as a constitutional Republic will be lost. Today on The Voice of the Nation,...
The Ides of March and the Return of Trump
by Lt. Joseph Pangaro | Mar 3, 2021 | Politics
President Donald Trump returns to the world stage at CPAC and declares the MAGA movement is not over. Just as Julius Caesar was destroyed by his friends⏤can Trump expect the same kind of treatment? Was the America First movement a real thing or a passing fancy to be...
Hollywood Actress Samaire Armstrong Speaks Out
by Dr. Carol Swain | Mar 3, 2021 | Lifestyle,
In this episode, we meet a young Hollywood actress who has chosen to use her voice and platform to speak the truth, no matter the cost. Samaire Armstrong, a young actress who has starred in many well-known TV series, such as The OC, The Mentalist, and Entourage,...
The Harmful Impact Social Media & Drugs Have On Our Kids
by Ladies of Liberty | Mar 2, 2021 | Media,
This show is jam-packed with conversations about social media influencers. Who are they, and what impact do they have on our kids' and teens' lives? Why are so many anti-anxiety, anti-depressant, and ADHD drugs prescribed like candy? The unintended consequences of...
Why is Free Speech So Important?
Freedom of speech, or free speech, is the fundamental concept of American society. It has always been and hopefully will always be the single biggest influence our society has had on every aspect of life and liberty throughout the world. Free speech is a...
Page 70 of 150« First«...102030...6869707172...8090100...»Last »


text:
Top Khamenei Aide: Iran Will Target U.S. Bases with Missiles if Attacked
A senior advisor to Supreme Leader Ali Khamenei has to attack all U.S. military bases in the region if the Trump administration shows any aggression against Iran. "If America intends to start a war against Iran, all military bases of this country in the region will become insecure," Major General Yahya Rahim Safavi said on Wednesday. He claimed that the Iranian military could hit regions up to 2,000 kilometers away from its borders with precision-striking missiles. The former chief commander of the Islamic Revolution Guards Corps (I.R.G.C.) further hailed Iran's growing defense capabilities and argued that the United States is no longer in a position to shape security and political dynamics across the world. "Despite claiming to be a superpower, deploying warships around the world and expanding its military bases, America's power is in decline – as this country has been unable to resolve the Syrian crisis and make its aspirations come true in this country [Syria]," Safavi was quoted as saying by I.R.G.C.-controlled Sepah News. "The ultimate goal of wars is to impose the political will of one country over another government and nation," he added. "And these imposed actions are carried out either through seizing parts of a country's territory or installing a particular type of government."
Comment: It is not the first time that a senior Iranian official is threatening to attack U.S. bases if Washington and its allies show any aggression against the Islamic Republic. In February, a senior member of Iran's parliament's National Security and Foreign Policy Commission and former Islamic Revolution Guards Corps (I.R.G.C.) official that if Washington "makes any mistake," Iran will attack Israel and U.S. military bases across the Middle East. "The Fifth Fleet of the U.S. Army has occupied a part of Bahrain, and the farthest military base of the enemy is stationed in the Indian Ocean. But these locations are within the reach of Iranian missiles. If the enemy makes a mistake, they will be razed to the ground," said Mojtaba Zonour, who has also served as an advisor to the Supreme Leader Ali Khamenei to the I.R.G.C. in the past.
He further noted that 36 U.S. bases are within the range of Iran's missile systems. Zonour also that the Islamic Republic had prepared its forces for asymmetric war and significantly advanced its missile capabilities. He threatened that Iran would launch a missile attack against Israel if Washington fired a missile against Iran. "And only 7 minutes is needed for the Iranian missile to hit Tel Aviv."
The Iranian threats come as tension between Washington and Tehran over the latter's ballistic missile program and support for terrorism is escalating. In his recent trip to the Middle East, President Donald Trump sought to create a new regional security alliance to counter terrorism and Iran's regional ambitions. Washington has also imposed new sanctions against Iran's ballistic missile program.
www.profvest.com
Buy GHRP-2 online in Canada
www.teplostroy.biz.ua


Kathleen Pemble - real, baby - RANTS!
: words, calling a spade a spade, clever people who are kind and generous to those less clever-or less privileged, erudition, etymology, I love maps, world geography, learning new things, being really bad at something new and getting better at it, or not getting better at it and doing it anyway, good teachers- of any and all things (you never know when or where they will show up), being a good sport, being a good friend, laughing when I'm not supposed to, hot tubs, the O.E.D., The Onion, reading, physical contact, poking fun, poker chips, Gumby and Pokey, being charmed, being charming, taking chances, ancient histories, social anthropology, clean sheets, being clean, getting dirty, getting clean again & also dessert...Anyone: "Would you like to see a dessert menu?" Me: "Hell, yes."


We deliver low cost International Moving solutions fromPhiladelphia to Berlin and International Freight services.
Ask us today about our Weekly consolidation from Philadelphia to Berlin and from most global financial capital cities worldwide.
We've assisted more than a million households in Philadelphia relocate to Berlin quickly, efficiently and with minimal fuss.


Is Fulfilling Rampant Needs a Sign of Abundance or is Wanting Nothing?
Imagine after years of saving, scrimping and hard work you come into a large sum of money. You sell a property, you inherit, your startup gets a sell offer you can't refuse, you invest in the right cryptocurrency at the right time… Whatever… You consult your bank account and stare in awe at the reality of a six, or even seven-figure balance.
At first, you are stunned. You sit back and contemplate the situation, trying to take it in. Your mind is blank; the reality unfathomable. It dawns on you that for the first time in your life, you can do and have whatever you want.
For more help creating a happy, fulfilling, and sustainable life, contact me today. Call or just fill out the contact form and press Send.