text:
import os

import mock
from os_brick.initiator import connector
from oslo_concurrency import processutils
from oslo_config import cfg

from nova import exception
from nova import test
from nova.tests.unit.virt.libvirt import fakelibvirt
from nova import utils
from nova.virt.libvirt import host
from nova.virt.libvirt import utils as libvirt_utils
from nova.virt.libvirt.volume import volume

CONF = cfg.CONF
SECRET_UUID = '2a0a0d6c-babf-454d-b93e-9ac9957b95e0'

class FakeSecret(object):

    def __init__(self):
        self.uuid = SECRET_UUID

    def getUUIDString(self):
        return self.uuid

    def UUIDString(self):
        return self.uuid

    def setValue(self, value):
        self.value = value
        return 0

    def getValue(self, value):
        return self.value

    def undefine(self):
        self.value = None
        return 0

class LibvirtVolumeBaseTestCase(test.NoDBTestCase):
    """Contains common setup and helper methods for libvirt volume tests."""

    def setUp(self):
        super(LibvirtVolumeBaseTestCase, self).setUp()
        self.executes = []

        def fake_execute(*cmd, **kwargs):
            self.executes.append(cmd)
            return None, None

        self.stubs.Set(utils, 'execute', fake_execute)

        self.useFixture(fakelibvirt.FakeLibvirtFixture())

        class FakeLibvirtDriver(object):
            def __init__(self):
                self._host = host.Host("qemu:///system")

            def _get_all_block_devices(self):
                return []

        self.fake_conn = FakeLibvirtDriver()
        self.connr = {
            'ip': '127.0.0.1',
            'initiator': 'fake_initiator',
            'host': 'fake_host'
        }
        self.disk_info = {
            "bus": "virtio",
            "dev": "vde",
            "type": "disk",
        }
        self.name = 'volume-00000001'
        self.location = '10.0.2.15:3260'
        self.iqn = 'iqn.2010-10.org.openstack:%s' % self.name
        self.vol = {'id': 1, 'name': self.name}
        self.uuid = '875a8070-d0b9-4949-8b31-104d125c9a64'
        self.user = 'foo'

    def _assertFileTypeEquals(self, tree, file_path):
        self.assertEqual(tree.get('type'), 'file')
        self.assertEqual(tree.find('./source').get('file'), file_path)

