text:
require 'json'

module CSI
  module Plugins
    # This plugin converts images to readable text
    # TODO: Convert all rest requests to POST instead of GET
    module DefectDojo
      @@logger = CSI::Plugins::CSILogger.create

      # Supported Method Parameters::
      # dd_obj = CSI::Plugins::DefectDojo.login(
      #   url: 'required - url of DefectDojo Server',
      #   api_version: 'required - api version to use v1 || v2',
      #   username: 'required - username to AuthN w/ api v1)',
      #   api_key: 'optional - defect dojo api key (will prompt if nil)',
      #   proxy: 'optional - proxy all traffic through MITM proxy (defaults to nil)'
      # )

      public_class_method def self.login(opts = {})
        url = opts[:url]
        opts[:api_version] ? (api_version = opts[:api_version]) : (api_version = 'v2')
        username = opts[:username].to_s.scrub

        api_key = if opts[:api_key].nil?
          CSI::Plugins::AuthenticationHelper.mask_password(
            prompt: 'API Key'
          )
        else
          opts[:api_key].to_s.scrub
        end

        proxy = opts[:proxy]

        dd_obj = {}
        dd_obj[:url] = url
        dd_obj[:authz_header] = "Token #{api_key}"
        dd_obj[:authz_header] = "ApiKey #{username}:#{api_key}" if api_version == 'v1'
        dd_obj[:proxy] = proxy
        dd_obj[:api_version] = api_version
        dd_obj[:api_version] = 'v1' if api_version == 'v1'

        dd_obj
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # rest_call(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   rest_call: 'required rest call to make per the schema',
      #   http_method: 'optional HTTP method (defaults to GET)
      #   http_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST'
      # )

      private_class_method def self.rest_call(opts = {})
        # Some scan reports are huge and require long timeouts...defaulting to 9 mins.
        request_timeout = 540

        dd_obj = opts[:dd_obj]
        rest_call = opts[:rest_call].to_s.scrub

        opts[:http_method] ? (http_method = opts[:http_method].to_s.scrub.to_sym) : (http_method = :get)

        params = opts[:params]
        http_body = opts[:http_body]

        content_type = 'application/json; charset=UTF-8'

        url = dd_obj[:url]
        api_version = dd_obj[:api_version]
        base_dd_api_uri = "#{url}/api/#{api_version}".to_s.scrub

         rest_client = CSI::Plugins::TransparentBrowser.open(browser_type: :rest)::Request
        if dd_obj[:proxy]
          rest_client = CSI::Plugins::TransparentBrowser.open(
            browser_type: :rest,
            proxy: dd_obj[:proxy]
          )::Request
        end

        case http_method
        when :get
          response = rest_client.execute(
            method: :get,
            url: "#{base_dd_api_uri}/#{rest_call}",
            headers: {
              content_type: content_type,
              authorization: dd_obj[:authz_header],
              params: params
            },
            verify_ssl: false,
            timeout: request_timeout,
            open_timeout: request_timeout
          )

        when :post
          if http_body.key?(:multipart)
            response = rest_client.execute(
              method: :post,
              url: "#{base_dd_api_uri}/#{rest_call}",
              headers: {
                authorization: dd_obj[:authz_header]
              },
              payload: http_body,
              verify_ssl: false,
              timeout: request_timeout,
              open_timeout: request_timeout
            )
          else
            response = rest_client.execute(
              method: :post,
              url: "#{base_dd_api_uri}/#{rest_call}",
              headers: {
                content_type: content_type,
                authorization: dd_obj[:authz_header]
              },
              payload: http_body.to_json,
              verify_ssl: false,
              timeout: request_timeout,
              open_timeout: request_timeout
            )
          end
        else
          raise @@logger.error("Unsupported HTTP Method #{http_method} for #{self} Plugin")
        end

        sleep 3

        response
      rescue RestClient::ExceptionWithResponse => e
        puts Time.now.strftime('%Y-%m-%d %H:%M:%S.%N %z')
        puts "Module: #{self}"
        puts "URL: #{base_dd_api_uri}/#{rest_call}"
        puts "PARAMS: #{params.inspect}"
        puts "HTTP POST BODY: #{http_body.inspect}" if http_body
        puts "#{e}\n#{e.response}\n\n\n"
      rescue StandardError, SystemExit, Interrupt => e
        dd_obj = logout(dd_obj) unless dd_obj.nil?
        raise e
      end

      # Supported Method Parameters::
      # tool_configuration_resource_uri_by_name(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   tool_config_name: 'required tool configuration name'
      # )

      private_class_method def self.tool_configuration_resource_uri_by_name(opts = {})
        dd_obj = opts[:dd_obj]
        api_version = dd_obj[:api_version]
        tool_config_name = opts[:tool_config_name].to_s.scrub

        tool_configuration_list = self.tool_configuration_list(dd_obj: dd_obj)
        if api_version == 'v1'
          tool_configuration_by_name_object = tool_configuration_list[:objects].select do |tool_configuration|
            tool_configuration[:name] == tool_config_name
          end
        end

        if api_version == 'v2'
          tool_configuration_by_name_object = tool_configuration_list[:results].select do |tool_configuration|
            tool_configuration[:name] == tool_config_name
          end
        end

        tool_configuration_by_name_object.first[:resource_uri] if api_version == 'v1'
        tool_configuration_by_name_object.first[:id] if api_version == 'v2'
      rescue StandardError, SystemExit, Interrupt => e
        dd_obj = logout(dd_obj) unless dd_obj.nil?
        raise e
      end

      # Supported Method Parameters::
      # product_list = CSI::Plugins::DefectDojo.product_list(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   id: 'optional - retrieve single product by id, otherwise return all'
      # )

      public_class_method def self.product_list(opts = {})
        dd_obj = opts[:dd_obj]
        opts[:id] ? (rest_call = "products/#{opts[:id].to_i}") : (rest_call = 'products')

        response = rest_call(
          dd_obj: dd_obj,
          rest_call: rest_call
        )

        # Return array containing the post-authenticated DefectDojo REST API token
        JSON.parse(response, symbolize_names: true)
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # engagement_list = CSI::Plugins::DefectDojo.engagement_list(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   id: 'optional - retrieve single engagement by id, otherwise return all'
      # )

      public_class_method def self.engagement_list(opts = {})
        dd_obj = opts[:dd_obj]
        opts[:id] ? (rest_call = "engagements/#{opts[:id].to_i}") : (rest_call = 'engagements')

        response = rest_call(
          dd_obj: dd_obj,
          rest_call: rest_call
        )

        # Return array containing the post-authenticated DefectDojo REST API token
        JSON.parse(response, symbolize_names: true)
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # engagement_create_response = CSI::Plugins::DefectDojo.engagement_create(
      #   dd_obj: 'required - dd_obj returned from #login method',
      #   name: 'required - name of the engagement',
      #   description: 'optional - description of engagement',
      #   engagement_type: 'optional - type of engagement Interactive||CI/CD (defaults to CI/CD)',
      #   status: 'optional - status of the engagement In Progress || On Hold (defaults to In Progress)',
      #   lead_username: 'required - username of lead to tie to engagement',
      #   product_name: 'required - product name in which to create engagement',
      #   test_strategy: 'required - URL of test strategy documentation (e.g. OWASP ASVS URL)',
      #   orchestration_engine: 'optional - name of orchestration engine tied to CI/CD engagement',
      #   build_server: 'optional - name of build server tied to CI/CD engagement',
      #   scm_server: 'optional - name of SCM server tied to CI/CD engagement',
      #   api_test: 'optional - boolean to set an engagement as an api assessment (defaults to false)',
      #   pen_test: 'optional - boolean to set an engagement as a manual penetration test (defaults to false)',
      #   threat_model: 'optional - boolean to set an engagement as a threat model (defaults to false)',
      #   check_list: 'optional - boolean to set an engagement as a checkbox assessment (defaults to false)',
      #   first_contacted: 'optional - date of engagement request e.g. 2018-06-18 (Defaults to current day)',
      #   target_start: 'optional - date to start enagement e.g. 2018-06-19 (Defaults to current day)',
      #   target_end: 'optional - date of engagement completion e.g. 2018-06-20 (Defaults to current day)'
      # )

      public_class_method def self.engagement_create(opts = {})
        http_body = {}

        dd_obj = opts[:dd_obj]
        api_version = dd_obj[:api_version]

        # HTTP POST body options w/ optional params set to default values
        # Defaults to true
        http_body[:active] = true

        http_body[:name] = opts[:name]

        http_body[:description] = opts[:description]

        opts[:engagment_type] ? (http_body[:engagement_type] = opts[:engagement_type]) : (http_body[:engagement_type] = 'CI/CD')

        status = opts[:status].to_s.strip.chomp.scrub

        case status
        when 'In Progress', 'On Hold', ''
          # Defaults to 'In Progress'
          status == '' ? (http_body[:status] = 'In Progress') : (http_body[:status] = status)
        when 'Completed'
          raise 'Completed status not implemented for #engagement_create - use #engagement_update instead'
        else
          raise "Unknown engagement status: #{opts[:status]}.  Options for this method are 'In Progress' || 'On Hold'"
        end

        # Ok lets determine the resource_uri for the lead username
        lead_username = opts[:lead_username].to_s.strip.chomp.scrub
        user_list = self.user_list(dd_obj: dd_obj)
        if api_version == 'v1'
          user_by_username_object = user_list[:objects].select do |user|
            user[:username] == lead_username
          end
          http_body[:lead] = user_by_username_object.first[:resource_uri]
        end

        if api_version == 'v2'
          user_by_username_object = user_list[:results].select do |user|
            user[:username] == lead_username
          end
          # Should only ever return 1 result so we should be good here
          http_body[:lead] = user_by_username_object.first[:id]
        end

        # Ok lets determine the resource_uri for the product name
        product_name = opts[:product_name].to_s.strip.chomp.scrub
        product_list = self.product_list(dd_obj: dd_obj)

        if api_version == 'v1'
          product_by_name_object = product_list[:objects].select do |prod|
            prod[:name] == product_name
          end
          # Should only ever return 1 result so we should be good here
          http_body[:product] = product_by_name_object.first[:resource_uri]
        end

        if api_version == 'v2'
          product_by_name_object = product_list[:results].select do |prod|
            prod[:name] == product_name
          end
          # Should only ever return 1 result so we should be good here
          http_body[:product] = product_by_name_object.first[:id]
        end

        http_body[:test_strategy] = opts[:test_strategy]

        # Ok lets determine the resource_uri orchestration, build_server, and scm_server
        orchestration_engine = opts[:orchestration_engine].to_s.strip.chomp.scrub
        http_body[:orchestration_engine] = tool_configuration_resource_uri_by_name(
          dd_obj: dd_obj,
          tool_config_name: orchestration_engine
        )

        build_server = opts[:build_server].to_s.strip.chomp.scrub
        http_body[:build_server] = tool_configuration_resource_uri_by_name(
          dd_obj: dd_obj,
          tool_config_name: build_server
        )

        scm_server = opts[:scm_server].to_s.strip.chomp.scrub
        http_body[:source_code_management_server] = tool_configuration_resource_uri_by_name(
          dd_obj: dd_obj,
          tool_config_name: scm_server
        )

        # Defaults to false
        opts[:api_test] ? (http_body[:api_test] = true) : (http_body[:api_test] = false)

        # Defaults to false
        opts[:pen_test] ? (http_body[:pen_test] = true) : (http_body[:pen_test] = false)

        # Defaults to false
        opts[:threat_model] ? (http_body[:threat_model] = true) : (http_body[:threat_model] = false)

        # Defaults to false
        opts[:check_list] ? (http_body[:check_list] = true) : (http_body[:check_list] = false)

        # Defaults to Time.now.strftime('%Y-%m-%d')
        opts[:first_contacted] ? (http_body[:first_contacted] = opts[:first_contacted]) : (http_body[:first_contacted] = Time.now.strftime('%Y-%m-%d'))

        # Defaults to Time.now.strftime('%Y-%m-%d')
        opts[:target_start] ? (http_body[:target_start] = opts[:target_start]) : (http_body[:target_start] = Time.now.strftime('%Y-%m-%d'))

        # Defaults to Time.now.strftime('%Y-%m-%d')
        opts[:target_end] ? (http_body[:target_end] = opts[:target_end]) : (http_body[:target_end] = Time.now.strftime('%Y-%m-%d'))

        # Defaults to false
        http_body[:done_testing] = false

        rest_call(
          dd_obj: dd_obj,
          rest_call: 'engagements/',
          http_method: :post,
          http_body: http_body
        )
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # test_list = CSI::Plugins::DefectDojo.test_list(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   id: 'optional - retrieve single test by id, otherwise return all'
      # )

      public_class_method def self.test_list(opts = {})
        dd_obj = opts[:dd_obj]
        opts[:id] ? (rest_call = "tests/#{opts[:id].to_i}") : (rest_call = 'tests')

        response = rest_call(
          dd_obj: dd_obj,
          rest_call: rest_call
        )

        # Return array containing the post-authenticated DefectDojo REST API token
        JSON.parse(response, symbolize_names: true)
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # importscan_response = CSI::Plugins::DefectDojo.importscan(
      #   dd_obj: 'required - dd_obj returned from #login method',
      #   engagement_name: 'required - name of engagement to associate w/ scan',
      #   scan_type: 'required - type of scan importing (see <DEFECTDOJO_URL>/admin/dojo/test_type/ for listing)',
      #   file: 'required - path of scan results file',
      #   lead_username: 'required - username of lead to tie to scan',
      #   tags: 'optional - comma-delimited list of tag names to tie to scan',
      #   minimum_severity: 'optional - minimum finding severity Info||Low||Medium||High||Critical (Defaults to Info)',
      #   scan_date: 'optional - date in which scan was kicked off (defaults to now)',
      #   verified: 'optional - flag finding as verified by a tester (defaults to false)'
      # )

      public_class_method def self.importscan(opts = {})
        http_body = {}

        dd_obj = opts[:dd_obj]
        api_version = dd_obj[:api_version]

        # HTTP POST body options w/ optional params set to default values
        # Defaults to true
        http_body[:active] = true

        # Ok lets determine the resource_uri for the engagement name
        engagement_name = opts[:engagement_name].to_s.strip.chomp.scrub
        engagement_list = self.engagement_list(dd_obj: dd_obj)

        if api_version == 'v1'
          engagement_by_name_object = engagement_list[:objects].select do |engagement|
            engagement[:name] == engagement_name
          end
          # Should only ever return 1 result so we should be good here
          http_body[:engagement] = engagement_by_name_object.first[:resource_uri]
        end

        if api_version == 'v2'
          engagement_by_name_object = engagement_list[:results].select do |engagement|
            engagement[:name] == engagement_name
          end
          # Should only ever return 1 result so we should be good here
          http_body[:engagement] = engagement_by_name_object.first[:id]
        end

        http_body[:scan_type] = opts[:scan_type].to_s.strip.chomp.scrub

        # Necessary to upload file to remote host
        http_body[:multipart] = true
        http_body[:file] = File.new(opts[:file].to_s.strip.chomp.scrub, 'rb') if File.exist?(opts[:file].to_s.strip.chomp.scrub)

        # Ok lets determine the resource_uri for the lead username
        lead_username = opts[:lead_username].to_s.strip.chomp.scrub
        user_list = self.user_list(dd_obj: dd_obj)

        if api_version == 'v1'
          user_by_username_object = user_list[:objects].select do |user|
            user[:username] == lead_username
          end
          # Should only ever return 1 result so we should be good here
          http_body[:lead] = user_by_username_object.first[:resource_uri]
        end

        if api_version == 'v2'
          user_by_username_object = user_list[:results].select do |user|
            user[:username] == lead_username
          end
          # Should only ever return 1 result so we should be good here
          http_body[:lead] = user_by_username_object.first[:id]
        end

        http_body[:tags] = opts[:tags].to_s.strip.chomp.scrub

        minimum_severity = opts[:minimum_severity].to_s.strip.chomp.scrub.downcase.capitalize
        case minimum_severity
        when '', 'Info', 'Low', 'Medium', 'High', 'Critical'
          # Defaults to 'Info'
          minimum_severity == '' ? (http_body[:minimum_severity] = 'Info') : (http_body[:minimum_severity] = minimum_severity)
        else
          raise "Unknown minimum severity: #{opts[:minimum_severity]}.  Options are Info||Low||Medium||High||Critical'"
        end

        # Defaults to Time.now.strftime('%Y-%m-%d')
        opts[:scan_date] ? (http_body[:scan_date] = opts[:scan_date]) : (http_body[:scan_date] = Time.now.strftime('%Y-%m-%d'))

        # Defaults to false
        opts[:verified] ? (http_body[:verified] = true) : (http_body[:verified] = false)

        api_path = 'import-scan/'
        api_path = 'importscan/' if api_version == 'v1'

        rest_call(
          dd_obj: dd_obj,
          rest_call: api_path,
          http_method: :post,
          http_body: http_body
        )
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # reimportscan_response = CSI::Plugins::DefectDojo.reimportscan(
      #   dd_obj: 'required - dd_obj returned from #login method',
      #   engagement_name: 'required - name of engagement to associate w/ scan',
      #   scan_type: 'required - type of scan importing (see <DEFECTDOJO_URL>/admin/dojo/test_type/ for listing)',
      #   file: 'required - path of scan results file',
      #   tags: 'optional - comma-delimited list of tag names to tie to scan for unique test resource_uri retrival',
      #   test_resource_uri: 'optional - alternative to tag names to know which test to reimport',
      #   minimum_severity: 'optional - minimum finding severity Info||Low||Medium||High||Critical (Defaults to Info)',
      #   scan_date: 'optional - date in which scan was kicked off (defaults to now)',
      #   verified: 'optional - flag finding as verified by a tester (defaults to false)'
      # )

      public_class_method def self.reimportscan(opts = {})
        http_body = {}

        dd_obj = opts[:dd_obj]
        api_version = dd_obj[:api_version]

        # HTTP POST body options w/ optional params set to default values
        # Defaults to true
        http_body[:active] = true

        # Ok lets determine the resource_uri for the engagement name
        engagement_name = opts[:engagement_name].to_s.strip.chomp.scrub
        engagement_list = self.engagement_list(dd_obj: dd_obj)
        if api_version == 'v1'
          engagement_by_name_object = engagement_list[:objects].select do |engagement|
            engagement[:name] == engagement_name
          end
          # Should only ever return 1 result so we should be good here
          engagement_resource_uri = engagement_by_name_object.first[:resource_uri]
        end

        if api_version == 'v2'
          engagement_by_name_object = engagement_list[:results].select do |engagement|
            engagement[:name] == engagement_name
          end
          # Should only ever return 1 result so we should be good here
          engagement_resource_uri = engagement_by_name_object.first[:id]
        end

        # TODO: lookup scan_type for test resource_uri since the scan_type should never change
        http_body[:scan_type] = opts[:scan_type].to_s.strip.chomp.scrub

        # Necessary to upload file to remote host
        http_body[:multipart] = true
        http_body[:file] = File.new(opts[:file].to_s.strip.chomp.scrub, 'rb') if File.exist?(opts[:file].to_s.strip.chomp.scrub)

        # Ok lets determine the resource_uri for the test we're looking to remimport
        test_list = self.test_list(dd_obj: dd_obj)

        if api_version == 'v1'
          tests_by_engagement_object = test_list[:objects].select do |test|
            test[:engagement] == engagement_resource_uri
          end
        end

        if api_version == 'v2'
          tests_by_engagement_object = test_list[:results].select do |test|
            test[:engagement] == engagement_resource_uri
          end
        end

        tags = opts[:tags].to_s.strip.chomp.scrub
        # TODO: wait for solution to:
        # https://github.com/DefectDojo/django-DefectDojo/issues/457
        # in order to obtain the unique test resource_uri
        # by searching tags for unique identifier (would be better to have a unique test names)

        http_body[:tags] = tags

        http_body[:test] = opts[:test_resource_uri] if opts[:test_resource_uri]

        minimum_severity = opts[:minimum_severity].to_s.strip.chomp.scrub.downcase.capitalize
        case minimum_severity
        when '', 'Info', 'Low', 'Medium', 'High', 'Critical'
          # Defaults to 'Info'
          minimum_severity == '' ? (http_body[:minimum_severity] = 'Info') : (http_body[:minimum_severity] = minimum_severity)
        else
          raise "Unknown minimum severity: #{opts[:minimum_severity]}.  Options are Info||Low||Medium||High||Critical'"
        end

        # Defaults to Time.now.strftime('%Y-%m-%d')
        opts[:scan_date] ? (http_body[:scan_date] = opts[:scan_date]) : (http_body[:scan_date] = Time.now.strftime('%Y/%m/%d'))

        # Defaults to false
        opts[:verified] ? (http_body[:verified] = true) : (http_body[:verified] = false)

        api_path = 'reimport-scan/'
        api_path = 'reimportscan/' if api_version == 'v1'

        rest_call(
          dd_obj: dd_obj,
          rest_call: api_path,
          http_method: :post,
          http_body: http_body
        )
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # finding_list = CSI::Plugins::DefectDojo.finding_list(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   id: 'optional - retrieve single finding by id, otherwise return all'
      # )

      public_class_method def self.finding_list(opts = {})
        dd_obj = opts[:dd_obj]
        opts[:id] ? (rest_call = "findings/#{opts[:id].to_i}") : (rest_call = 'findings')

        response = rest_call(
          dd_obj: dd_obj,
          rest_call: rest_call
        )

        # Return array containing the post-authenticated DefectDojo REST API token
        JSON.parse(response, symbolize_names: true)
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # user_list = CSI::Plugins::DefectDojo.user_list(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   id: 'optional - retrieve single user by id, otherwise return all'
      # )

      public_class_method def self.user_list(opts = {})
        dd_obj = opts[:dd_obj]
        opts[:id] ? (rest_call = "users/#{opts[:id].to_i}") : (rest_call = 'users')

        response = rest_call(
          dd_obj: dd_obj,
          rest_call: rest_call
        )

        # Return array containing the post-authenticated DefectDojo REST API token
        JSON.parse(response, symbolize_names: true)
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # tool_configuration_list = CSI::Plugins::DefectDojo.tool_configuration_list(
      #   dd_obj: 'required dd_obj returned from #login method',
      #   id: 'optional - retrieve single test by id, otherwise return all'
      # )

      public_class_method def self.tool_configuration_list(opts = {})
        dd_obj = opts[:dd_obj]
        opts[:id] ? (rest_call = "tool_configurations/#{opts[:id].to_i}") : (rest_call = 'tool_configurations')

        response = rest_call(
          dd_obj: dd_obj,
          rest_call: rest_call
        )

        # Return array containing the post-authenticated DefectDojo REST API token
        JSON.parse(response, symbolize_names: true)
      rescue StandardError => e
        raise e
      end

      # Supported Method Parameters::
      # CSI::Plugins::DefectDojo.logout(
      #   dd_obj: 'required dd_obj returned from #login method'
      # )

      public_class_method def self.logout(opts = {})
        dd_obj = opts[:dd_obj]
        @@logger.info('Logging out...')
        # TODO: Terminate Session if Possible via API Call
        dd_obj = nil
      rescue StandardError => e
        raise e
      end

      # Author(s):: Jacob Hoopes <jake.hoopes@gmail.com>

      public_class_method def self.authors
        "AUTHOR(S):
          Jacob Hoopes <jake.hoopes@gmail.com>
        "
      end

      # Display Usage for this Module

      public_class_method def self.help
        puts "USAGE:
          dd_obj = #{self}.login(
            url: 'required - url of DefectDojo Server',
            api_version: 'required - api version to use v1 || v2',
            username: 'required - username to AuthN w/ api v1)',
            api_key: 'optional - defect dojo api key (will prompt if nil)',
            proxy: 'optional - proxy all traffic through MITM proxy (defaults to nil)'
          )

          product_list = #{self}.product_list(
            dd_obj: 'required dd_obj returned from #login_v1 method',
            id: 'optional - retrieve single product by id, otherwise return all'
          )

          engagement_list = #{self}.engagement_list(
            dd_obj: 'required dd_obj returned from #login_v1 method',
            id: 'optional - retrieve single engagement by id, otherwise return all'
          )

          engagement_create_response = #{self}.engagement_create(
            dd_obj: 'required - dd_obj returned from #login_v1 method',
            name: 'required - name of the engagement',
            description: 'optional - description of engagement',
            engagement_type: 'optional - type of engagement Interactive||CI/CD (defaults to CI/CD)',
            status: 'optional - status of the engagement In Progress || On Hold (defaults to In Progress)',
            lead_username: 'required - username of lead to tie to engagement',
            product_name: 'required - product name in which to create engagement',
            test_strategy: 'required - URL of test strategy documentation (e.g. OWASP ASVS URL)',
            orchestration_engine: 'optional - name of orchestration engine tied to CI/CD engagement',
            build_server: 'optional - name of build server tied to CI/CD engagement',
            scm_server: 'optional - name of SCM server tied to CI/CD engagement',
            api_test: 'optional - boolean to set an engagement as an api assessment (defaults to false)',
            pen_test: 'optional - boolean to set an engagement as a manual penetration test (defaults to false)',
            threat_model: 'optional - boolean to set an engagement as a threat model (defaults to false)',
            check_list: 'optional - boolean to set an engagement as a checkbox assessment (defaults to false)',
            first_contacted: 'optional - date of engagement request e.g. 2018-06-18 (Defaults to current day)',
            target_start: 'optional - date to start enagement e.g. 2018-06-19 (Defaults to current day)',
            target_end: 'optional - date of engagement completion e.g. 2018-06-20 (Defaults to current day)'
          )

          test_list = #{self}.test_list(
            dd_obj: 'required dd_obj returned from #login_v1 method',
            id: 'optional - retrieve single test by id, otherwise return all'
          )

          importscan_response = #{self}.importscan(
            dd_obj: 'required - dd_obj returned from #login_v1 method',
            engagement_name: 'required - name of engagement to associate w/ scan',
            scan_type: 'required - type of scan importing (see <DEFECTDOJO_URL>/admin/dojo/test_type/ for listing)',
            file: 'required - path of scan results file',
            lead_username: 'required - username of lead to tie to scan',
            tags: 'optional - comma-delimited list of tag names to tie to scan',
            minimum_severity: 'optional - minimum finding severity Info||Low||Medium||High||Critical (Defaults to Info)',
            scan_date: 'optional - date in which scan was kicked off (defaults to now)',
            verified: 'optional - flag finding as verified by a tester (defaults to false)'
          )

          reimportscan_response = #{self}.reimportscan(
            dd_obj: 'required - dd_obj returned from #login_v1 method',
            engagement_name: 'required - name of engagement to associate w/ scan',
            scan_type: 'required - type of scan importing (see <DEFECTDOJO_URL>/admin/dojo/test_type/ for listing)',
            file: 'required - path of scan results file',
            tags: 'optional - comma-delimited list of tag names to tie to scan for unique test resource_uri retrival',
            test_resource_uri: 'optional - alternative to tag names to know which test to reimport',
            minimum_severity: 'optional - minimum finding severity Info||Low||Medium||High||Critical (Defaults to Info)',
            scan_date: 'optional - date in which scan was kicked off (defaults to now)',
            verified: 'optional - flag finding as verified by a tester (defaults to false)'
          )

          finding_list = #{self}.finding_list(
            dd_obj: 'required dd_obj returned from #login_v1 method',
            id: 'optional - retrieve single finding by id, otherwise return all'
          )

          user_list = #{self}.user_list(
            dd_obj: 'required dd_obj returned from #login_v1 method',
            id: 'optional - retrieve single user by id, otherwise return all'
          )

          tool_configuration_list = #{self}.tool_configuration_list(
            dd_obj: 'required dd_obj returned from #login_v1 method',
            id: 'optional - retrieve single test by id, otherwise return all'
          )

          #{self}.logout(
            dd_obj: 'required dd_obj returned from #login_v1 or #login_v2 method'
          )

          #{self}.authors
        "
      end
    end
  end
