def_create_default_read_strategies(self):""" This function is used to populate `self.read_strategies` if by set-state time none have been provided It uses state options to pick defaults. """self.read_strategies=[concretization_strategies.SimConcretizationStrategyUnlimitedRange(self._read_targets_limit)]def_create_default_write_strategies(self):""" This function is used to populate `self.write_strategies` if by set-state time none have been provided. It uses state options to pick defaults. """self.write_strategies=[concretization_strategies.SimConcretizationStrategyUnlimitedRange(self._write_targets_limit)]@staticmethoddef_merge_strategies(*strategy_lists):""" Utility function for merging. Does the merge operation on lists of strategies """iflen({len(sl)forslinstrategy_lists})!=1:raiseSimMergeError("unable to merge memories with amounts of strategies")merged_strategies=[]forstrategiesinzip(*strategy_lists):iflen({s.__class__forsinstrategies})!=1:raiseSimMergeError("unable to merge memories with different types of strategies")unique=list(set(strategies))iflen(unique)>1:unique[0].merge(unique[1:])merged_strategies.append(unique[0])returnmerged_strategiesdef_apply_concretization_strategies(self,addr,strategies):""" Applies concretization strategies on the address until one of them succeeds. """forsinstrategies:a=s.concretize(self,addr)# return the result if not None!ifaisnotNone:returna# well, we triedraiseSimMemoryAddressError("Unable to concretize address with the provided strategies.")def_concretize_address_descriptor(self,desc:AbstractAddressDescriptor,original_addr:claripy.ast.Bits,is_write:bool=False,target_region:Optional[str]=None,)->Generator[AddressWrapper,None,None]:strategies=self.write_strategiesifis_writeelseself.read_strategiestargets_limit=self._write_targets_limitifis_writeelseself._read_targets_limitforregion,addr_siindesc:concrete_addrs=self._apply_concretization_strategies(addr_si,strategies)iflen(concrete_addrs)==targets_limitandHYBRID_SOLVERinself.state.options:exact=TrueifAPPROXIMATE_FIRSTnotinself.state.optionselseNonesolutions=self.state.solver.eval_upto(original_addr,targets_limit,exact=exact)iflen(solutions)<len(concrete_addrs):concrete_addrs=[addr_si.intersection(s).eval(1)[0]forsinsolutions]forcinconcrete_addrs:yieldself._normalize_address_core(region,c,target_region=target_region)def_normalize_address_core(self,region_id:str,relative_address:int,target_region:Optional[str]=None)->AddressWrapper:returnsuper()._normalize_address_core(region_id,relative_address,target_region)