class LibvirtVolumeTestCase(LibvirtVolumeBaseTestCase):

    def _assertNetworkAndProtocolEquals(self, tree):
        self.assertEqual(tree.get('type'), 'network')
        self.assertEqual(tree.find('./source').get('protocol'), 'rbd')
        rbd_name = '%s/%s' % ('rbd', self.name)
        self.assertEqual(tree.find('./source').get('name'), rbd_name)

    def _assertISCSINetworkAndProtocolEquals(self, tree):
        self.assertEqual(tree.get('type'), 'network')
        self.assertEqual(tree.find('./source').get('protocol'), 'iscsi')
        iscsi_name = '%s/%s' % (self.iqn, self.vol['id'])
        self.assertEqual(tree.find('./source').get('name'), iscsi_name)

    def _assertDiskInfoEquals(self, tree, disk_info):
        self.assertEqual(tree.get('device'), disk_info['type'])
        self.assertEqual(tree.find('./target').get('bus'),
                         disk_info['bus'])
        self.assertEqual(tree.find('./target').get('dev'),
                         disk_info['dev'])

    def _test_libvirt_volume_driver_disk_info(self):
        libvirt_driver = volume.LibvirtVolumeDriver(self.fake_conn)
        connection_info = {
            'driver_volume_type': 'fake',
            'data': {
                'device_path': '/foo',
            },
            'serial': 'fake_serial',
        }
        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertDiskInfoEquals(tree, self.disk_info)

    def test_libvirt_volume_disk_info_type(self):
        self.disk_info['type'] = 'cdrom'
        self._test_libvirt_volume_driver_disk_info()

    def test_libvirt_volume_disk_info_dev(self):
        self.disk_info['dev'] = 'hdc'
        self._test_libvirt_volume_driver_disk_info()

    def test_libvirt_volume_disk_info_bus(self):
        self.disk_info['bus'] = 'scsi'
        self._test_libvirt_volume_driver_disk_info()

    def test_libvirt_volume_driver_serial(self):
        libvirt_driver = volume.LibvirtVolumeDriver(self.fake_conn)
        connection_info = {
            'driver_volume_type': 'fake',
            'data': {
                'device_path': '/foo',
            },
            'serial': 'fake_serial',
        }
        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self.assertEqual('block', tree.get('type'))
        self.assertEqual('fake_serial', tree.find('./serial').text)
        self.assertIsNone(tree.find('./blockio'))

    def test_libvirt_volume_driver_blockio(self):
        libvirt_driver = volume.LibvirtVolumeDriver(self.fake_conn)
        connection_info = {
            'driver_volume_type': 'fake',
            'data': {
                'device_path': '/foo',
                'logical_block_size': '4096',
                'physical_block_size': '4096',
                },
            'serial': 'fake_serial',
            }
        disk_info = {
            "bus": "virtio",
            "dev": "vde",
            "type": "disk",
            }
        conf = libvirt_driver.get_config(connection_info, disk_info)
        tree = conf.format_dom()
        blockio = tree.find('./blockio')
        self.assertEqual('4096', blockio.get('logical_block_size'))
        self.assertEqual('4096', blockio.get('physical_block_size'))

    def test_libvirt_volume_driver_iotune(self):
        libvirt_driver = volume.LibvirtVolumeDriver(self.fake_conn)
        connection_info = {
            'driver_volume_type': 'fake',
            'data': {
                "device_path": "/foo",
                'qos_specs': 'bar',
                },
            }
        disk_info = {
            "bus": "virtio",
            "dev": "vde",
            "type": "disk",
            }
        conf = libvirt_driver.get_config(connection_info, disk_info)
        tree = conf.format_dom()
        iotune = tree.find('./iotune')
        # ensure invalid qos_specs is ignored
        self.assertIsNone(iotune)

        specs = {
            'total_bytes_sec': '102400',
            'read_bytes_sec': '51200',
            'write_bytes_sec': '0',
            'total_iops_sec': '0',
            'read_iops_sec': '200',
            'write_iops_sec': '200',
        }
        del connection_info['data']['qos_specs']
        connection_info['data'].update(dict(qos_specs=specs))
        conf = libvirt_driver.get_config(connection_info, disk_info)
        tree = conf.format_dom()
        self.assertEqual('102400', tree.find('./iotune/total_bytes_sec').text)
        self.assertEqual('51200', tree.find('./iotune/read_bytes_sec').text)
        self.assertEqual('0', tree.find('./iotune/write_bytes_sec').text)
        self.assertEqual('0', tree.find('./iotune/total_iops_sec').text)
        self.assertEqual('200', tree.find('./iotune/read_iops_sec').text)
        self.assertEqual('200', tree.find('./iotune/write_iops_sec').text)

    def test_libvirt_volume_driver_readonly(self):
        libvirt_driver = volume.LibvirtVolumeDriver(self.fake_conn)
        connection_info = {
            'driver_volume_type': 'fake',
            'data': {
                "device_path": "/foo",
                'access_mode': 'bar',
                },
            }
        disk_info = {
            "bus": "virtio",
            "dev": "vde",
            "type": "disk",
            }
        self.assertRaises(exception.InvalidVolumeAccessMode,
                          libvirt_driver.get_config,
                          connection_info, self.disk_info)

        connection_info['data']['access_mode'] = 'rw'
        conf = libvirt_driver.get_config(connection_info, disk_info)
        tree = conf.format_dom()
        readonly = tree.find('./readonly')
        self.assertIsNone(readonly)

        connection_info['data']['access_mode'] = 'ro'
        conf = libvirt_driver.get_config(connection_info, disk_info)
        tree = conf.format_dom()
        readonly = tree.find('./readonly')
        self.assertIsNotNone(readonly)

    def iscsi_connection(self, volume, location, iqn, auth=False,
                         transport=None):
        dev_name = 'ip-%s-iscsi-%s-lun-1' % (location, iqn)
        if transport is not None:
            dev_name = 'pci-0000:00:00.0-' + dev_name
        dev_path = '/dev/disk/by-path/%s' % (dev_name)
        ret = {
                'driver_volume_type': 'iscsi',
                'data': {
                    'volume_id': volume['id'],
                    'target_portal': location,
                    'target_iqn': iqn,
                    'target_lun': 1,
                    'device_path': dev_path,
                    'qos_specs': {
                        'total_bytes_sec': '102400',
                        'read_iops_sec': '200',
                        }
                }
        }
        if auth:
            ret['data']['auth_method'] = 'CHAP'
            ret['data']['auth_username'] = 'foo'
            ret['data']['auth_password'] = 'bar'
        return ret

    def iscsi_connection_discovery_chap_enable(self, volume, location, iqn):
        dev_name = 'ip-%s-iscsi-%s-lun-1' % (location, iqn)
        dev_path = '/dev/disk/by-path/%s' % (dev_name)
        return {
                'driver_volume_type': 'iscsi',
                'data': {
                    'volume_id': volume['id'],
                    'target_portal': location,
                    'target_iqn': iqn,
                    'target_lun': 1,
                    'device_path': dev_path,
                    'discovery_auth_method': 'CHAP',
                    'discovery_auth_username': "testuser",
                    'discovery_auth_password': '123456',
                    'qos_specs': {
                        'total_bytes_sec': '102400',
                        'read_iops_sec': '200',
                        }
                }
        }

    def generate_device(self, transport=None, lun=1, short=False):
        dev_format = "ip-%s-iscsi-%s-lun-%s" % (self.location, self.iqn, lun)
        if transport:
            dev_format = "pci-0000:00:00.0-" + dev_format
        if short:
            return dev_format
        fake_dev_path = "/dev/disk/by-path/" + dev_format
        return fake_dev_path

    def test_iscsiadm_discover_parsing(self):
        # Ensure that parsing iscsiadm discover ignores cruft.

        targets = [
            ["192.168.204.82:3260,1",
             ("iqn.2010-10.org.openstack:volume-"
              "f9b12623-6ce3-4dac-a71f-09ad4249bdd3")],
            ["192.168.204.82:3261,1",
             ("iqn.2010-10.org.openstack:volume-"
              "f9b12623-6ce3-4dac-a71f-09ad4249bdd4")]]

        # This slight wonkiness brought to you by pep8, as the actual
        # example output runs about 97 chars wide.
        sample_input = """Loading iscsi modules: done
Starting iSCSI initiator service: done
Setting up iSCSI targets: unused
%s %s
%s %s
""" % (targets[0][0], targets[0][1], targets[1][0], targets[1][1])
        driver = volume.LibvirtISCSIVolumeDriver("none")
        out = driver.connector._get_target_portals_from_iscsiadm_output(
            sample_input)
        self.assertEqual(out, targets)

    def test_libvirt_iscsi_driver(self, transport=None):
        libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn)
        self.assertIsInstance(libvirt_driver.connector,
                              connector.ISCSIConnector)

    def test_sanitize_log_run_iscsiadm(self):
        # Tests that the parameters to the os-brick connector's
        # _run_iscsiadm function are sanitized for passwords when logged.
        def fake_debug(*args, **kwargs):
            self.assertIn('node.session.auth.password', args[0])
            self.assertNotIn('scrubme', args[0])

        def fake_execute(*args, **kwargs):
            return (None, None)

        libvirt_driver = volume.LibvirtISCSIVolumeDriver(self.fake_conn)
        libvirt_driver.connector.set_execute(fake_execute)
        connection_info = self.iscsi_connection(self.vol, self.location,
                                                self.iqn)
        iscsi_properties = connection_info['data']
        with mock.patch.object(connector.LOG, 'debug',
                               side_effect=fake_debug) as debug_mock:
            libvirt_driver.connector._iscsiadm_update(
                iscsi_properties, 'node.session.auth.password', 'scrubme')

            # we don't care what the log message is, we just want to make sure
            # our stub method is called which asserts the password is scrubbed
            self.assertTrue(debug_mock.called)

    def iser_connection(self, volume, location, iqn):
        return {
                'driver_volume_type': 'iser',
                'data': {
                    'volume_id': volume['id'],
                    'target_portal': location,
                    'target_iqn': iqn,
                    'target_lun': 1,
                }
        }

    def sheepdog_connection(self, volume):
        return {
            'driver_volume_type': 'sheepdog',
            'data': {
                'name': volume['name']
            }
        }

    def test_libvirt_sheepdog_driver(self):
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.sheepdog_connection(self.vol)
        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self.assertEqual(tree.get('type'), 'network')
        self.assertEqual(tree.find('./source').get('protocol'), 'sheepdog')
        self.assertEqual(tree.find('./source').get('name'), self.name)
        libvirt_driver.disconnect_volume(connection_info, "vde")

    def rbd_connection(self, volume):
        return {
            'driver_volume_type': 'rbd',
            'data': {
                'name': '%s/%s' % ('rbd', volume['name']),
                'auth_enabled': CONF.libvirt.rbd_secret_uuid is not None,
                'auth_username': CONF.libvirt.rbd_user,
                'secret_type': 'ceph',
                'secret_uuid': CONF.libvirt.rbd_secret_uuid,
                'qos_specs': {
                    'total_bytes_sec': '1048576',
                    'read_iops_sec': '500',
                    }
            }
        }

    def test_libvirt_rbd_driver(self):
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.rbd_connection(self.vol)
        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertNetworkAndProtocolEquals(tree)
        self.assertIsNone(tree.find('./source/auth'))
        self.assertEqual('1048576', tree.find('./iotune/total_bytes_sec').text)
        self.assertEqual('500', tree.find('./iotune/read_iops_sec').text)
        libvirt_driver.disconnect_volume(connection_info, "vde")

    def test_libvirt_rbd_driver_hosts(self):
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.rbd_connection(self.vol)
        hosts = ['example.com', '1.2.3.4', '::1']
        ports = [None, '6790', '6791']
        connection_info['data']['hosts'] = hosts
        connection_info['data']['ports'] = ports
        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertNetworkAndProtocolEquals(tree)
        self.assertIsNone(tree.find('./source/auth'))
        found_hosts = tree.findall('./source/host')
        self.assertEqual([host.get('name') for host in found_hosts], hosts)
        self.assertEqual([host.get('port') for host in found_hosts], ports)
        libvirt_driver.disconnect_volume(connection_info, "vde")

    def test_libvirt_rbd_driver_auth_enabled(self):
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.rbd_connection(self.vol)
        secret_type = 'ceph'
        connection_info['data']['auth_enabled'] = True
        connection_info['data']['auth_username'] = self.user
        connection_info['data']['secret_type'] = secret_type
        connection_info['data']['secret_uuid'] = self.uuid

        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertNetworkAndProtocolEquals(tree)
        self.assertEqual(tree.find('./auth').get('username'), self.user)
        self.assertEqual(tree.find('./auth/secret').get('type'), secret_type)
        self.assertEqual(tree.find('./auth/secret').get('uuid'), self.uuid)
        libvirt_driver.disconnect_volume(connection_info, "vde")

    def test_libvirt_rbd_driver_auth_enabled_flags_override(self):
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.rbd_connection(self.vol)
        secret_type = 'ceph'
        connection_info['data']['auth_enabled'] = True
        connection_info['data']['auth_username'] = self.user
        connection_info['data']['secret_type'] = secret_type
        connection_info['data']['secret_uuid'] = self.uuid

        flags_uuid = '37152720-1785-11e2-a740-af0c1d8b8e4b'
        flags_user = 'bar'
        self.flags(rbd_user=flags_user,
                   rbd_secret_uuid=flags_uuid,
                   group='libvirt')

        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertNetworkAndProtocolEquals(tree)
        self.assertEqual(tree.find('./auth').get('username'), flags_user)
        self.assertEqual(tree.find('./auth/secret').get('type'), secret_type)
        self.assertEqual(tree.find('./auth/secret').get('uuid'), flags_uuid)
        libvirt_driver.disconnect_volume(connection_info, "vde")

    def test_libvirt_rbd_driver_auth_disabled(self):
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.rbd_connection(self.vol)
        secret_type = 'ceph'
        connection_info['data']['auth_enabled'] = False
        connection_info['data']['auth_username'] = self.user
        connection_info['data']['secret_type'] = secret_type
        connection_info['data']['secret_uuid'] = self.uuid

        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertNetworkAndProtocolEquals(tree)
        self.assertIsNone(tree.find('./auth'))
        libvirt_driver.disconnect_volume(connection_info, "vde")

    def test_libvirt_rbd_driver_auth_disabled_flags_override(self):
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.rbd_connection(self.vol)
        secret_type = 'ceph'
        connection_info['data']['auth_enabled'] = False
        connection_info['data']['auth_username'] = self.user
        connection_info['data']['secret_type'] = secret_type
        connection_info['data']['secret_uuid'] = self.uuid

        # NOTE: Supplying the rbd_secret_uuid will enable authentication
        # locally in nova-compute even if not enabled in nova-volume/cinder
        flags_uuid = '37152720-1785-11e2-a740-af0c1d8b8e4b'
        flags_user = 'bar'
        self.flags(rbd_user=flags_user,
                   rbd_secret_uuid=flags_uuid,
                   group='libvirt')

        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertNetworkAndProtocolEquals(tree)
        self.assertEqual(tree.find('./auth').get('username'), flags_user)
        self.assertEqual(tree.find('./auth/secret').get('type'), secret_type)
        self.assertEqual(tree.find('./auth/secret').get('uuid'), flags_uuid)
        libvirt_driver.disconnect_volume(connection_info, "vde")

    @mock.patch.object(host.Host, 'find_secret')
    @mock.patch.object(host.Host, 'create_secret')
    @mock.patch.object(host.Host, 'delete_secret')
    def test_libvirt_iscsi_net_driver(self, mock_delete, mock_create,
                                      mock_find):
        mock_find.return_value = FakeSecret()
        mock_create.return_value = FakeSecret()
        libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn)
        connection_info = self.iscsi_connection(self.vol, self.location,
                                                self.iqn, auth=True)
        secret_type = 'iscsi'
        flags_user = connection_info['data']['auth_username']
        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertISCSINetworkAndProtocolEquals(tree)
        self.assertEqual(tree.find('./auth').get('username'), flags_user)
        self.assertEqual(tree.find('./auth/secret').get('type'), secret_type)
        self.assertEqual(tree.find('./auth/secret').get('uuid'), SECRET_UUID)
        libvirt_driver.disconnect_volume(connection_info, 'vde')

    def test_libvirt_nfs_driver(self):
        # NOTE(vish) exists is to make driver assume connecting worked
        mnt_base = '/mnt'
        self.flags(nfs_mount_point_base=mnt_base, group='libvirt')

        libvirt_driver = volume.LibvirtNFSVolumeDriver(self.fake_conn)
        self.stubs.Set(libvirt_utils, 'is_mounted', lambda x, d: False)

        export_string = '192.168.1.1:/nfs/share1'
        export_mnt_base = os.path.join(mnt_base,
                utils.get_hash_str(export_string))

        connection_info = {'data': {'export': export_string,
                                    'name': self.name}}
        libvirt_driver.connect_volume(connection_info, self.disk_info)
        libvirt_driver.disconnect_volume(connection_info, "vde")

        device_path = os.path.join(export_mnt_base,
                                   connection_info['data']['name'])
        self.assertEqual(device_path, connection_info['data']['device_path'])
        expected_commands = [
            ('mkdir', '-p', export_mnt_base),
            ('mount', '-t', 'nfs', export_string, export_mnt_base),
            ('umount', export_mnt_base)]
        self.assertEqual(expected_commands, self.executes)

    @mock.patch.object(volume.utils, 'execute')
    @mock.patch.object(volume.LOG, 'debug')
    @mock.patch.object(volume.LOG, 'exception')
    def test_libvirt_nfs_driver_umount_error(self, mock_LOG_exception,
                                        mock_LOG_debug, mock_utils_exe):
        export_string = '192.168.1.1:/nfs/share1'
        connection_info = {'data': {'export': export_string,
                                    'name': self.name}}
        libvirt_driver = volume.LibvirtNFSVolumeDriver(self.fake_conn)
        mock_utils_exe.side_effect = processutils.ProcessExecutionError(
            None, None, None, 'umount', 'umount: device is busy.')
        libvirt_driver.disconnect_volume(connection_info, "vde")
        self.assertTrue(mock_LOG_debug.called)
        mock_utils_exe.side_effect = processutils.ProcessExecutionError(
            None, None, None, 'umount', 'umount: target is busy.')
        libvirt_driver.disconnect_volume(connection_info, "vde")
        self.assertTrue(mock_LOG_debug.called)
        mock_utils_exe.side_effect = processutils.ProcessExecutionError(
            None, None, None, 'umount', 'umount: Other error.')
        libvirt_driver.disconnect_volume(connection_info, "vde")
        self.assertTrue(mock_LOG_exception.called)

    def test_libvirt_nfs_driver_get_config(self):
        libvirt_driver = volume.LibvirtNFSVolumeDriver(self.fake_conn)
        mnt_base = '/mnt'
        self.flags(nfs_mount_point_base=mnt_base, group='libvirt')
        export_string = '192.168.1.1:/nfs/share1'
        export_mnt_base = os.path.join(mnt_base,
                                       utils.get_hash_str(export_string))
        file_path = os.path.join(export_mnt_base, self.name)

        connection_info = {'data': {'export': export_string,
                                    'name': self.name,
                                    'device_path': file_path}}
        conf = libvirt_driver.get_config(connection_info, self.disk_info)
        tree = conf.format_dom()
        self._assertFileTypeEquals(tree, file_path)
        self.assertEqual('raw', tree.find('./driver').get('type'))

    def test_libvirt_nfs_driver_already_mounted(self):
        # NOTE(vish) exists is to make driver assume connecting worked
        mnt_base = '/mnt'
        self.flags(nfs_mount_point_base=mnt_base, group='libvirt')

        libvirt_driver = volume.LibvirtNFSVolumeDriver(self.fake_conn)

        export_string = '192.168.1.1:/nfs/share1'
        export_mnt_base = os.path.join(mnt_base,
                utils.get_hash_str(export_string))

        connection_info = {'data': {'export': export_string,
                                    'name': self.name}}
        libvirt_driver.connect_volume(connection_info, self.disk_info)
        libvirt_driver.disconnect_volume(connection_info, "vde")

        expected_commands = [
            ('findmnt', '--target', export_mnt_base, '--source',
             export_string),
            ('umount', export_mnt_base)]
        self.assertEqual(self.executes, expected_commands)

    def test_libvirt_nfs_driver_with_opts(self):
        mnt_base = '/mnt'
        self.flags(nfs_mount_point_base=mnt_base, group='libvirt')

        libvirt_driver = volume.LibvirtNFSVolumeDriver(self.fake_conn)
        self.stubs.Set(libvirt_utils, 'is_mounted', lambda x, d: False)
        export_string = '192.168.1.1:/nfs/share1'
        options = '-o intr,nfsvers=3'
        export_mnt_base = os.path.join(mnt_base,
                utils.get_hash_str(export_string))

        connection_info = {'data': {'export': export_string,
                                    'name': self.name,
                                    'options': options}}
        libvirt_driver.connect_volume(connection_info, self.disk_info)
        libvirt_driver.disconnect_volume(connection_info, "vde")

        expected_commands = [
            ('mkdir', '-p', export_mnt_base),
            ('mount', '-t', 'nfs', '-o', 'intr,nfsvers=3',
             export_string, export_mnt_base),
            ('umount', export_mnt_base),
        ]
        self.assertEqual(expected_commands, self.executes)