end


text:
Listen: A new story from Marketplace
"Support this NPR station from NPR news this is All Things Considered I'm ari Shapiro and America these Kelly throughout his time in office president trump has tried to help the coal industry is rolled back environmental regulations he's pushed for subsidies and yet coal fired power plants continue to close today's casual to a major coal company run up by one of trump's biggest supporters and here's Jeff Brady reports on the bankruptcy of Marie energy in the Murray energy lobby in Saint Clairsville Ohio there's a photo of founder Bob Murray with president trump giving two thumbs up and in Murray's big corner office there's a replica of airforce two signed on the wing by vice president Mike pence there's also a constant hissing sound at seventy nine years old Bob Murray suffers from a lung condition that requires him to be on oxygen he says it's not related to his business check for that and it's not as a vendor was working in the coal mines which I did for seventeen years underground every day Murray built his business over decades and now says it's the largest underground coal mining firm in the country he accomplish that by buying other coal companies now a combination of large debts and a declining call market has forced them into bankruptcy my goal is to keep the company that keep it together for my employees as part of Marie's agreement that lenders his nephew Robert Moore will become president and CEO Murray will remain as chairman despite president trump's campaign promise to help the coal business dozens of coal power plants are shut down since he was elected Murray doesn't blame trump for his company's bankruptcy he says the administration has been helpful in rolling back environmental regulations Murray specifically asked for most of them including replacing president Obama's clean power plan and withdrawing from the Paris climate agreement but Murray says the coal industry needs even more help the government should be stepping in keeping coal fired generation in existence it's done nothing Marie once the federal energy regulatory commission or for contest subsidize struggling coal plants he says Cole with its fuel stored on site is more reliable the natural gas that has to be piped in hand renewable energy that only generates when the sun is shining in the wind blows so far regulators in grid operators have not been persuaded wearable crisis resiliency reliability and apart people want to freeze in the dark that is a prediction Marianne hit of the Sierra Club regex frankly this is just a scare tactic for those who want to try to take our country backwards into a twentieth century energy economy it says now the world needs renewable energy that doesn't contribute to climate change she says US power grids are managed by knowledgeable engineers focused on keeping electricity flowing every time a coal plant is proposed for retirement their job is to make sure that as that coal plant retires that our lights will stay on and there will be any threat to the reliability of our electricity coal miners represented by the United mine workers of America that will likely will suffer because of this bankruptcy industry analysts Natalie Biggs with wood mackenzie says Murray was one of the last remaining companies contributing to the union's pension fund you know without Murray energy a lot of the retired coal miners are gonna you know find themselves potential in a difficult situation when it comes to the pensions the union is asking Congress for help meantime US coal consumption has fallen to its lowest level in forty years as more utilities and states commit to energy with lower or no greenhouse gas emissions Jeff Brady NPR news Saint Clairsville Ohio earlier this month to business partners of Rudy Giuliani were arrested on their way out of the country they're accused of violating federal campaign finance laws part of the scheme allegedly involved funneling more than three hundred thousand dollars from a shell company to a super PAC supporting president trump we've been talking with some experts in election law and many of them are surprised not the size of the donation or the attempt to cover up the source of the funds those things are actually pretty common their surprise the love part us and Igor Fuhrman didn't cover their tracks better because there are options for people who want to completely obscure big political donations and here to talk about that is Robert McGuire of citizens for responsibility and ethics in Washington welcome thanks for having me our colleague Jeff Brady talk to left partners before the arrest and here's how he explained the donations this is actually the first couple times that I really started doing some bigger donations because I wanted to get notoriety from my energy company and I thought it might be a great way to you know play with the big boys as you call it now its so called energy company appears to have just been a shell company created weeks before the big donations but if you imagine the parties came to you and said here's what I want to do and I want to hide the money what would you have advised well you know America first action for example the super PAC they gave to house a five oh one C. for social welfare arm the doesn't have to disclose its donors it's run by essentially the same people out of the same address it is nominally a social welfare organization that's supposed to do things that benefit the community but these function essentially as stealth political groups that have the benefit of not disclosing the donor so the easiest way for them to have avoided the situation the now find themselves in is just to have given to that arm of the group there's obviously difference in transparency between the super pac on the one hand in the C. four on the other hand is there also a difference in how these groups can spend that money there is sort of on paper their rules for these groups and how much political activity they can engage in but the rear he is that in practice these groups can act essentially as stealth political committees they can spend millions of dollars to buy tens of thousands of apps for months and months and months out before an election and not report that spending to the Federal Election Commission unless it's thirty days before primary sixty days before general but there's also they can give grants to other politically active five one C. fours and count that as social welfare activity and that creates this turn where you see sort of daisy chains of groups they give grants to each other to offset their political spending so there's sort of a a wealth of options for these groups to make sure that they are maximizing the amount of money they're spending on politics without disclosing any donors so if I'm trying to donate half a million dollars to a campaign in order to buy some influence and curry favor with the candidate but I don't want the public to now is there any way that the candidate can find out because because I want them to know that I'm a big supporter there is right that is actually the key of dark money so we're not talking about no one knowing who is behind the group we're saying the public doesn't know but the candidates know who's funding these groups given that there are these more secretive options available why do you think left harness and eager freemen allegedly gave in a way that was so easy for them to get caught well I think if you listen to the clip it kind of gives some indication of they weren't sophisticated political donors they realize the reality that is if you are a major donor you are buying access to powerful people and indeed there are photos of them with very powerful people ranging from the governor of Florida to the president himself precisely what they didn't know so much as how to cover their tracks and it's unfortunate that there are much more sophisticated political donors that know exactly how to do that and make sure that the public doesn't know who is funding these groups and who is being repaired once these people are in office but it seems that in this case we had two people who it just sort of dove in head first and ran into the reality that there are ways to do this where you don't get in situation where they are now Robert McGuire."
90.3 KAZU
A new story from Marketplace
2 years ago | 90.3 KAZU
Automatic TRANSCRIPT
Support this NPR station from NPR news this is All Things Considered I'm ari Shapiro and America these Kelly throughout his time in office president trump has tried to help the coal industry is rolled back environmental regulations he's pushed for subsidies and yet coal fired power plants continue to close today's casual to a major coal company run up by one of trump's biggest supporters and here's Jeff Brady reports on the bankruptcy of Marie energy in the Murray energy lobby in Saint Clairsville Ohio there's a photo of founder Bob Murray with president trump giving two thumbs up and in Murray's big corner office there's a replica of airforce two signed on the wing by vice president Mike pence there's also a constant hissing sound at seventy nine years old Bob Murray suffers from a lung condition that requires him to be on oxygen he says it's not related to his business check for that and it's not as a vendor was working in the coal mines which I did for seventeen years underground every day Murray built his business over decades and now says it's the largest underground coal mining firm in the country he accomplish that by buying other coal companies now a combination of large debts and a declining call market has forced them into bankruptcy my goal is to keep the company that keep it together for my employees as part of Marie's agreement that lenders his nephew Robert Moore will become president and CEO Murray will remain as chairman despite president trump's campaign promise to help the coal business dozens of coal power plants are shut down since he was elected Murray doesn't blame trump for his company's bankruptcy he says the administration has been helpful in rolling back environmental regulations Murray specifically asked for most of them including replacing president Obama's clean power plan and withdrawing from the Paris climate agreement but Murray says the coal industry needs even more help the government should be stepping in keeping coal fired generation in existence it's done nothing Marie once the federal energy regulatory commission or for contest subsidize struggling coal plants he says Cole with its fuel stored on site is more reliable the natural gas that has to be piped in hand renewable energy that only generates when the sun is shining in the wind blows so far regulators in grid operators have not been persuaded wearable crisis resiliency reliability and apart people want to freeze in the dark that is a prediction Marianne hit of the Sierra Club regex frankly this is just a scare tactic for those who want to try to take our country backwards into a twentieth century energy economy it says now the world needs renewable energy that doesn't contribute to climate change she says US power grids are managed by knowledgeable engineers focused on keeping electricity flowing every time a coal plant is proposed for retirement their job is to make sure that as that coal plant retires that our lights will stay on and there will be any threat to the reliability of our electricity coal miners represented by the United mine workers of America that will likely will suffer because of this bankruptcy industry analysts Natalie Biggs with wood mackenzie says Murray was one of the last remaining companies contributing to the union's pension fund you know without Murray energy a lot of the retired coal miners are gonna you know find themselves potential in a difficult situation when it comes to the pensions the union is asking Congress for help meantime US coal consumption has fallen to its lowest level in forty years as more utilities and states commit to energy with lower or no greenhouse gas emissions Jeff Brady NPR news Saint Clairsville Ohio earlier this month to business partners of Rudy Giuliani were arrested on their way out of the country they're accused of violating federal campaign finance laws part of the scheme allegedly involved funneling more than three hundred thousand dollars from a shell company to a super PAC supporting president trump we've been talking with some experts in election law and many of them are surprised not the size of the donation or the attempt to cover up the source of the funds those things are actually pretty common their surprise the love part us and Igor Fuhrman didn't cover their tracks better because there are options for people who want to completely obscure big political donations and here to talk about that is Robert McGuire of citizens for responsibility and ethics in Washington welcome thanks for having me our colleague Jeff Brady talk to left partners before the arrest and here's how he explained the donations this is actually the first couple times that I really started doing some bigger donations because I wanted to get notoriety from my energy company and I thought it might be a great way to you know play with the big boys as you call it now its so called energy company appears to have just been a shell company created weeks before the big donations but if you imagine the parties came to you and said here's what I want to do and I want to hide the money what would you have advised well you know America first action for example the super PAC they gave to house a five oh one C. for social welfare arm the doesn't have to disclose its donors it's run by essentially the same people out of the same address it is nominally a social welfare organization that's supposed to do things that benefit the community but these function essentially as stealth political groups that have the benefit of not disclosing the donor so the easiest way for them to have avoided the situation the now find themselves in is just to have given to that arm of the group there's obviously difference in transparency between the super pac on the one hand in the C. four on the other hand is there also a difference in how these groups can spend that money there is sort of on paper their rules for these groups and how much political activity they can engage in but the rear he is that in practice these groups can act essentially as stealth political committees they can spend millions of dollars to buy tens of thousands of apps for months and months and months out before an election and not report that spending to the Federal Election Commission unless it's thirty days before primary sixty days before general but there's also they can give grants to other politically active five one C. fours and count that as social welfare activity and that creates this turn where you see sort of daisy chains of groups they give grants to each other to offset their political spending so there's sort of a a wealth of options for these groups to make sure that they are maximizing the amount of money they're spending on politics without disclosing any donors so if I'm trying to donate half a million dollars to a campaign in order to buy some influence and curry favor with the candidate but I don't want the public to now is there any way that the candidate can find out because because I want them to know that I'm a big supporter there is right that is actually the key of dark money so we're not talking about no one knowing who is behind the group we're saying the public doesn't know but the candidates know who's funding these groups given that there are these more secretive options available why do you think left harness and eager freemen allegedly gave in a way that was so easy for them to get caught well I think if you listen to the clip it kind of gives some indication of they weren't sophisticated political donors they realize the reality that is if you are a major donor you are buying access to powerful people and indeed there are photos of them with very powerful people ranging from the governor of Florida to the president himself precisely what they didn't know so much as how to cover their tracks and it's unfortunate that there are much more sophisticated political donors that know exactly how to do that and make sure that the public doesn't know who is funding these groups and who is being repaired once these people are in office but it seems that in this case we had two people who it just sort of dove in head first and ran into the reality that there are ways to do this where you don't get in situation where they are now Robert McGuire.
Coming up next
List your show
Cookie Policy | Privacy Policy | Terms of Use