Train to Busan (aka Busanhaeng in original Korean language) (2016) [read our review here] is still perhaps the last best zombie movie made worldwide. The plot wasn't the most original one ever, a zombie virus breaks out in South Korea and passengers struggle to survive on the train from Seoul to Busan. But the fast-paced action sequences and choreographies and the never stopping intensity along the almost 2 hours of running time made the title to become an instant classic, getting very positive reviews in the whole globe. A never-ending list of award winnings achieved in a big handful of international festivals certifies that.
It was its writer and director Yeon Sang-ho who announced this week that he is already working on a sequel. The provisional title is Train to Busan: Bando, which would be translated in English as Train to Busan: Peninsula. The filmmaker stated in an interview with Screen Daily "It is an extension of Train to Busan (2016), after the virus has spread throughout Korea, but the characters are not the same. It shares the same worldview and is a zombie action film that deals with the aftermath on the peninsula of what happened in Train to Busan(2016). I'm still writing the script, but the scale is rather large since there will be action with something to it".


text:
Q: Calculating what will fit in a parcel bag I've searched around and can't seem to find a solution to what I imagine would be a fairly simple problem. I'm trying to calculate what size a parcel bag I would need to fit in a malleable item, such as a towel.
I'd thought that I could just calculate the volume of the bag sizes, and the volume of the folded towel to determine this, but given the parcel bags are flat, that doesn't seem to work.
For instance, I have a parcel bag which is 26cm * 39cm, and I've given it a height of 1cm, a volume of 1,014cm cubed. My folded towel is 21cm * 28cm * 7cm, giving a volume of 4,116cm cubed. The folded towel fits in the bag, so where have I gone wrong?
Thanks in advance

A: Welcome to (one of) the disconnect(s) between mathematics/science and real life!  You assumed a thickness of the bag of $1$ cm, but why that instead of $1/2$ or $2$ or something else?.  I suspect the sides bulged out rather farther than that, increasing the volume.  You also measured the towel in an uncompressed state and ignored the fact that the corners were round, not square.  The bag and the towel found a compromise volume that suited them both.

redpajama_set_name: RedPajamaStackExchange