redpajama_set_name: RedPajamaCommonCrawl


Pen collectors who are also interested in antique pencils can find vintage mechanical pencils, bullet pencils and more for sale here!
VINTAGE RITEPOINT MECHANICAL PENCIL ST LOUIS MO.
Vintage Lot of 6pc. Celluloid&early plastics USA. 1 combo pen/pencil.
RARE VINTAGE TURQUOISE EAGLE DRAWING LEADS 4H NEW OLD STOCK 12 LEADS 1 DOZEN!!!!


text:
package zpu

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"strconv"

	"github.com/yahoo/athenz/libs/go/zmssvctoken"
	"github.com/yahoo/athenz/utils/zpe-updater/util"
)

// Default and maximal startup delay values.
const (
	DEFAULT_STARTUP_DELAY = 0
	MAX_STARTUP_DELAY     = 1440
	DEFAULT_EXPIRY_CHECK  = 2880
)

type ZpuConfiguration struct {
	Zts               string
	Zms               string
	DomainList        string
	ZpuOwner          string
	PolicyFileDir     string
	TempPolicyFileDir string
	MetricsDir        string
	ZmsKeysmap        map[string]string
	ZtsKeysmap        map[string]string
	StartUpDelay      int
	ExpiryCheck       int
	LogSize           int
	LogAge            int
	LogBackups        int
	LogCompression    bool
	PrivateKeyFile    string
	CertFile          string
	CaCertFile        string
	Proxy             bool
}

type AthenzConf struct {
	ZtsUrl        string `json:"ztsUrl"`
	ZmsUrl        string `json:"zmsUrl"`
	ZtsPublicKeys []struct {
		Id  string `json:"id"`
		Key string `json:"key"`
	} `json:"ztsPublicKeys"`
	ZmsPublicKeys []struct {
		Id  string `json:"id"`
		Key string `json:"key"`
	} `json:"zmsPublicKeys"`
}

type ZpuConf struct {
	Domains       string `json:"domains"`
	User          string `json:"user"`
	PolicyDir     string `json:"policyDir"`
	TempPolicyDir string `json:"tempPolicyDir"`
	MetricsDir    string `json:"metricsDir"`
	LogMaxSize    int    `json:"logMaxsize"`
	LogMaxAge     int    `json:"logMaxage"`
	LogMaxBackups int    `json:"logMaxbackups"`
	LogCompress   bool   `json:"logCompress"`
	PrivateKey    string `json:"privateKeyFile"`
	CertFile      string `json:"certFile"`
	CaCertFile    string `json:"caCertFile"`
	Proxy         bool   `json:"proxy"`
}

func NewZpuConfiguration(root, athensConfFile, zpuConfFile string) (*ZpuConfiguration, error) {
	zmsKeysmap := make(map[string]string)
	ztsKeysmap := make(map[string]string)
	athenzConf, err := ReadAthenzConf(athensConfFile)
	if err != nil {
		return nil, err
	}
	zpuConf, err := ReadZpuConf(zpuConfFile)
	if err != nil {
		return nil, err
	}

	for _, publicKey := range athenzConf.ZtsPublicKeys {
		if _, exists := ztsKeysmap[publicKey.Id]; exists {
			log.Printf("Zts public Key with id: %v already existed, overwriting it with new value", publicKey.Id)
		}
		key, err := new(zmssvctoken.YBase64).DecodeString(publicKey.Key)
		if err != nil {
			return nil, fmt.Errorf("Unable to decode Zts public Key with id: %v, Error: %v", publicKey.Id, err)
		}
		ztsKeysmap[publicKey.Id] = string(key)
	}

	for _, publicKey := range athenzConf.ZmsPublicKeys {
		if _, exists := zmsKeysmap[publicKey.Id]; exists {
			log.Printf("Zms public Key with id: %v already existed, overwriting it with new value", publicKey.Id)
		}
		key, err := new(zmssvctoken.YBase64).DecodeString(publicKey.Key)
		if err != nil {
			return nil, fmt.Errorf("Unable to decode Zms public Key with id: %v, Error: %v", publicKey.Id, err)
		}
		zmsKeysmap[publicKey.Id] = string(key)
	}

	startupDelay := DEFAULT_STARTUP_DELAY
	startupDelayString := os.Getenv("STARTUP_DELAY")
	if startupDelayString != "" {
		startupDelay, err = strconv.Atoi(startupDelayString)
		if err != nil {
			return nil, fmt.Errorf("Unable to set start up delay, Error: %v", err)
		}
	}
	if startupDelay < 0 {
		startupDelay = DEFAULT_STARTUP_DELAY
	}
	if startupDelay > MAX_STARTUP_DELAY {
		startupDelay = MAX_STARTUP_DELAY
	}
	startupDelay *= 60 // convert from min to secs
	expiryCheck := DEFAULT_EXPIRY_CHECK * 60

	policyDir := zpuConf.PolicyDir
	defaultPolicyDir := fmt.Sprintf("%s/var/zpe", root)
	if policyDir == "" {
		policyDir = defaultPolicyDir
	}

	tempPolicyDir := zpuConf.TempPolicyDir
	defaultTempPolicyDir := fmt.Sprintf("%s/tmp/zpe", root)
	if tempPolicyDir == "" {
		tempPolicyDir = defaultTempPolicyDir
	}

	metricDir := zpuConf.MetricsDir
	defaultMetricDir := fmt.Sprintf("%s/var/zpe_stat", root)
	if metricDir == "" {
		metricDir = defaultMetricDir
	}
	user := zpuConf.User
	if user == "" {
		user = "root"
	}
	return &ZpuConfiguration{
		Zts:               athenzConf.ZtsUrl,
		Zms:               athenzConf.ZmsUrl,
		DomainList:        zpuConf.Domains,
		ZpuOwner:          user,
		PolicyFileDir:     policyDir,
		TempPolicyFileDir: tempPolicyDir,
		MetricsDir:        metricDir,
		ZtsKeysmap:        ztsKeysmap,
		ZmsKeysmap:        zmsKeysmap,
		StartUpDelay:      startupDelay,
		ExpiryCheck:       expiryCheck,
		LogAge:            zpuConf.LogMaxAge,
		LogSize:           zpuConf.LogMaxSize,
		LogBackups:        zpuConf.LogMaxBackups,
		LogCompression:    zpuConf.LogCompress,
		PrivateKeyFile:    zpuConf.PrivateKey,
		CaCertFile:        zpuConf.CaCertFile,
		CertFile:          zpuConf.CertFile,
		Proxy:             zpuConf.Proxy,
	}, nil
}