To claim this profile, please confirm you are Dalton Beavers.
To follow this profile, please let us know your relationship to Dalton Beavers.
Dalton's baseball stats have been updated for the loss vs. Mountainburg.
RESULTLoss Varsity baseball vs. Mountainburg.
The Westside varsity baseball team lost Wednesday's neutral conference game against Mountainburg (AR) by a score of 11-6.
Dalton's baseball stats have been updated for the loss vs. Hector.
RESULTLoss Varsity baseball vs. Hector.
The Westside varsity baseball team lost Tuesday's home conference game against Hector (AR) by a score of 12-1.
Dalton's baseball stats have been updated for the loss @ Lamar.
RESULTLoss Varsity baseball @ Lamar.
The Westside varsity baseball team lost Friday's away non-conference game against Lamar (AR) by a score of 11-5.
The Westside varsity baseball team lost Monday's home conference game against Mountainburg (AR) by a score of 4-2.
Dalton's baseball stats have been updated for the win @ Hackett.
RESULTWin Varsity baseball @ Hackett.
The Westside varsity baseball team won Thursday's away conference game against Hackett (AR) by a score of 5-3.
Dalton's baseball stats have been updated for the win @ Magazine.
RESULTWin Varsity baseball @ Magazine.
The Westside varsity baseball team won Monday's away conference game against Magazine (AR) by a score of 14-2.
RESULTLoss Varsity baseball vs. County Line.
The Westside varsity baseball team lost Wednesday's home non-conference game against County Line (Branch, AR) by a score of 12-6.
Dalton's baseball stats have been updated for the loss @ Danville.
RESULTLoss Varsity baseball @ Danville.
The Westside varsity baseball team lost Monday's away conference game against Danville (AR) by a score of 6-0.
Dalton's baseball stats have been updated for the loss @ Wonderview.
RESULTLoss Varsity baseball @ Wonderview.
The Westside varsity baseball team lost Friday's away non-conference game against Wonderview (Hattieville, AR) by a score of 10-2.
Dalton's baseball stats have been updated for the loss vs. Lavaca.
RESULTLoss Varsity baseball vs. Lavaca.
The Westside varsity baseball team lost Thursday's home conference game against Lavaca (AR) by a score of 11-0.


2017 Dutchmen RV Rubicon 1905, Take this Dutchmen Rubicon toy hauler travel trailer on any adventure knowing you will enjoy every minute you spend camped inside! Model 1905 features up to 14' of cargo hauling space for your toys, plus all the amenities you need to enjoy time away from home.Use the rear ramp door with spring assist to easily load and unload your cargo. Inside find a fold away dinette table with two sofas which provide plenty of seating for meals and just hanging out once the toys are removed. There is also plenty of overhead storage for your gear above both sofas in the cargo space. The flat screen TV mounted next to the sofa and to the left of the door is perfect for viewing from any seating inside. There is also a radio and DVD player to enjoy. You can add an optional lounge chair if you like for even more seating, the choice is yours.As you enter the main side entrance find a convenient pantry to your immediate right. The kitchen is straight ahead and features a refrigerator, three burner range with overhead microwave, and a double sink, making cleaning up a snap. You will also find plenty of overhead storage, and lower cupboards and drawers for your dishes and things.In the front of this Rubicon toy hauler enjoy sleeping on a queen size bed with storage above the head of the bed. There is a wardrobe off the foot of the bed for clothing. In the opposite corner find a complete bath including a tub/shower, toilet, and vanity with sink, plus more.The fuel fill outside will be handy to keep the fun going all weekend long, and you can also choose an optional Onan generator for times when you want to take your fun off the beaten path away from it all!


text:
Ariana Grande Apologizes (Again) for the Whole Gross "Licking Donuts" Thing
09/16/2015 by Matt Q Comments
We're pretty sure she's not America's sweetheart, per se, but she is a massive pop star nonetheless. As a result, Ariana Grande made headlines this past July when a security camera caught her talking trash about her fellow countrymen and licking donuts intended for sale to the general public.
The video, which took the Internet by storm this past summer, showed the diminutive superstar twice lick donuts sitting on a display rack while a clerk's back was turned. Also adding, apparently, "I hate America" and/or "I hate Americans."
We think she also made out with a dude at some point in the video as well, and that was also worthy of note to many observers at the time.
Anyway, on Tuesday, Ariana took to ABC's Good Morning America to discuss some "passion project" or another. But, since it was her first TV appearance since handling dessert foods in such a frankly unsanitary manner, the 22-year old was forced to speak on the matter a bit directly.
"First of all, I mean, my behavior was very offensive, and I apologized. There's no excuse or there's nothing to justify it.
As human beings we all say and do things that we don't mean at all sometimes, and we have to learn from it. I think one of the biggest things I learned from that was what it feels like to disappoint so many people who love and believe in you, and that's an excruciating feeling."
In terms of this being a viral story this morning, this is purely a double dip as Ariana took to YouTube to apologize for the incident earlier in the summer. But now she's done it on network TV, and while promoting a brand new fragrance (ostensibly the reason for her appearance on the show, promoting the release of her new perfume Ari by Ariana Grande).
Check out the clip below, listen closely to what's being discussed, and if you're not careful, you may learn a thing or two before it's done. Clicking Ariana's highlighted name above will lead you to her PeekYou profile where you'll find stacks of links to the best of what the Web has on offer of the young, contrite diva's life and career.
ABC Breaking News | Latest News Videos
Ariana Grande dessert donuts Good Morning America Viral Video

redpajama_set_name: RedPajamaCommonCrawl


Chair Yoga With Chair Yoga: Simple, Easy Exercises | Green Mountain. Chair Yoga With Sun Salutation (Surya Namaskar) On Chair For Arthritis And Other. Chair Yoga With Got Arthritis? These Chair Yoga Moves Are Proven To Help | Reader's. Chair Yoga With Chair Yoga Offered For Senior Citizens Boomer And Senior Resources. Chair Yoga With 12 Chair Yoga Poses For Stress And Posture PureWow. Chair Yoga With CHAIR YOGA AT GHH – Integral Yoga Gibraltar. Chair Yoga With Chair Yoga Practice For The Whole Body. Chair Yoga With Chair Yoga At Greenwood Lake Public Library April 23, 2018 Route 94. Chair Yoga With This Monday, DeStress At Work With Easy Chair Yoga Moves DeStress. Chair Yoga With Chair Yoga Is For Everyone Studio South Yoga.


Police say one person was injured in a shooting in Crisfield Wednesday.
A man who was shot in Crisfield on Wednesday night was recently released from prison, according to Crisfield Police.
The shooting happened outside the residence at 259 Somers Cove Apartments and was witnessed by around 20 people, police said.
The victim was shot twice in the elbow and is currently in a shock trauma unit in Baltimore with non-life-threatening injuries, according to Crisfield Police Chief Michael Tabor.
He is not cooperating with police at this time, according to a press release from the Crisfield Police Department.
"We have received several tips from confidential informants, etc. and some concerned citizens as to who may have done this crime," the release stated.
Additionally, the police department has brought in several individuals who were at the scene "but know nothing or have nothing more than hearsay information at this time."
The Crisfield Police Department is asking for anyone who saw the crime to come forward and identify the suspect.
"There were individuals at the scene who know who the shooter is and can identify him," the release said.
The victim had previously been sentenced in Somerset County Circuit Court to 10 years for distribution of controlled dangerous substances. His sentence was reduced by the court to all but five years suspended and he served 1 year and 7 months on the charge of distributing of a controlled dangerous substance to an undercover Crisfield police officer during an operation conducted by the town's police department in the Crisfield Housing Authority area.
Anyone with relevant information should contact Capt. Luedtke or Lt. Rick Taylor at the Crisfield Police Department at 410-968-1323.


text:
Bettman wants to talk fighting with Laraque | CBC Sports Loaded
Bettman wants to talk fighting with Laraque
NHL commissioner Gary Bettman thinks he might be able to convince Montreal Canadiens tough guy Georges Laraque that rule changes proposed by general managers this week aren't actually so bad for enforcers.
The Canadian Press · Posted: Mar 11, 2009 4:33 PM ET | Last Updated: March 11, 2009
Gary Bettman would be happy to sit down with Georges Laraque and talk about fighting.
The NHL commissioner thinks he might be able to convince the Montreal Canadiens tough guy that rule changes proposed by general managers this week aren't actually so bad for enforcers.
Laraque was quick to criticize the recommendation by GMs that the instigator rule be more stringently applied next season and that a 10-minute misconduct penalty be given out to players who drop the gloves right after a faceoff.
Bettman was careful when asked to respond to the comments.
"I'd like to talk to George about it 1-on-1," he said Wednesday. "I think with an in-depth discussion, these rules aren't so far off the mark from things that he would be comfortable with."
After 16 years as commissioner, debates about fighting are nothing new for Bettman.
Laraque's biggest concern is that the proposed changes might end up eliminating the role he has filled for more than 600 NHL games over the last decade.
"The GMs need to find ways to make fighting safer instead of taking fighting out of the game," Laraque said Tuesday in Montreal.
"With the instigator rule, you have more cheap shots in the game than ever. Having a 10-minute misconduct won't stop that. They should look at helmets or whatever to make it safer, not more penalties."
Fighting was the major issue tackled by the GMs over three days of meetings.
The final session was held Wednesday morning and included several housekeeping items.
Deputy commissioner Bill Daly delivered a presentation about the financial state of the league, but didn't reveal anything new.
Essentially, the league still expects the $56.7-million US salary cap to remain fairly stable next season before dropping the following year. It remains to be seen how big of drop that might be.
"I think the biggest thing to 2010 to '11 is the uncertainty — nobody knows," said Bettman.
That uncertainty kept at least one proposal from becoming an official recommendation.
Toronto Maple Leafs GM Brian Burke has been lobbying to allow teams to retain some salary in trades because he thinks the added flexibility will prompt more movement. The idea was more warmly received this time around than in the past.
"I think it's gathering support but at the same time it's a CBA issue," said Detroit Red Wings GM Ken Holland. "There's so much unknown here going forward given the cap. We're going to stay the course for the next little while.
"At the appropriate time, it will be re-addressed."
Burke indicated that Bettman killed the idea: "The Big Kahuna said it's not going to happen and that I should stop bringing it up."
Holland's proposal about tiebreaking rules didn't get very far. He would like to see regulation wins become the first tiebreaker in the standings to reward teams that take care of business before overtime.
Other ideas shot around
Several other ideas were kicked around and debated as well.
"It's fun to watch the people that love the game like this talking about rule changes, the thought that goes into it," said Burke. "And when you're a rookie GM and you first come in you realize the passion these people have for the game."
There was a more relaxed atmosphere around these meetings than in years past.
Since the lockout, they've been held a week or so before the trade deadline and included a lot of buzz about potential moves.
While the GMs are aware that they've lost some sizzle by moving the meetings to after the deadline, many believe it gave them a better opportunity to focus on rule changes.
"I like this much better," said Los Angeles Kings GM Dean Lombardi. "It's impossible to really focus on these issues when you're at the trade deadline."
Added Bettman: "We had some very good in-depth important discussions and I thought the focus was really good. I think part of that is because guys weren't out on their phones in the hallway as much as they were before the trading deadline."
Fight 'part of the game': Bettman
Even with so much time to focus on tweaks to rules around fighting, there isn't a sense that the topic will stop being debated any time soon.
It's something the NHL will always be wrestling with to some degree.
"We're always trying to be self-analytical," said Bettman. "We're watching every game, we're looking at trends, we're trying to make sure that we have a sense of what's going on.
"Fighting has always been an emotional issue but in terms of any interaction that I've had with hockey executives, coaches, players, fans. The overwhelming sentiment is that it's part of the game and there's no burning desire [to get rid of it]."
Crack down on staged fights, NHL GMs urge
Canadiens' Laraque out with lower back injury
'I'm happy here': Canadiens' Laraque
Laraque questions future with Canadiens
BIO: Georges Laraque