func ReadAthenzConf(athenzConf string) (*AthenzConf, error) {
	var aConf *AthenzConf
	if !util.Exists(athenzConf) {
		return nil, fmt.Errorf("The Athenz configuration file does not exist at path: %v", athenzConf)
	}

	data, err := ioutil.ReadFile(athenzConf)
	if err != nil {
		return nil, fmt.Errorf("Failed to read the Athenz configuration file, Error:%v", err)
	}
	err = json.Unmarshal(data, &aConf)
	if err != nil {
		return nil, fmt.Errorf("Failed to parse the Athenz configuration file, Error:%v", err)
	}
	return aConf, nil
}

func ReadZpuConf(zpuConf string) (*ZpuConf, error) {
	var zConf *ZpuConf
	if !util.Exists(zpuConf) {
		return nil, fmt.Errorf("The ZPU configuration file does not exist at the given path: %v", zpuConf)
	}

	data, err := ioutil.ReadFile(zpuConf)
	if err != nil {
		return nil, fmt.Errorf("Failed to read the Zpu configuration file, Error:%v", err)
	}
	err = json.Unmarshal(data, &zConf)
	if err != nil {
		return nil, fmt.Errorf("Failed to parse the Zpu configuration file, Error:%v", err)
	}
	return zConf, nil
}

func (config ZpuConfiguration) GetZtsPublicKey(key string) string {
	for k := range config.ZtsKeysmap {
		if k == key {
			return config.ZtsKeysmap[key]
		}
	}
	return ""
}

func (config ZpuConfiguration) GetZmsPublicKey(key string) string {
	for k := range config.ZmsKeysmap {
		if k == key {
			return config.ZmsKeysmap[key]
		}
	}
	return ""
}

redpajama_set_name: RedPajamaGithub


ADHD is a mental health disorder that affects the brain of the person afflicted. According to National Alliance on Mental Illness, research has demonstrated that people with ADHD have lower activity levels in the areas of their brain controlling attention, social judgment and movement. When an ADHD diagnosis is given, it is typed into one of three classifications inattentive, hyperactive-impulsive or combined type.
Having ADHD might lead a person to develop a number of communication problems. A person with ADHD might have problems in relationships because of her inability to remember dates, times, to-do lists and financial agreements. She might display problems at work or in school due to her impulsive behaviors.
Due to the lack of listening skills that generally comes with ADHD, a person may not hear full instructions, she may stop listing before she hears the whole list of what she is asked to accomplish each day, or she may quickly forget assignments or lose important financial paperwork that she was asked to put in a safe place.
Also, people with ADHD may interrupt other people's conversations or thought processes, making it hard for communication to go smoothly. This might disrupt their performance at work or school. A person with ADHD can have problems with boundaries and impulsiveness. This might lead her to ask questions that are too personal in nature or invade another person's space by standing too close, making the communication process uncomfortable for the other person.
To treat the communications problems associated with ADHD, a combination of medication and psychotherapy is commonly used. Medications, such as Ritalin and Adderall, will help a person remain focused and still, notes the Mayo Clinic. This will allow the person to properly listen. Psychotherapy can include social skills training, family therapy, couples therapy or behavioral therapy. These forms of psychotherapy can be focused on the individual's need for enhanced communication skills.
A person with ADHD who has poor relationships and lack of success at work or school due to problems with communication may be at an increased risk for self-harm, suicide and/or harm of others. The lack of ability to effectively communicate may leave a person feeling unheard and frustrated. If a person appears to be at risk for harming themselves or someone else, he may display the following behaviors: aggression, talk of death, joking about harming someone, discussing a plan to harm himself or someone else, having a new improved attitude, hanging out with a new group of friends or giving important things away. If an intent to commit suicide or harm someone else is suspected, the police and mental health professional working with the person should be notified immediately.


text:
Caratteristiche tecniche

Giocatore
Era un difensore centrale.

Carriera

Giocatore
Tra il 1929 ed il 1934 ha giocato nella prima divisione inglese con la maglia del , segnando 2 reti in 11 partite in questa categoria e vincendo la FA Cup 1931-1932. Ha poi trascorso la stagione 1934-1935 al , con cui ha messo a segno 5 reti in 15 presenze nella Second Division 1934-1935. Tra il 1935 ed il 1945 ha militato nel , con cui ha totalizzato complessivamente altre 31 partite nella seconda divisione inglese. Dal 1945 al 1947 ha invece giocato per due anni nel  nella terza divisione inglese, categoria nella quale ha disputato 55 partite.

Allenatore
Ha iniziato ad allenare nel 1949 sempre al Northampton, dove è rimasto fino al 1954, ottenendo come miglior piazzamento nella terza divisione inglese un terzo posto nella stagione 1949-1950, comunque non sufficiente ad ottenere la promozione nella categoria superiore. Nel 1954 sale di categoria, diventando allenatore del , club di seconda divisione, dove rimane fino al 1963: nell'arco di questi nove anni, il miglior piazzamento ottenuto è il quarto posto del campionato 1962-1963, nel quale il Boro arriva a tre punti dal secondo posto che gli avrebbe garantito la promozione in prima divisione; insieme ai due quinti posti in classifica della Second Division 1959-1960 e della Second Division 1960-1961 ed al sesto posto della Second Division 1956-1957 (ma a soli sei punti dalla zona promozione), si tratta dell'unico piazzamento a ridosso della zona promozione: nelle rimanenti stagioni il club ottiene infatti piazzamenti di metà classifica, senza comunque mai venire coinvolto nella lotta per non retrocedere (il peggior piazzamento ottenuto sotto la guida tecnica di Dennison è infatti il quattordicesimo posto in classifica del campionato 1955-1956).

Terminata l'esperienza al Middlesbrough, dal 1963 al 1967 Dennison allena l', club di Southern Football League, all'epoca la massima divisione dilettantistica inglese; in seguito lavora come scout per il , club di cui nel 1972 diventa anche per un breve periodo allenatore ad interim.

Palmarès

Giocatore

Competizioni nazionali

Newcastle: 1931-1932

Collegamenti esterni

Calciatori inglesi
Allenatori di calcio inglesi

redpajama_set_name: RedPajamaWikipedia


Links on the left provide contact information for the elected and duly appointed officials. We appreciate the assistance of Loving County, Texas Sheriff Chris H. Busse in the preparation of this information.
*Texas 143rd District Court is comprised of Loving, Reeves and Ward Counties.


text:
Business rates relief for Scottish newspapers to be extended following fears of 'death knell' for industry
Regulation: Politicians running the world's leading economies are planning to tame Facebook and Google
Craig Newmark interview: Social media's disinformation pandemic is an 'all hands on deck' situation
To his critics, Craig Newmark – the Craig of Craigslist – is one of the tech pioneers who contributed to the financial demise of journalism with the invention of his classified advertising website.
To his supporters, he is the entrepreneur who has shunned serious Silicon Valley wealth to focus his time and money on saving the news industry and fighting disinformation.
Holovaty's EveryBlock launches, promotes geocoding of local news and data
Newmark – a self-confessed over-thinker (when I tell him I live in Vancouver, Canada, he says: "Please watch out for tsunamis!") – admits that, for a while at least, he was concerned about what effect Craigslist might have had on journalism finances.
However, in an email exchange and then via a Zoom interview (highlights below), Newmark reveals his conscience is clear – and not just because Craig Newmark Philanthropies has donated millions to the journalism industry in recent years.
"I'm very concerned about jobs for journalists, and the future of local journalism, and had always guessed that Craigslist might have an effect," he says.
"[But] in the last two or three years, industry analysts have pointed out that when you take a good look, newspaper revenue began to fall after the introduction of television news in the early fifties [he points to Thomas Baekdal's "The Updated (and scary) Circulation and Revenue Figures for Newspapers"].
"They tell me… that if Craigslist had an effect, they can't find it. But, regardless of that, I've chosen to spend lots of resources supporting journalism."
'Trustworthy press is the immune system of democracy'
Although Craigslist still bears his name, Newmark's involvement in the website he founded in 1995 is "pretty minimal" nowadays.
He remained a customer service representative for many years after standing down as chief executive in 2000. But today the 68-year-old has little time for Craigslist in between his "40 hours a week or more" of philanthropic work.
Newmark – a "1950s nerd" who gets his news online and via the radio, rather than in print or on TV – has long had an interest in journalism.
He started investing large amounts in "trustworthy journalism" in 2016 through his foundation, Craig Newmark Philanthropies, which hands out grants to worthy news organisations.
Why start in 2016?
"The trustworthy press is the immune system of democracy," he says. "And even in my naivety, I could see that the immune system was failing pretty badly.
"And instead of limiting or stopping this spread of disinformation, I could see that frequently the press was being gamed into spreading disinformation. And so intuitively I recognised that something was going very badly wrong."
One of the specific issues Newmark identified was the spread of Russian state disinformation. "The Russians are not quite as good as they claim they might be," he says. "But they've been very, very busy in the US and Europe and elsewhere, and they've successfully destabilised governments."
Since 2016, Craig Newmark Philanthropies has awarded grants to ProPublica (whose president, Richard Tofel, was recently interviewed by Press Gazette), City University of New York's graduate journalism school (which is now named after Newmark), PEN America, the Poynter Institute and Wikipedia.
Why does Newmark use his money to donate rather than invest in journalism like fellow tech entrepreneurs Jeff Bezos and Marc Benioff, who own the Washington Post and Time magazine respectively?
"My philanthropic model is to find people who are good at their job, and give power to them, in the form of influence and money," he says. "That's better with respect to news ethics, and, they really don't need me to be a pain in the butt."
And which journalism models does he expect to succeed in the future? "I think we'll see a mix of models, with a diminishing role for advertising. My favourite, personally, is membership and subscription models."
'We do need to work together – much like people worked together in World War Two'
Through his Twitter account, Newmark has recently shared several news and opinion articles that are critical of Facebook's handling of disinformation and misinformation. But he is hesitant to share his own opinions or insights too strongly.
For example, asked for his opinion on how tech companies handled the spread of misinformation on social media in 2020, he says: "Perhaps they could enforce their terms of service better, and better combat disinformation."
Has Mark Zuckerberg done a good job of managing Facebook through disinformation issues?
"I don't really know. And I guess – again, do no harm – I want to focus on things getting better rather than blame. That seems to be working… The only way I get results is by gently nudging and just doing so relentlessly over a long period.
"My horizon when it comes to acting is only 20 or 30 years, because I'm 68. I'm planning for action beyond that timeframe, and I've started planning the Craigbot."
"Mostly a joke. But it does indicate my intention that the actions I'm taking now I'm considering for the next two centuries.
"I'm guessing that at the end of two centuries, we'll either be extinct or post-human, so I don't want to think that far ahead. Because I really can't empathise [with] the needs of a post-human with gills living in the ocean."
Newmark really does appear to be thinking that far ahead.
"I don't want to take any special credit for that," he says. "The literature of my people – you know, the nerds – is science fiction. And contemporary science fiction heavily explores issues relating to media."
Back to the present day, does Newmark think social media companies like Facebook can be trusted to tackle the 'infodemic' plaguing their platforms, or is regulatory action required?
"I'm focusing on this being an all-hands-on-deck situation," he says. "We're in this together. My strength is in working with those people, across the US primarily although somewhat in Europe as well, to work together to move things ahead.
"That includes people at think tanks, universities, individual researchers, and quietly people at the social media companies, to pull together. My instincts tell me that that's the way to make things happen.
"I'll chat with people in government. But my intent is that no matter what people are required to do, it's still… fighting back against those who wish us harm means that we are all in this together. We do need to work together – much like people worked together in World War Two."
Photo credit: Stephanie Canciello, Unali Artists
This article is part of a series running across our sister titles in the Monitor Network and the New Statesman, looking at the backlash against the big tech companies. If you enjoyed this article, you might like:
Digital power: How Big Tech draws its influence (Tech Monitor)
Big Tech lobbying: The US bills tech giants targeted in 2020 (Tech Monitor)
Adam Curtis: "Big Tech and Big Data have been completely useless in this crisis" (New Statesman)
1 thought on "Craig Newmark interview: Social media's disinformation pandemic is an 'all hands on deck' situation"
slitherio says:
We do need to work together.


text:
Iraq's date palms, a fading national symbol
Mohannad Fares
English Environment
Thursday 12 January 202302:00 pm
"بعت أرضي كما لو كنت أغرز سكيناً في قلبي"... نخيل العراق يحتضر
On the coast of the Shatt al-Arab river in Iraq's southernmost province of Basra, Mohammad al-Sudani sits on a wooden bench, looking out on his land. In his hands are the prayer beads he inherited from his father, along with the palm grove that his family has owned for more than 200 years.
"Our land was full of palm trees," he tells Raseef22. "We'd go out from early dawn until the sun sets, in an effort to take care of them, certain we will harvest the fruits of this labor at the time of harvest, and ease our burdens, for the dates will be sold in markets or factories, and the government may even buy them from us and export them abroad. But things changed after 2003, and the lush green trees became empty and barren."
Mohammad had inherited 40 dunams from his father after he died, 30 dunams of which are occupied by palm trees, while the rest were allocated to seasonal fruits and vegetables, but the area his land is in has declined significantly over the past years as a result of drought and the difficulty of providing the necessities to maintain it. It kept declining until the total of his cultivated land became only 5 dunams, two dunams of which are for palm trees, adding to his worries, since there are no markets to buy and no government attention to keep him safe from tomorrow's hunger.
"Our lands were full of palm trees, but things changed after 2003, and the lush green trees became empty and barren"
A blessed tree
Iraq has been known for its date palms since ancient times, and its civilizations glorified and hailed it as a blessed tree, attaching great importance to its cultivation, and making its areas expand, which made it acquire the title of "the land of Sawad" (which means "black land") because its lands were filled with palms and crops. The Iraqi Museum in Baghdad contains evidence of this interest, in a seal dating back to the Akkadian period in 2,730 BC, depicting the painting of two men with a fruitful palm tree standing between them.
The sanctity surrounding the palm tree was also referred to by the "Hammurabi stele", as it included laws regulating how to cultivate it and the means of caring for it, and set a fine of 225 grams of silver for cutting down a single palm tree in Article 58. It also included, in its 65th article, the payment of the rent of an entire orchard if the palm trees are neglected and the production of its dates declines. It is said that the Abbasid caliph, Harun al-Rashid, would always say that all the gold and silver on earth is not worth the price of Basra's palm trees.
Dubbed by many as the national symbol of Iraq, palm trees were mainly cultivated in 13 governorates in the center and south of the country, and previous governments gave it importance due to its impact on the local economy and the gross national product of the state. They had passed several laws to motivate the development and care of this type of agriculture. For example, the dissolved Revolutionary Command Council (RCC) issued a law in 1979 stipulating that the state's agricultural lands be granted to their tenant if he was able to plant them with fifty fruit-bearing trees, including date palms, in one dunam.
Such care has led Iraq to top the list of countries producing dates, and its varieties diversified into more than 600 types, some of which are rare and are now hardly produced. Previous government statistics indicate that from 2000 to 2003, Iraq produced more than 800,000 tons of dates annually, yielded by about 33 million palm trees.
This reality changed after 2003, and the rates of date production decreased in addition to the decline in the areas planted with palm trees. Government statistics indicate that the number of palm trees fell back to 12 million palms, and their production declined to reach about 450,000 tons annually between 2005 and 2009.
Mohammad inherited 40 dunams from his father, with 30 dunams occupied by palm trees and 10 with seasonal crops, but the area declined greatly over the past years due to drought, to become only 5 dunams of cultivated land, two of which are for palm trees
Government negligence
The Iraqi government announced in press statements that palm cultivation increased during the year 2022 to reach 17 million palm trees, and their date production rates exceeded the barrier of 700,000 tons in 2020. However conflicting statements regarding the numbers and percentages of palm production prompted an official source in the Ministry of Agriculture to describe them as "inaccurate". He states, "These statistics contradict the agricultural reality that we are seeing, as well as the periodic reports of the field teams, which confirm the continued decline in cultivated areas in general, and those of palm trees in particular, with this decline reaching a rate of more than 60% relative to its area before 2003."
While speaking to Raseef22, he adds that political reasons stand behind the manipulation of these statistics, including them among other attempts to delude public opinion that the Iraqi economy does not depend on oil revenues only. He bases this opinion of his on the timing of the statements, which were made at the height of the global economic crisis associated with the Covid pandemic in 2020, and the decline in oil prices.
Such government manipulation is not just limited to announced numbers, but also includes great negligence that affected the palm-growing sector in the country. This led to a decline in the percentage of cultivated land due to the state's lack of seriousness in addressing the crisis of weak water imports, which caused a steady increase in land salinity, and a decline in the cultivation of many types of palm trees.
The failure to provide the agricultural sector with research requirements and studies focused on the protection of palm trees is one of the facets of the state's neglect of this aspect, in addition to the deterioration of the rates of financial support for farmers and the owners of agricultural lands, and the imposition of large taxes on fertilizers and pesticides, a measure that led to a significant increase in their prices, and consequently the decline of agriculture and the number of workers in it at the same time. It also led to many selling their lands or converting them into residential lands, right under the watchful gaze of the competent authorities.
The importance of palm trees
Demands to give importance to date palm trees are increasing day by day, and these demands do not stem from a vacuum or the like. The material impact that this tree may have on the country's deteriorating economy prompts focus on these demands.
Iraq currently has about 20 million dunams of land suitable for cultivation, but most of these lands are neglected and need to be reclaimed
Date palm cultivation may provide an important financial return, but the magnitude of this revenue is related to the return of production rates to the 30% threshold, while its current rate does not exceed 6% of the Iraqi national product, according to Sabah al-Saadoun, a researcher specialized in agricultural economics.
In his statement to Raseef22, he points out that Iraq has about 627 varieties of dates, including more than 50 commercial types, which are among the most sought-after and in demand types globally. The country possesses a huge diversity compared to the varieties grown by other date-producing countries in the region. Some of these varieties include Khastawi, Halawi, Zuhdi, and Barhi dates, and some of these species are able to withstand drought, salinity, and frost, in addition to being fast-growing, and therefore can achieve quick and guaranteed economic returns, if properly taken care of.
These benefits are not limited to the financial output that results from selling and exporting them, but also contribute to eliminating unemployment, not only for workers in their field, but as a result of their entry into many local industries such as wood, decorations, and mats, in addition to pressing and packaging them, or their entry into the industries of liquid sugar, molasses, vinegar, or feed.
Environmentally, palm trees have a great agricultural benefit, as these trees are the ideal cover to protect fruit trees from heat in the central and southern regions of the country, in addition to their role in fertilizing and stabilizing the soil, thus deterring the desertification crisis and repelling the dust storms that have recently increased.
Solutions to negligence
Iraq currently has about 20 million dunams of land suitable for cultivation, but most of these lands are neglected and need to be reclaimed, and therefore solutions are still possible at the moment.
The first step in the solution lies in the return of government support to the agricultural sector, according to al-Saadoun, starting with reducing the prices of fertilizers and pesticides, and issuing soft loans based on a plan and conditions depending on the commitment of farmers to invest and care for their land.
The benefits of palm cultivation are not limited to financial output, but also contribute to eliminating unemployment, not only for workers, but as a result of its entry into local industries such as wood, decorations, liquid sugar, molasses, and vinegar
The application of modern irrigation methods is also one of the most prominent solutions currently offered, given the continuous decline in water levels in the country, and therefore the adoption of tissue culture methods and drip irrigation are two of the most successful methods in such circumstances, but all this needs studies and research that Iraq currently lacks.
"All these solutions have already been proposed through agricultural associations, but government officials have ignored them, sowing despair instead of palm trees," says Omar Khaled, a palm tree farmer in Kirkuk Governorate.
Khaled confirms to Raseef22 that he had previously hired a lawyer to convert the 70-dunam land he owns with his brothers in order to sell it as residential land. He says this move is like sticking a knife in his heart, "This move was not a choice, it was a challenge, in this land, between life or death, from starvation."
No one denies the existence of governmental attempts to reclaim the palm-growing sector, but the contradictions of these continuous attempts make it difficult to convince farmers to hold on to their land, or discourage them from abandoning it. For now, in Iraq, a land once known as the "country of 30 million palm trees", it is clear that the future of palm trees is far from promising, as is the case for the future of the entire country.
Artificial rain in Iraq: Impact on human life and biodiversity
Tunisians deprived of right to water drink from snake infested waters
Diyala faces drought alone... A weak Iraq at the mercy of Iran
Raseef22's holistic approach to tackle issues that matter ensures a continued, wide and diverse coverage of topics related to local, regional, and international environments. Its time to aid our environment.. so take the lead!
At a time when the environment is undergoing rapid and unprecedented change, we aim to challenge and address the conflicts and consequences of these changes. We want to raise awareness where and when we can. Its time for you to participate and take action!
Farmers Agriculture Palm Trees Drought Dates Crops