Bowie: Volunteers have averaged nearly 24 wins the past three seasons and reached at least the regional quarters eight of last nine years.
Trimble Tech: Bulldogs are 47-18 the past two seasons, but now moved up to Class 6A.
Birdville: Hawks got as high as No. 5 last season and have gone 52-16 the last two years; playoff trips in nine of the past 10 seasons.
Wyatt: Chaparrals coming off a district title, 23 wins and their first trip to the regional tournament in 10 years.
Brewer: Bears won 27 games last season, most in the past 15 years. They have one tourney title under their belt this season at Wichita Falls.
Kennedale: Wildcats have missed the playoffs just twice in the past two decades.
Dunbar: Wildcats dropped down a class to fit its enrollment size; made state in 2016.
Brock: Eagles have reached the state tourney four of the past seven years.
Grace Prep: TAPPS 4A state runner-up last season, ranked No. 1 this year.


Company also ranked #179 overall in the Annual 500 Entrepreneur rankings. SAN DIEGO, CA - January 11, 2017 – Instant Imprints is off to a great start in 2017! It was named #1 in the Embroidery and Screen Printing category by Entrepreneur Media Inc.


You should come up with an idea based on the way in which the documentary touched you. You're the owner of your story, and you need to learn to tell it. No matter your plans after, being a great writer and crystal clear thinker will offer you https://aussieessaywriter.com.au/article-critique-writing/ a leg up your competition.
To be sure you compose a high-quality work, you need to always concentrate on the backbone. Just as user-centred design practice positions people at the middle of the plan procedure, folks should also remain as the primary focus in the fiction. Now, since you have the capability to time travel, you return to today, right now, help proofreading your essay which you simply left.
The trial occurred in 399 BC in Athens. Therefore concerning discover exactly what you would like to dig on tones of novels and spend several weeks. Create a very long group of all the great things you have obtained.
Basically, comprehending essay query necessitates longer time than you believe, but it's on the list of main issues with composition writing process. My composition might develop to an different beast. An descriptive article must secure a more profound connotation.
Students https://epublications.marquette.edu/cgi/viewcontent.cgi?article=1166&context=hist_fac have a challenging time written down should they actually don't have a draft or outline to follow. Essay help companies provide university composition structure. Essays might be classified into four large groups.
You wish to get and, naturally maintain your reader interest. On how to create procedure essays, the directions must wind up being useful for readers. The most frequently struck paper writing service that the almost all our clients demand is essay writing.
The technique wasn't necessarily utilized to ascertain what's not authentic, but alternatively to discover what can be accurate. Using images will let you use custom made fonts, but it is going to add to page loading period will call in a variety of resolutions for further things to consider for scaling, also can bring about accessibility troubles. Selecting techniques You want a list of strategies to do a research about them of your choice and also the area.
The Socratic strategy wasn't of necessity employed to establish what's not authentic, but as an alternative to figure out what can not be true. Using images may permit you to utilize tailor generated fonts, but it will include page load period will call for concerns for scaling in several resolutions, and could bring about accessibility difficulties. Or, based around the intricacy of the subject, one paragraph can be taken by you for that.
The program can generate a whole essay in under a second, dependent on a few keywords. Soon after best spot to get an essay all you desire the best coursework writing assist in the price tag. Also, you can look for sample expository essay topics so you will understand what to research and that which you will deal with.
The readers must realize the character of this remainder of the essay from the thesis statement. Definition essay topics in most of the instances, the terms need to have a significance. Your definition needs to differ from these sources.
The aforementioned words aptly define the intent of writing an essay. It's therefore crucial that you know what a definition essay is. The very first paragraph need contain the debut of the essay.
Following that, you can proceed to compose a brief background information regarding the movie or book. You're the owner of your story, and you need to learn to tell it. No matter your plans after, being a great writer and crystal clear thinker will offer you a leg up your competition.
The viewers must realize the character of the remainder of the article. It's mandatory that you publish that each brings an effect within your article. The remedy to term needs to be harsh.
Let us have a glance at the strengths and pitfalls of designer infants. The trick is to start looking for techniques to develop conclusions about color. Effectively, it is dependent upon the sort of articles.
Let's take a glance at designer babies' benefits and pitfalls. The trick is to look for useful tactics to create decisions about shade. Given 2 equally excellent designs, comprehending that you solution is much more easy to execute in code may allow you to save you and the programmer a great deal of time.
Your thesis ought to be restricted to that which is done in the range of pages. A superb outline can allow one to arrange your ideas at proper purchase. Or, based on the intricacy of the subject, you can select one paragraph that is because of that.
If you wish to grow into a compelling writer, identify your own voice read always and consistently, and plan to adopt exposure that is radical. Written down a rhetoric essay Eventually a magnificent mind with notions and ideas go a very long way. A definition meant to earn a vague concept more accurate.
When talking with someone it will help to comprehend what sort of conversation you're in. You've got to let them have an concept of your age and the manner in which you're as a individual back afterward. If you think carefully your entire life you're aware it is likely to be both completely proficient and still be likable and hot.
It is possible so that it's specific to the debate which you're proposing on your specific article to always structure your issue. Thinking about extent and this whole subject can help you to initiate the composing process. Truth is quite a issue.


Seventy-five-year-old Lily Devin was in a terrible state. Overnight, everything of value had been taken from the garage at the side of her house – all the gardening equipment that her recently-deceased husband, Bob, had owned, from ride-on lawnmower to strimmer to sprayer to chainsaw and more.
It was quite a haul, Miss Flanagan knew, at this time of year when there was a market for 'fell off the back of a lorry' gardening equipment. She arrived at Lily's before the Gardai did. After making Lily comfortable she quickly went outside to survey the area.
Taking care to touch nothing, she took photographs of the scene from garage shelves to floor to the ground outside all the way to the road gate.
On her bike now she cycled up the road. She had seen no marks of a vehicle having pulled into a gateway as she cycled up but perhaps there was something in the other direction? A hundred yards away there was a wide grass margin, she saw. Something had pulled in there overnight, she noted, from the marks.
Again her phone camera was out and used to capture the images.
It wouldn't have taken thieves long to carry the items to the boot of a car and return for more if necessary, she decided. They'd have been able to see approaching lights from a long distance so would have known that they'd have time for their dishonest activity or not.
Satisfied that she had her preliminary evidence gathering done she went back into the house where Lily was sitting near the heater, a blanket round her shoulders, to help with the shock.
Maybe it's as well Lily hadn't seen or heard anything, she thought.
What could she have done anyway and confronting thieves, at her age or any age for that matter, wouldn't be a good idea.
Neighbours had gathered by the time the Gardai had arrived – the Allens, Finns and young Caitlin Moore from up the road. Everyone was shocked that Lily had been robbed.