text:
« Xbox One game box design revealed
PS4 "Coming 2013" to Europe according to ad campaign »
Deadly Premonition: The Director's Cut review for PS3
PS3, Reviews
by Brian Peterson
Publisher: Rising Star Games
Developer: Access Games
Medium: Blu-ray Disc
Online: No
ESRB: M
Back in the days of the Sega Dreamcast, Shenmue was the be-all, end-all of open world games, and one team of developers wanted to one up this saga but in the survival horror genre. The unfortunate demise of the Dreamcast not only denied the world of Shenmue 3, but its competition that was to be named Deadly Premonition. Leave it to the spiritual successor, Microsoft's Xbox 360, to dust off this relic and bring the survival horror/"Shenmue Killer" to gamers nearly a decade later in 2010. While the game was initially bashed for not really propelling itself above Dreamcast visuals and game play, the game did find itself a nice cult following (this editor included) with its Twin Peaks like storytelling and massive open world not yet seen in a survival horror title before or since.
Fast forward to 2013 and the game finds life yet again like some kind of Lost Ark/Frankenstein monster that won't die even in the face of god awful reviews. So with Deadly Premonition: The Director's Cut the developers moved onto the PS3 and included a few new extras such as cut scenes, game play tweaks, and even move controls. This aptly named Deadly Premonition: The Director's Cut doesn't do enough to really turn heads of any haters out there who couldn't grasp it the first time around, but for those who enjoyed it will find improvements that will make a second play through more enjoyable.
The tale of Agent York and the town of Greenvale are still intact, and in this version there is even more of the story to see. While it is all in the form of story scenes of the game rather than additional levels, it all ends up like watching an extended version of the game. What remains is the same and strange murder that has happened in Greenvale by the Raincoat Killer, Agent York and his voice in his head Zach, the huge area of exploration, the odd and unique cast of characters, and of course the offbeat music and poorly delivered voice acting that would make any B movie fan smile.
A couple of improvements are found in the game's visuals for one. The textures have improved slightly as it has been given a 720p upscale, but to all good things seems to come the bad as the frame rate takes a hit. Now the game stutters more so than it did in the lower resolution version previously on the 360, which for this reviewer, is a worse experience as it's not like the upscaling made the game look next gen or anything anyway.
Controls have also received a welcome improvement, now gone are the stiff and tank like controls of Agent York during fight sequences and are more forgiving and accurate, which is a good thing as you do fend off enemies a ton in this game. Another notable is that the game no longer has a difficulty setting and the game feels as if it is being played on what was the easy setting on the 360 version. This, however, is a good thing as the game had an unforgiving difficulty on harder settings and due to its length of over 20 hours benefits from this more enjoyable game play setting. The game does support PS Move controls, but they are forgettable as you will still find the game more appealing using the standard controls.
Overall while Deadly Premonition: The Director's Cut may be the definitive version of everyone's game they love to hate, it is not improved by leaps and bounds to the point of the 20 dollar hike in price over the Xbox 360 version. The visuals, while better, make the game suffer from slowdown and still look extremely dated. The controls, while also improved are not so improved to the point of changing the minds of gamers who were turned away the first time around. The extras are, in my opinion, the biggest disappointment as they are just a few extra glimpses into the story, but without extra missions or length to the game play it just feels like deleted scenes that were added in for this version.
I still stand by my score as this is a game that is an experience, even if odd and insane at points, but that is also what makes this game so memorable. The game is grim, gruesome, and if you can get by the fact the game is now over a decade old, it is quite engaging. One thing is for sure, if this is your first time meeting Agent York, this is the version to play for sure. If you have already seen this once sleepy town of Greendale, there may be enough time that has gone by that you won't be disappointed see it all over again. I know I enjoyed my 2nd play though, as it still shocks and awes me even now.
Deadly Premonition: The Director's Cut – Playstation 3 (Video Game)
Manufacturer: Aksys
ESRB Rating:
Tags: access games, deadly premonition, rising star games
Roundout by POWGI review for Nintendo Switch, PS4,…
More words than you can shake a dictionary at...
Cloudbase Prime review for Nintendo Switch
Cloudbase Prime has some interesting pieces, but the whole is a little lacking...
Even the Ocean review for PS4, Xbox One, Switch
The visual novel-platformer hybrid you probably never knew you needed...
Space Invaders Forever review for PS4, Xbox One, S…
The Invaders have returned, but should they have returned at all?..
Balan Wonderworld demo launching on January 28th
Batterystaple Games revisits Steam Early Access wi…
Nintendo eShop Update – Scott Pilgrim vs. Th…
New Pokémon Snap hits the Nintendo Switch on April…
Game Release Schedule
Hitman 3 (Multi)
Previews (3,680)
PC (1,474)
PS Vita (266)
PSN (187)
PSVR (24)
Wii U (380)
XBLA (113)
Xbox One (1,719)
Screenshots (1,764)
Videos and Trailers (2,495)
Update Archives
Update Archives Select Month January 2021 (22) December 2020 (60) November 2020 (58) October 2020 (75) September 2020 (65) August 2020 (61) July 2020 (63) June 2020 (52) May 2020 (47) April 2020 (54) March 2020 (67) February 2020 (56) January 2020 (45) December 2019 (47) November 2019 (49) October 2019 (87) September 2019 (73) August 2019 (74) July 2019 (57) June 2019 (60) May 2019 (61) April 2019 (61) March 2019 (65) February 2019 (46) January 2019 (63) December 2018 (55) November 2018 (63) October 2018 (80) September 2018 (76) August 2018 (86) July 2018 (74) June 2018 (87) May 2018 (73) April 2018 (57) March 2018 (64) February 2018 (60) January 2018 (62) December 2017 (72) November 2017 (69) October 2017 (91) September 2017 (71) August 2017 (94) July 2017 (77) June 2017 (89) May 2017 (84) April 2017 (79) March 2017 (70) February 2017 (59) January 2017 (74) December 2016 (77) November 2016 (79) October 2016 (86) September 2016 (88) August 2016 (93) July 2016 (73) June 2016 (93) May 2016 (79) April 2016 (85) March 2016 (84) February 2016 (76) January 2016 (82) December 2015 (84) November 2015 (83) October 2015 (115) September 2015 (113) August 2015 (117) July 2015 (83) June 2015 (132) May 2015 (81) April 2015 (77) March 2015 (99) February 2015 (73) January 2015 (72) December 2014 (82) November 2014 (70) October 2014 (109) September 2014 (106) August 2014 (92) July 2014 (88) June 2014 (99) May 2014 (105) April 2014 (114) March 2014 (105) February 2014 (101) January 2014 (82) December 2013 (101) November 2013 (113) October 2013 (119) September 2013 (114) August 2013 (154) July 2013 (129) June 2013 (151) May 2013 (117) April 2013 (113) March 2013 (95) February 2013 (119) January 2013 (111) December 2012 (95) November 2012 (101) October 2012 (131) September 2012 (118) August 2012 (156) July 2012 (117) June 2012 (122) May 2012 (114) April 2012 (115) March 2012 (159) February 2012 (179) January 2012 (138) December 2011 (141) November 2011 (11)
© 2021 Gaming Age.