text:
Ask a Married Priest
Do you have questions about a married priesthood? Want to learn more?
Continue to walk with us as you have done in the past. We are committed to a new day in our Church. Let us go forward into that new day.
In Remembrance: Our Pioneers
We remember with love and gratitude the women and men who contributed to the reform and renewal of Catholic ministry, helping our Church on the road to a truly inclusive priesthood. Read more...
Documents and web resources speaking to the issue of a Married Priesthood.
We, the undersigned members of Catholic Organizations for Renewal (COR), are outraged by and unequivocally condemn the violent storming of the United States Capitol that we witnessed on January 6, 2021. At the same time, as faithful Catholics, we lament the U.S. Catholic community's complicity and participation in fostering an environment that encouraged and enabled such violence.
To be clear, the chaos and violence that terrorized our nation on Wednesday was a direct and foreseeable result of more than four years of President Trump's violent, racist, xenophobic, and misogynistic rhetoric – rhetoric that many U.S. bishops repeatedly failed to name and condemn both individually and collectively. Even now, the president of the United States Conference of Catholic Bishops (USCCB) released a tepid statement that condemns violence but does not acknowledge President Trump's role in encouraging it or their own complicity in it.
We also recognize that many of our fellow Catholics staunchly supported Donald J. Trump throughout his four years as president. Some even served in the administration. And nearly half of Catholic voters supported his reelection in 2020.
We cannot ignore that many Catholics cast their votes influenced – in part – by statements, letters and sermons from clergy that masqueraded as Catholic teaching. At odds with Pope Francis, the official statement of the USCCB, "Forming Consciences for Faithful Citizenship," placed opposing abortion access and LGBTQ rights above upholding the lives and dignity of the poor and vulnerable, reversing the disastrous effects of global climate change, and dismantling oppressive ideologies such as white supremacy and nationalism.
As a people of faith, we reaffirm our commitment to Gospel values of non-violence and love of neighbor and we pray that the violence that unfolded before us on the Feast of the Epiphany will yield a new epiphany – that we as a Catholic community will work with ever more diligence to become the community of justice-makers that our baptisms call us to. We pray, too, for President-elect Joseph R. Biden (a fellow, faithful Catholic), Vice-President-elect Kamala Harris, and all our elected representatives as they begin the work of leading our nation toward healing and justice.
Quixote Center
Roman Catholic Womenpriests - USA
Southeastern Pennsylvania Women's Ordination Conference
Women's Ordination Conference


THIS SUNDAY! 7pm EST. Special gathering in our home with Charmaine Hedding. Charmaine was recently profiled on CBN for her incredible rescue work in the Mideast. Note that Charmaine will also be ministering at Good Shepherd in Ephrata PA Sunday morning. For more info on PA gathering CLICK HERE. To attend Jon & Jolene's home gathering CLICK HERE.
NEXT SATURDAY NIGHT! 6pm Jon & Jolene at Victory Church Sarasota with Brian & Bren Gibbs. For more info CLICK HERE.
SPECIAL AUDIO for you! The Midnight Cry! From our recent Evansville conference. Not only will the word help you discern the times, but move with Him into the new! TO LISTEN CLICK HERE.
FIRST… special thanks to all the Lamplighter leaders and intercessors who took the reins of the night watch for a second week in a row this Wednesday! You are my heroes. This is such a key time to watch with the Lord through the night!
SECOND… I want to briefly comment on the current controversies regarding racism right now.
The restoration movement in our nation is nothing less than a genuine move of God. It is overarching, but encompasses a governmental shift which is realigning with our covenantal roots and purpose. Which means that whether you're in a top seat in a governmental office or a top seat of the prayer movement, whether you're anchoring a news show or blazing trails in high finance or entertaining millions or ministering to the broken in a shelter, your heart must be clear and your standard of conduct clear. NO ROOM FOR RACISM.
This movement is for all. At least the way the Lord showed that to me. On January 5, 2016 I awoke from a dream where Donald Trump had won the contract to restore the Department of Homeland Security. As he worked on a neglected and dilapidated portion of the campus I saw black and hispanic women in an incredible procession, shouting high praises to Jesus as they entered through the gates of Homeland Security.
I knew then this represented two things. First, Christians would be welcomed back into government. Second, President Trump's administration would greatly benefit all people, accelerating God's dream for this nation to reflect heaven on earth. With every tongue, tribe and nation worshiping the Lord.
Keep in mind I received this dream while Donald Trump was still just a face in the crowd among competitors for the Republican candidacy. Our 50 state Glory Train—Turnaround Tour, focusing on national governmental turnaround, soon followed. And we've been standing for the fullest expression of this turnaround in Washington DC ever since. I have to say, we've seen miracles.
Just today new statistics are out proving the veracity of this prophetic dream. Unemployment among Blacks and Hispanics is at a historic low. Truly all races and people are benefitting from the economic resurgence unleashed through the Trump administration.
And it's my conviction America must now move beyond the exhausted accusation that President Trump is racist. From my own meetings at the White House I have seen Hispanics and Blacks taking the lead in influencing the President from a faith perspective. He's attentive. He's compassionate. And he genuinely wants to do the right thing.
Remember, Trump is the guy who for an entire decade declared Oprah Winfrey to be his preferred running mate if ever he ran for president. To anyone who would listen. Including CNN's Larry King back in the day. That doesn't sound like racism or bigotry or even misogyny to me.
Obviously the politics of the 2016 presidential race would have made an Oprah pick a little awkward—for Oprah more than Trump. When Trump finally ran, amazing statesman Mike Pence was offered the position of Vice President, and the nation and the world have forever been impacted by his quiet strength, profound discretion, generosity of spirit, and unabashed love for God and for our nation. We are grateful for the leadership of Mike Pence!
Does the Trump administration possess a clear slate and perfect record? NO. Neither do you. Further, both the liberal and conservative media are bringing to light the incredible vitriol, malice and prejudiced attitudes openly promoted by leaders from both sides.
Friends, it's time for a new way forward. More on that in a moment.
But amidst the accusations, I want to highlight that President Trump is bringing tangible results to actually counter racism and bias in our nation and world.
I've mentioned the amazing economic turnaround now being experienced by people of color, as well as the rest of our nation. Now I want to bring to light a more delicate issue—countering historic racism through diplomacy. Especially anti-Semitism, which Chuck Pierce refers to as the root of all racism.
Current policies towards Israel have countered a historic, unspoken embrace of anti-Semitism by many Secretaries of State. Like, over decades. This is a huge breakthrough after decades of prayer on behalf of the State Department to break this cycle.
When Hitler was rising to power, clear intelligence warned of present and future atrocities against the Jews in Germany. But the mandate of appeasement was followed. Franklin Roosevelt's Secretary of State refused entry to America for Jews fleeing for their lives. The Holocaust soon eliminated more than 6 million Jews from the face of the earth.
When the new State of Israel declared independence, Harry Truman's Secretary of State fought vehemently against recognizing the newly-formed refuge for Holocaust victims and Jews worldwide. Truman made a courageous call. And history was forever redefined.
When President Obama sought to facilitate a deal with Iran putting Israel in existential jeopardy, his Secretary of State pushed the deal through. And when the United Nations sought to enact a resolution declaring the Western Wall, the holiest site in all Judaism, to be Palestinian territory illegally occupied by the Jews, John Kerry helped push it through—as the last major diplomatic action of the Obama presidency.
When President Trump sought to honor Jerusalem as Israel's capital and relocate its embassy, thereby finally honoring the right of this sovereign state to choose the location of its own capital, then-Secretary of State Rex Tillerson argued vehemently against it. He was dismissed. New Secretary of State Mike Pompeo helped to oversee the transition of our embassy in Israel from Tel Aviv to Jerusalem, with his full support.
Again, this action countered decades of anti-Semitic bias and anti-Israel bias through diplomacy from before the time of the Holocaust.
That's quite an achievement. Thank God you've been praying. It is awesome to finally see a turnaround. And in case you haven't noticed, it's happening across the spectrum of government and the landscape of America.
On August 25, 2017, not long after the Charlottesville tragedy, I received a vision. In the vision I was at a train station, above and behind the engine of a large train. As with my original vision of the Glory Train, the train's engine looked like it was made of pure gold. But unlike my previous vision, this engine was not a locomotive. Instead it looked very modern and new. I knew in the vision the train represented the body of Christ.
There was a platform on either side of the train. I looked to the right of the train engine, and saw a group of people literally with white sheets and pointed hats. I looked to the left of the train engine, and saw people dressed in black. All of the sudden smoke or steam shot out from under the wheels of this gold engine. AND THE TRAIN BEGAN TO MOVE FORWARD AND LEAVE THE STATION.
I believe the vision represents the Glory Train. And in a larger sense, the vision conveys how this movement is now moving beyond both the radical left and the radical right. The passengers on this train were all aboard. No room for those who remain with either group! And we, the body of Christ, made up of people from every tribe and tongue and nation, are now moving beyond their sabotage to set a new course for our nation.
We are in a new season. This restoration train is leaving the station! We are advancing beyond the confines the enemy established to both confine us and define us.
Instead, honor is prevailing. Dignity is prevailing. Love, strength, justice and freedom are prevailing. And that's what this movement is all about.
NextCall Tonight! June 6—An Amazing Convergence!


REPORT OF THE WEEK | Before They Were Famous | Reviewbrah Biography SUBSCRIBE: bit.ly/2z9TmzZ INSTAGRAM: www.
If you enjoyed this, consider checking out my latest Reviewbrah video: thexvid.com/video/zsQsMhHXZfk/video.html It's Amazon echo, but it's actually good ole reviewbrah.
hoodrat hoodrat hoodrat Original Content from ReportoftheWeek's Channel: thexvid.com/user/TheReportOfTheWeek.
if you haven't subscribed to him already, you're seriously missing out. his channel is reportoftheweek. he's basically god status. #reviewbrah #reportoftheweek.
SUBSCRIBE to Reviewbrah: thexvid.com/user/TheReportOfTheWeek SUBSCRIBE: bit.ly/DaymDropsFam If you'd like to support Daym Drops!
I've been getting a ton of requests to try out KFC's new Chicken and Waffles, I decided to try them both at once and got the Chicken and Waffles Sandwich!
lemme know any vids you wanna see :)))) instagram: gracebooth97 thexvid.com/user/TheReportOfTheWeek.


text:
'The era of stuffing people into offices like sardines is over': Costs rise as workers return to airier, cleaner offices
Dec. 29, 2021 at 4:16 pm Updated Jan. 19, 2022 at 12:07 am
JULIE WEED
The cost of office maintenance dropped significantly in the pandemic when workers went remote and companies saved money on services like cleaning and security, as well as perks like dry cleaning and endless pantry snacks.
But as employees begin to head back to the office, the cost of running the workplace is increasing.
By December, about 40% of workers had returned at least part time, although the omicron variant of the coronavirus has put a chill on return-to-office plans. And developers still expect that employees will be back on-site in the long run, even if hybrid work becomes more common. CP Group, which owns and manages 32 office buildings, mostly in the Southeast and Southwest, has bought $1.2 billion of office space since May, a wager that staffs will return.
More robust air filtration and newly installed outdoor spaces are among the items that will add to developers' costs when more employees return. New cleaning practices may make those services more expensive.
"Operating expenses were down a bit in 2020," said Kristin Mueller, chief operating officer for property management at JLL, a real estate services company that oversees more than 1,000 office buildings across the United States. "For 2022 properties budgets, we are anticipating modest overall increases."
The cost to run the office today remains lower than pre-pandemic levels, but not as significantly as many managers expected, Mueller said.
Having fewer employees on-site translates to less daily cleaning and trash collection, for instance, but those reduced janitorial services are often countered by directives for deep disinfecting, as well as higher labor costs for maintenance. And spending on supplies like coffee filters, pens and paper towels may be down, but they have been replaced by purchases like hand sanitizer and masks.
Because the coronavirus is spread by air, one of the most significant changes in building operation has been a focus on air quality. Many companies are scrutinizing their ventilation, which could involve installing more robust air filters to screen out virus particles, for example, or replacing the building's air more frequently. Water and electricity use may be lower than usual, but even with fewer people in the building, heating, ventilation and air conditioning systems costs have probably increased.
Companies rethink return-to-office plans amid omicron cases
The worst of both worlds: Zooming from the office
The Centers for Disease Control and Prevention lists ways buildings can improve ventilation, like by running HVAC systems at maximum for two hours before and after buildings are occupied.
Employers are paying attention to air quality as never before, said Nellie Brown, a health and safety specialist with Cornell University's School of Industrial and Labor Relations.
"If you don't spend money on upgrading your ventilation, you might be spending it on sick people," Brown said.
She added that these upgrades could have helped reduce the spread of the seasonal flu in years past had they been in place.
Upgrading HVAC systems can be expensive and add monthly costs. New equipment for a typical 100,000-square-foot office building in Chicago, for example, might cost up to $100,000 to install, Mueller said, and can add 5% to 10% to monthly bills. For offices in milder climates, just opening the windows can increase air quality, although many office windows do not open.
Building managers are creating more rooftop and patio spaces for workers. Maintaining those spaces will mean additional costs, like heating or cooling, but Angelo Bianco, CP Group's managing partner, said his company was adding outdoor lounge space "to every building we own." Some new designs focus on flexible indoor-outdoor spaces, like an airy lobby coffee shop with indoor seating and garage-door type walls that can be opened to patio space.
Adding outdoor spaces was already a trend before the pandemic, but "now it is elevated in priority," said Greg Smith, CEO of Urban Visions, a Seattle developer. He has three projects set to open in the next few years, and each one offers significant outdoor venues.
"The era of stuffing people into offices like sardines is over," he said.
Some office building changes are more about peace of mind than actual effect, like shifting overnight janitorial staff to daytime hours so employees see the building being cleaned.
"If the building doesn't feel safe, they will not enter it," Mueller said.
Updating employees on building infrastructure is another pandemic-inspired practice.
"Until 18 months ago, almost nobody cared about 'healthy buildings,'" Bianco said. "That's irrevocably changed."
Now employees might be asking how often air filters are cleaned and about their effectiveness. Brown, of Cornell, has been offering training sessions for building managers to help them explain air filtration systems to their employees. Companies need to rethink their maintenance costs with the future in mind.
Some bosses want workers back in the office despite COVID. Here's why
"We can't go back to the way we were," she said.
Before the pandemic, developers were already offering services like dry cleaning, shoe repair and grocery pickup. As employers compete for talent now, Smith said, creating an environment that has the right amenities is part of hiring and retention. These might include workout facilities, showers, health clinics, indoor and outdoor greenery, bicycle parking or lockers where packages can be delivered.
One of the pandemic's biggest challenges has been child care, which many workers have cited as a reason to work from home or quit jobs altogether. Recognizing this struggle, Bianco said his properties were building more on-site child care facilities to accommodate parents.
"The question is, 'Why would employees want to come back, and what amenities do I need to provide?' " Smith said, adding that when he talks to the interested tenants, "everything is on the table."
Some cost-saving work-from-home habits are accompanying employees back to the office. At Turner & Townsend, a consulting firm with 750 employees, printing and copying costs are still only 15% of what they were, said James McDade, the company's chief financial officer for North America. Workers got used to sharing documents on screen rather than handing out copies.
"Spending on basic office supplies will never go back to pre-pandemic levels," he said, "because we just work differently now."
This story was originally published at nytimes.com. Read it here.


The properties of high frequency electromagnetic radiation are incredibly important in the world of medicine, allowing physicians to look inside the human body and even combat cancer.
X-rays and gamma rays have shorter wavelengths and higher frequencies.
They are useful in medical practice in controlled situations.
X-rays pass through tissue but not bone so they are useful for medical diagnosis.
Gamma rays' ionizing power is used to destroy cancer cells.
Visible light has no significant effect when it shines on us. But other types of light, like x-rays and gamma rays, are much more powerful.
With the shortest wavelengths, x-rays and gamma rays are found at the far end of the electromagnetic spectrum.


text:
Het Beleg van Bari duurde van 5 augustus 1068 tot 15 april 1071. De verovering van Bari door de Noorman Robert Guiscard betekende het einde van het katapanaat Italië, en daarmee van de Byzantijnse gebieden in Italië.

Context
Sinds 1030 hadden de Noormannen vaste voet in Zuid-Italië. Voordien en nadien leverden ze hand-en-spandiensten. Met Robert Guiscard veranderde de opportunistische houding naar een permanente verovering van grondgebied. Samen met zijn broer Rogier I van Sicilië vatten ze rond 1060 het plan op om de Byzantijnen te verwijderen uit de hiel van Italië en de Arabieren uit Sicilië.

Op 5 augustus 1068 begon Robert Guiscard met het beleg van Bari, de belangrijkste toevoerhaven van het katapanaat. Al vlug werd het hem duidelijk dat gewapenderhand de stad innemen niet mogelijk was en daarom probeerde hij de stad te omsingelen, wat ook een huzarenstukje was, aangezien Byzantium continu de stad bevoorraadde met soldaten en voedsel. In 1068 veroverden de Noormannen Otranto en in 1070 Brindisi. De bevoorrading vanuit Byzantium werd meer en meer opgevangen op zee en hongersnood trof de stad. Op 15 april 1071 capituleerde de stad, en het laatste Byzantijnse bolwerk in Italië was ingenomen.

Bronnen
https://www.britannica.com/event/Siege-of-Bari

Bari
Veldslag in Italië
Geschiedenis van Apulië
Bari
Byzantijnse veldslag
1060-1069
1070-1079

redpajama_set_name: RedPajamaWikipedia