Photos and review of Popeyes Chicken and Biscuits restaurant located in Waldo Florida.
Kinda of a KFC alternative. Just not as good. Chicken LOOKS good, just doesnt have the same good tasts as KFC. This Popeyes is located in Waldo Florida, but they are all over the place. OK to try once, but you'll probably like KFC better.


Concrete Equipment is our specialty at GLES Global - Global Supplier of new, used, and reconditioned concrete products equipment and replacement parts.
Parts & Service - London Machinery Inc.
Home; Parts & Service ... London offers a complete line of OEM quality parts and service reps to keep your vehicles or plants in top ... Concrete Mixers.
Concrete Mixer Spare Parts, Wholesale Various High Quality Concrete Mixer ... concrete batching plant equipment machine mixer casting spare wear parts.
Jan 14, 2016 ... We are your source for concrete batching plant parts (slump check, reclaimers, ... Batching Plant Equipment Quote · Batching Plant Parts.
Not all parts and accessories are created equal. offers longer lasting, better performing parts and accessories under increased wear conditions.
Products 1 - 800 ... Concrete Trowel Machine Replacement Parts. ... Honda engines to replace engines on various concrete trowel machines. Quickview.


text:
William Freeman Gilbreth (September 3, 1947 – July 12, 2020) was an American professional baseball player who played three seasons for the Detroit Tigers and California Angels of Major League Baseball. He died on July 12, 2020, from complications of heart surgery.

References

External links

1947 births
2020 deaths
Major League Baseball pitchers
Abilene Christian Wildcats baseball coaches
Abilene Christian Wildcats baseball players
Detroit Tigers players
California Angels players
Baseball players from Texas
Sportspeople from Abilene, Texas
Montgomery Rebels players
Rocky Mount Leafs players
Salt Lake City Angels players
Toledo Mud Hens players


text:
How Working With OVO and Letting Loose Led To James Vincent McMorrow's Best Record Yet
ByGraham
Image via Sarah Doyle
In the past, James Vincent McMorrow preferred control. And for good reason—the Irish songwriter's signature brand of falsetto and meticulous arrangements have earned him critical accolades and a devoted following in recent years. But this time, it's different. McMorrow wanted to transform, claiming that while making his past records, "I've walked to the edge of where I've wanted to be, I've gotten scared, and I've walked back to a safe distance."
2014's Post Tropical was the first metamorphosis: it was during that album cycle that he decided to stop drinking alcohol, giving up a crutch that had helped the introvert cross the globe on tour. The music itself was a nimble pivot away from the indie-folk roots that had defined his sound up to that point—Post Tropical wades into deep water, and contains songs that are almost overwhelming in their emotional depth, from the album opener "Cavalier" to the heart-stopping "Red Dust."
Now comes time for McMorrow's third act, and he has metamorphosed once again, thanks in no small part to four months in L.A. and the production team of Ninenteen85 (of dvsn & OVO), Two Inch Punch, and Frank Dukes.
ListsPigeons And Planesjames vincent mcmorrow


See Krakow through the eyes of a local and discover the city's hidden secrets on this fascinating sightseeing tour. Over the course of three hours the tour covers the highlights of the city and visits the most important monuments and sights. The Old Town and the Jewish District are both included but in addition to that is an entrance to the beautiful St. Mary's Church and the Cathedral at the Wawel Hill.
Do not miss this opportunity to discover Krakow in an entertaining and exciting way!
The meeting point is in front of our office, Cracow City Tours, on Matejki Square number 2.
-If you're a student the price is 23 euros.


All prices include GST and are per person. Booking fees apply.
Day registrations will be accepted for either Thursday or Friday of the conference. This charge does not include evening functions however these may be purchased at the nominated rates.
Pre-dinner drinks will be from 6.30pm. Dinner will be served from 7.30pm and will include a two course dinner, standard drinks package, entertainment from Adrian Richardson and an auction to raise money for the Angus Foundation.
A full refund, will be made on any cancellations received by Monday 10 May 2019. No refunds will be issued for any registration cancellations made after May 10, although substitutions of delegates will be accepted. All cancellations must be made in writing to the conference coordinator.


text:
https://gizmodo.com/tsa-is-testing-face-recognition-at-airport-security-che-1837675720?utm_campaign=socialflow_gizmodo_twitter&utm_medium=socialflow&utm_source=gizmodo_twitter
https://www.zdnet.com/article/windows-10-privacy-microsoft-faces-new-probe-over-how-it-uses-your-data/?ftag=COS-05-10aaa0g&utm_campaign=trueAnthem%3A+Trending+Content&utm_content=5d67040b7ebf6f00017ace1a&utm_medium=trueAnthem&utm_source=twitter
https://www.washingtonpost.com/technology/2019/08/28/doorbell-camera-firm-ring-has-partnered-with-police-forces-extending-surveillance-reach/?noredirect=on
Dangerous Cryptomining Worm Racks Up 850K Infections, Self-Destructs
https://www.zdnet.com/article/microsoft-using-multi-factor-authentication-blocks-99-9-of-account-hacks/?ftag=COS-05-10aaa0g&utm_campaign=trueAnthem%3A+Trending+Content&utm_content=5d65653057819f0001696043&utm_medium=trueAnthem&utm_source=twitter
https://thehackernews.com/2019/08/imperva-waf-breach.html
https://thehackernews.com/2019/08/android-camscanner-malware.html
The Privacy Security & OSINT Show Podcast for privacy
https://cointelegraph.com/news/bittorrent-to-begin-alpha-testing-blockchain-based-streaming-platform
http://ericenglish.com/wp-content/uploads/2019/08/Episode-84.mp3
https://www.darkreading.com/risk/7-big-factors-putting-small-businesses-at-risk/d/d-id/1335581
https://www.zdnet.com/article/hackers-mount-attacks-on-webmin-servers-pulse-secure-and-fortinet-vpns/?ftag=COS-05-10aaa0g&utm_campaign=trueAnthem%3A+Trending+Content&utm_content=5d642c5457819f0001694d82&utm_medium=trueAnthem&utm_source=twitter
Rockville Center School District pays $88,000 ransom
https://www.zdnet.com/article/hostinger-resets-customer-passwords-after-security-incident/?ftag=COS-05-10aaa0g&utm_campaign=trueAnthem%3A+Trending+Content&utm_content=5d643de457819f0001694e98&utm_medium=trueAnthem&utm_source=twitter
https://gizmodo.com/time-ai-crypto-company-sues-black-hat-after-people-laug-1837580433?rev=1566846102834&utm_medium=socialflow&utm_campaign=socialflow_gizmodo_twitter&utm_source=gizmodo_twitter
https://www.engadget.com/2019/08/26/apple-ios-update-fixes-jailbreak-bug/
Is BlackHat and Defcon good for security?
https://www.coindesk.com/roger-ver-backed-coinflex-exchange-is-taking-aim-at-bitmex-futures-market?utm_source=twitter&utm_medium=coindesk&utm_term=&utm_content=&utm_campaign=Organic%20
Weekly Bitcoin Price Indicator Shows 'Bear Cross' in First Since February
Cybersecurity:
https://www.bleepingcomputer.com/news/security/microsoft-patches-vulnerable-android-remote-desktop-app/
https://thehackernews.com/2019/08/clear-off-facebook-activity.html
https://www.bbc.com/news/technology-49410371?ocid=socialflow_twitter
https://thehackernews.com/2019/08/webmin-vulnerability-hacking.html
https://thehackernews.com/2019/08/ios-iphone-jailbreak.html
Coordinated Ransomware Attack Hits 23 Texas Government Agencies
Cryptocurrency:
Ethereum Istanbul hard fork, 6 new changes approved
https://www.coindesk.com/bitmex-exchanges-to-block-users-in-hong-kong-bermuda-and-seychelles?utm_source=twitter&utm_medium=coindesk&utm_term=&utm_content=&utm_campaign=Organic%20
Crypto Exchange Coinbase Acquires Xapo's Institutional Custody Business
More than a million people have their biometric data exposed in massive security breach
Lenovo Warns of ThinkPad Bugs, One Unpatched
https://www.theverge.com/2019/8/14/20805801/microsoft-privacy-policy-change-humans-listen-skype-cortana-voice-recording
Fingerprints of 1M Exposed in Public Biometrics Database
https://www.zdnet.com/article/capital-one-hacker-took-data-from-more-than-30-companies-new-court-docs-reveal/
https://www.zdnet.com/article/microsoft-warns-of-two-new-wormable-flaws-in-windows-remote-desktop-services/?ftag=COS-05-10aaa0g&utm_campaign=trueAnthem%3A+Trending+Content&utm_content=5d54140ba341320001ab0232&utm_medium=trueAnthem&utm_source=twitter
https://www.zdnet.com/video/north-korea-reportedly-stole-2b-in-wave-of-cyber-attacks/
https://www.zdnet.com/article/facebook-is-the-latest-tech-giant-to-admit-human-staff-listen-in-on-your-conversations/?ftag=COS-05-10aaa0g&utm_campaign=trueAnthem%3A+Trending+Content&utm_content=5d54339fa341320001ab0423&utm_medium=trueAnthem&utm_source=twitter
Credit Karma glitch exposed users to other people's accounts
Facebook Records User Audio, Sparking Privacy Questions
700,000 Choice Hotels customer records compromised
New Malware Miner Sneakily Hides When Task Manager Is Open
https://www.coindesk.com/samsung-at-last-adds-bitcoin-functionality-to-its-blockchain-phones?utm_source=twitter&utm_medium=coindesk&utm_term=&utm_content=&utm_campaign=Organic%20
http://ericenglish.com/wp-content/uploads/2019/10/Episode-81-1.mp3
https://www.zdnet.com/article/at-t-employees-took-bribes-to-plant-malware-on-the-companys-network/?ftag=COS-05-10aaa0g&utm_campaign=trueAnthem%3A+Trending+Content&utm_content=5d4a506dffeb9a00013ba774&utm_medium=trueAnthem&utm_source=twitter
Mass Spoofing Campaign Abuses Walmart Brand
Millions of Android Smartphones Vulnerable to Trio of Qualcomm Bugs
Apple Suspends Siri Program After Privacy Backlash
https://thehackernews.com/2019/08/hack-wpa3-wifi-password.html
https://www.techradar.com/news/vpn-vs-cloudflare-dns-which-is-best-for-privacy
Binance Customer Data Has Leaked: What We Know and What We Don't
Mastercard Is Building a Team to Develop Crypto, Wallet Projects