The removable carrier on all '65-'73 Mustangs was red primer color. I recommend Ditzler DP-74LF for a durable finish with excellent color match. You may want to look closely at the carrier to see if it was painted before machining. External machined areas should be natural, not painted, to be concours correct.
Color Change or No?I have a '66 GT convertible that has a paint code of V. I can't decide whether to paint it original or change the color. Emberglo is pretty, but not my favorite.
Emberglo is a great color on a '66 GT Mustang convertible. Changing the color of your car to Night Mist Blue will definitely hurt its resale value. How rare Night Mist Blue is for a '66 Mustang is irrelevant in a color-change repaint. If you're concerned about value or concours Mustang events, I would strongly urge you to repaint your GT the original color.
The underside of the hood should be painted body color. Most Grande Mustangs had hood insulation. If equipped with air conditioning, the pad was standard. I would recommend a minimum of two gallons of paint so you don't have to worry about shortage and still have extra for later touchups.
'69 Rear SpoilersI read your answer from the May '04 issue that focused on the texture of paint used on the spoilers from the factory. In 1969, I purchased the first '69 Mach 1 sold in Delaware. It was an S-code 390 with an automatic. Several months later, I noticed the Boss 302 cars with spoilers, and I ordered one from the local Ford dealer. I remember this vividly because when I ordered the spoiler, the over-the-counter price was $64. When I picked it up, the price had jumped to $104. I argued to no avail and took the spoiler.
You are correct in your observation. Correct '69 rear spoilers (Ford PN C9ZZ-6344210-A) were low-gloss black with no texture. The '70 rear spoiler (Ford PN D0ZZ-6344Z10-A) was textured low-gloss black. Today, I would prime the '69 spoiler with a couple of coats of black DP90LF primer, block to remove imperfections, and topcoat with low-gloss black. The textured black hides small imperfections, however it is not concours correct for '69 model applications.
Re-dyeing DashpadsI'm currently deployed to the Middle East, but will start the restoration of an R-code '69 Mach 1 upon my return to the States. I have checked numerous sources and cannot find anyone who makes a replacement dashpad in red. I've seen ads for white ones that can be dyed, but I would prefer the original color from the start. Do you know of anyone who sells such an item?
An original red dashpad is a rare find. Obtain an original Ford dashpad in black, then dye it with the Ditzler PPG Specialty Performance Elastomeric Color System. This is a vinyl interior system sprayed from a gun; no rattle can is available. This system will look and perform as original. I always wipe down the pad with clean DDL-16 lacquer thinner to clean and soften the vinyl for better adhesion.
I would recommend Jim Cowles at Shelby Parts and Restoration (920/896-3730) for any and all questions on parts and interchanges on FE engine applications. Jim is one of the top builders in the country.
Bill Herndon at Pony Warehouse (301/977-0309) is a full-service parts dealer who specializes in N.O.S. Mustang parts and restoration of original parts such as shifters, consoles, steering wheels, clocks, radios, and Rally Pacs. Give Bill a call.


We introduce the first temporal-difference learning algorithms that converge with smooth value function approximators, such as neural networks. Conventional temporal-difference (TD) methods, such as TD($\lambda$), Q-learning and Sarsa have been used successfully with function approximation in many applications. However, it is well known that off-policy sampling, as well as nonlinear function approximation, can cause these algorithms to become unstable (i.e., the parameters of the approximator may diverge). Sutton et al (2009a,b) solved the problem of off-policy learning with linear TD algorithms by introducing a new objective function, related to the Bellman-error, and algorithms that perform stochastic gradient-descent on this function. In this paper, we generalize their work to nonlinear function approximation. We present a Bellman error objective function and two gradient-descent TD algorithms that optimize it. We prove the asymptotic almost-sure convergence of both algorithms for any finite Markov decision process and any smooth value function approximator, under usual stochastic approximation conditions. The computational complexity per iteration scales linearly with the number of parameters of the approximator. The algorithms are incremental and are guaranteed to converge to locally optimal solutions.


text:
source : Khamenei News
Martyr Soleimani's role in the realization of a post-American region
January is the month whose first days have become a symbol of the emergence of the post-American world. From the martyrdom of General Qasem Soleimani on January 3, 2020, to the US Congress takeover by protesters on January 6, 2021, all these January events have a clear message: The era of liberal democracy and American hegemony is over.
Muhammad Mahdi Abbasi, researcher in the field of American Studies
This collapse of hegemony which is especially evident in West Asia, is in reality the outcome of the heroic endeavors and actions of the Axis of Resistance and, above all, the endeavors and actions of Martyr Soleimani. In order to shed light on Martyr Soleimani's role in bringing an end to US hegemony and defeating Western plots in the region, we must first address the issue of current US objectives in West Asia.
After the 9/11 attacks, the United States began to militarily occupy West Asia under the pretext of fighting terrorism. At that time, American officials and strategists like Zbigniew Brzezinski unveiled various plans and plots such as "The Greater Middle East" or "The New Middle East" plans. For example, during the 33-day Lebanon War in 2006, then-US Secretary of State Condoleezza Rice said in an important speech: "What we're seeing here is, in a sense, the growing — the birth pangs of a new Middle East, and whatever we do, we have to be certain that we're pushing forward to the new Middle East, not going back to the old Middle East."
These remarks evidence the US government's plans for West Asia. In fact, the US was trying to implement this project in order to first, bring a laissez-faire economic system to the countries of the region and turn them into a bloc revolving around Israel and, second, expand the model of liberal democracy into the countries of the region. Former US President George W. Bush proclaimed this in a 2003 speech after the fall of Saddam Hussein, saying: "Iraqi democracy will succeed, and that success will send forth the news from Damascus to Tehran that freedom can be the future of every nation. The establishment of a free Iraq at the heart of the Middle East will be a watershed event in the global democratic revolution."
At the same time, then-US Vice President Dick Cheney announced in his speech at the Davos World Economic Forum that the US government was committed to "promoting democracy throughout the greater Middle East and beyond."
Nonetheless, this project failed like other US government projects, despite its huge costs. Twenty years after the beginning of those wars, the current political situation in Iraq and Afghanistan attests to this reality. The wars, apart from costing the US economy trillions of dollars, led to many casualties in regional nations. According to a report by Brown University, more than 900,000 people have died in post-2001 US wars, with more than 70,000 civilians in Afghanistan and nearly 300,000 civilians in Iraq having been killed by these wars.
In the meantime, Western support for terrorist and takfiri groups in the region neatly completed this puzzle. Groups such as DAESH (ISIS) — which former US President Donald Trump admitted was created by the US government — tried to destabilize the region so that the US can pursue the strategy of creating a 30-year religious war in West Asia.
But what Western governments had never included in their calculations was Martyr Soleimani — a personality who disrupted their plans and plots and put an end to their destructive presence in the region.
The Lebanon War was the first serious confrontation between Martyr Soleimani and the Arrogant Front. He played a very important role in defeating the Zionist regime and its supporters in the 33-day war, thus bringing "The Greater Middle East" project to a deadlock.
Safauddin Tabaraian, translator of the book The Untold Stories of the 33-Day War, comments about the role of Martyr Soleimani in Hezbollah's victory in the 33-Day War: "I heard from Sayyid Hassan Nasrallah himself that Haj Qasem's role in our victory in the war was even greater than Imad Mughniyeh's role."
Martyr Soleimani also played a key role in equipping and strengthening the Resistance Front in Palestine. About this, Secretary General of the Palestinian Islamic Jihad Ziyad al-Nakhalah said a few years ago: "The power and facilities that Gaza has achieved today are the results of the great efforts of Martyr Soleimani. General Soleimani's strategic step began with sending rockets and weapons to the Gaza Strip, and this was like a miracle ... General Soleimani personally strived in this direction, traveled to many countries, and planned to transfer this military might [to Gaza]." Even today, many find it astonishing that the Gaza underground tunnels, which are approximately 360 kilometers long, was one of the strategies devised by Martyr Soleimani and Martyr Imad Mughniyeh.
Ultimately, leading the Axis of Resistance against the DAESH terrorist group was Martyr Soleimani's main action against the schemes of the Arrogant Front. Martyr Soleimani and his companions uprooted this evil force and restored security and peace to regional nations.
Martyr Soleimani's role in eliminating DAESH was so significant and pivotal that even American media outlets such as Newsweek, Business Insider, The Week and others acknowledged it many times over the years. Also, whenever some American officials tried to give themselves the credit for the elimination of DAESH, they faced decisive rebuttals from international experts and professors on this issue, pointing to the efforts of Martyr Soleimani.
For instance, Prof. Arshin Adib-Moghaddam of University of London said in response to Trump's attempts to give himself credit for destroying DAESH that it was Iran along with Russian air power that "dealt the decisive blows" to DAESH and Qasem Soleimani was the mastermind behind it.
In today's West Asia, the decline of the US is palpable and openly spoken about based on the reality on the ground. This change and growth in regional countries and the people's outlook is the result of the Resistance Front's struggles against global colonialism and arrogance and, without a doubt, Martyr Soleimani was and will remain among the most prominent figures of the Resistance Movement.
(The views expressed in this article are author's own and do not necessarily reflect those of ABNA24.com.), It was first published in Khamenei.ir.


The trailers for the upcoming Star Wars: The Force Awakens have their own unique style. It has some great pacing and build up as well as dramatic narration. Those are also the reasons why Dan Flesher decided to edit scenes from The Empire Strikes Back into a new trailer using the same style.
Dan's re-edit is interesting and it is a dramatic departure from the original trailer for Empire. Watch the original after you've checked out the first video. They are both pretty great in their own way, but I still prefer the original. It is just so action-packed.