
def     UpperCAmelCase__							(       __magic_name__						:     int = 99_80_01  ):


					'''simple docstring'''

					for number in range(n - 1							,  99_99							,  -1  ):
										lowerCAmelCase		:					str  	=     str(__magic_name__  )

										# checks whether 'str_number' is a palindrome.
										if str_number == str_number[::-1]:
															lowerCAmelCase		:					List[Any]  	=     9_99

															# if 'number' is a product of two 3-digit numbers
															# then number is the answer otherwise fetch next number.
															while divisor != 99:
																				if (number % divisor == 0) and (len(str(number // divisor  )  ) == 3.0):
																									return number
																				divisor -= 1
					raise ValueError('''That number is larger than our acceptable range.'''  )


if __name__ == "__main__":
		print(f"""{solution() = }""")


import gc
import random
import unittest

import numpy as np
import torch
from PIL import Image
from transformers import CLIPImageProcessor, CLIPVisionConfig

from diffusers import AutoencoderKL, PaintByExamplePipeline, PNDMScheduler, UNetaDConditionModel
from diffusers.pipelines.paint_by_example import PaintByExampleImageEncoder
from diffusers.utils import floats_tensor, load_image, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu

from ..pipeline_params import IMAGE_GUIDED_IMAGE_INPAINTING_BATCH_PARAMS, IMAGE_GUIDED_IMAGE_INPAINTING_PARAMS
from ..test_pipelines_common import PipelineTesterMixin


enable_full_determinism()


class 		__magic_name__   (						snake_case,				unittest.TestCase    ):
		_lowerCAmelCase		=	PaintByExamplePipeline
		_lowerCAmelCase		=	IMAGE_GUIDED_IMAGE_INPAINTING_PARAMS
		_lowerCAmelCase		=	IMAGE_GUIDED_IMAGE_INPAINTING_BATCH_PARAMS
		_lowerCAmelCase		=	frozenset([]    )  # TO_DO: update the image_prams once refactored VaeImageProcessor.preprocess





		def       _A							(							self    :	Dict				):
							torch.manual_seed(0				)
							lowerCAmelCase		:					Optional[int]  	=     UNetaDConditionModel(
							    block_out_channels=(3_2, 6_4)						,  layers_per_block=2						,  sample_size=3_2						,  in_channels=9						,  out_channels=4						,  down_block_types=('''DownBlock2D''', '''CrossAttnDownBlock2D''')						,  up_block_types=('''CrossAttnUpBlock2D''', '''UpBlock2D''')						,  cross_attention_dim=3_2						,  )
							lowerCAmelCase		:					List[str]  	=     PNDMScheduler(skip_prk_steps=lowerCamelCase__				)
							torch.manual_seed(0				)
							lowerCAmelCase		:					List[str]  	=     AutoencoderKL(
							    block_out_channels=[3_2, 6_4]						,  in_channels=3						,  out_channels=3						,  down_block_types=['''DownEncoderBlock2D''', '''DownEncoderBlock2D''']						,  up_block_types=['''UpDecoderBlock2D''', '''UpDecoderBlock2D''']						,  latent_channels=4						,  )
							torch.manual_seed(0				)
							lowerCAmelCase		:					Union[str, Any]  	=     CLIPVisionConfig(
							    hidden_size=3_2						,  projection_dim=3_2						,  intermediate_size=3_7						,  layer_norm_eps=1E-05						,  num_attention_heads=4						,  num_hidden_layers=5						,  image_size=3_2						,  patch_size=4						,  )
							lowerCAmelCase		:					List[Any]  	=     PaintByExampleImageEncoder(lowerCamelCase__						,  proj_size=3_2				)
							lowerCAmelCase		:					Union[str, Any]  	=     CLIPImageProcessor(crop_size=3_2						,  size=3_2				)

							lowerCAmelCase		:					str  	=     {
							    '''unet''': unet,
							    '''scheduler''': scheduler,
							    '''vae''': vae,
							    '''image_encoder''': image_encoder,
							    '''safety_checker''': None,
							    '''feature_extractor''': feature_extractor,
							}
							return components





		def       _A							(							self    :	str						,  lowerCamelCase__    :	List[Any]				):
							lowerCAmelCase		:					List[Any]  	=     np.array(image.convert('''RGB'''				)				)
							lowerCAmelCase		:					int  	=     image[None].transpose(0						,  3						,  1						,  2				)
							lowerCAmelCase		:					Any  	=     torch.from_numpy(lowerCamelCase__				).to(dtype=torch.floataa				) / 1_2_7.5 - 1.0
							return image





		def       _A							(							self    :	str						,  lowerCamelCase__    :	Union[str, Any]="cpu"						,  lowerCamelCase__    :	Any=0				):
							# TODO: use tensor inputs instead of PIL, this is here just to leave the old expected_slices untouched
							lowerCAmelCase		:					str  	=     floats_tensor((1, 3, 3_2, 3_2)						,  rng=random.Random(lowerCamelCase__				)				).to(lowerCamelCase__				)
							lowerCAmelCase		:					Any  	=     image.cpu().permute(0						,  2						,  3						,  1				)[0]
							lowerCAmelCase		:					Dict  	=     Image.fromarray(np.uinta(lowerCamelCase__				)				).convert('''RGB'''				).resize((6_4, 6_4)				)
							lowerCAmelCase		:					str  	=     Image.fromarray(np.uinta(image + 4				)				).convert('''RGB'''				).resize((6_4, 6_4)				)
							lowerCAmelCase		:					Optional[int]  	=     Image.fromarray(np.uinta(lowerCamelCase__				)				).convert('''RGB'''				).resize((3_2, 3_2)				)

							if str(lowerCamelCase__				).startswith('''mps'''				):
												lowerCAmelCase		:					Dict  	=     torch.manual_seed(lowerCamelCase__				)
							else:
												lowerCAmelCase		:					str  	=     torch.Generator(device=lowerCamelCase__				).manual_seed(lowerCamelCase__				)
							lowerCAmelCase		:					Union[str, Any]  	=     {
							    '''example_image''': example_image,
							    '''image''': init_image,
							    '''mask_image''': mask_image,
							    '''generator''': generator,
							    '''num_inference_steps''': 2,
							    '''guidance_scale''': 6.0,
							    '''output_type''': '''numpy''',
							}
							return inputs





		def       _A							(							self    :	List[Any]				):
							lowerCAmelCase		:					Tuple  	=     self.get_dummy_components()

							# make sure here that pndm scheduler skips prk
							lowerCAmelCase		:					Union[str, Any]  	=     PaintByExamplePipeline(**lowerCamelCase__				)
							lowerCAmelCase		:					List[Any]  	=     pipe.to('''cpu'''				)
							pipe.set_progress_bar_config(disable=lowerCamelCase__				)

							lowerCAmelCase		:					Tuple  	=     self.get_dummy_inputs()
							lowerCAmelCase		:					List[str]  	=     pipe(**lowerCamelCase__				)
							lowerCAmelCase		:					Optional[Any]  	=     output.images

							lowerCAmelCase		:					Optional[int]  	=     image[0, -3:, -3:, -1]

							assert image.shape == (1, 6_4, 6_4, 3)
							lowerCAmelCase		:					List[Any]  	=     np.array([0.4_6_8_6, 0.5_6_8_7, 0.4_0_0_7, 0.5_2_1_8, 0.5_7_4_1, 0.4_4_8_2, 0.4_9_4_0, 0.4_6_2_9, 0.4_5_0_3]				)

							assert np.abs(image_slice.flatten() - expected_slice				).max() < 1E-2





		def       _A							(							self    :	List[str]				):
							lowerCAmelCase		:					List[str]  	=     '''cpu'''
							lowerCAmelCase		:					Union[str, Any]  	=     self.get_dummy_inputs()
							inputs.pop('''mask_image'''				)
							lowerCAmelCase		:					Union[str, Any]  	=     self.convert_to_pt(inputs.pop('''image'''				)				)
							lowerCAmelCase		:					Dict  	=     image.clamp(0						,  1				) / 2

							# make sure here that pndm scheduler skips prk
							lowerCAmelCase		:					str  	=     PaintByExamplePipeline(**self.get_dummy_components()				)
							lowerCAmelCase		:					Tuple  	=     pipe.to(lowerCamelCase__				)
							pipe.set_progress_bar_config(disable=lowerCamelCase__				)

							lowerCAmelCase		:					Optional[int]  	=     pipe(image=lowerCamelCase__						,  mask_image=mask_image[:, 0]						,  **lowerCamelCase__				)
							lowerCAmelCase		:					Optional[int]  	=     output.images

							lowerCAmelCase		:					int  	=     image.cpu().permute(0						,  2						,  3						,  1				)[0]
							lowerCAmelCase		:					int  	=     mask_image.cpu().permute(0						,  2						,  3						,  1				)[0]

							lowerCAmelCase		:					List[str]  	=     Image.fromarray(np.uinta(lowerCamelCase__				)				).convert('''RGB'''				)
							lowerCAmelCase		:					str  	=     Image.fromarray(np.uinta(lowerCamelCase__				)				).convert('''RGB'''				)

							lowerCAmelCase		:					List[Any]  	=     pipe(**self.get_dummy_inputs()				)
							lowerCAmelCase		:					Any  	=     output.images

							assert out_a.shape == (1, 6_4, 6_4, 3)
							assert np.abs(out_a.flatten() - out_a.flatten()				).max() < 5E-2





		def       _A							(							self    :	Optional[Any]				):
							super().test_inference_batch_single_identical(expected_max_diff=3E-3				)



@slow
@require_torch_gpu
class 		__magic_name__   (						unittest.TestCase    ):





		def       _A							(							self    :	Tuple				):
							# clean up the VRAM after each test
							super().tearDown()
							gc.collect()
							torch.cuda.empty_cache()





		def       _A							(							self    :	Optional[int]				):
							# make sure here that pndm scheduler skips prk
							lowerCAmelCase		:					Union[str, Any]  	=     load_image(
							    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
							    '''/paint_by_example/dog_in_bucket.png'''				)
							lowerCAmelCase		:					Any  	=     load_image(
							    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
							    '''/paint_by_example/mask.png'''				)
							lowerCAmelCase		:					Any  	=     load_image(
							    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
							    '''/paint_by_example/panda.jpg'''				)

							lowerCAmelCase		:					Union[str, Any]  	=     PaintByExamplePipeline.from_pretrained('''Fantasy-Studio/Paint-by-Example'''				)
							lowerCAmelCase		:					str  	=     pipe.to(lowerCamelCase__				)
							pipe.set_progress_bar_config(disable=lowerCamelCase__				)

							lowerCAmelCase		:					int  	=     torch.manual_seed(3_2_1				)
							lowerCAmelCase		:					List[str]  	=     pipe(
							    image=lowerCamelCase__						,  mask_image=lowerCamelCase__						,  example_image=lowerCamelCase__						,  generator=lowerCamelCase__						,  guidance_scale=5.0						,  num_inference_steps=5_0						,  output_type='''np'''						,  )

							lowerCAmelCase		:					Any  	=     output.images

							lowerCAmelCase		:					Tuple  	=     image[0, -3:, -3:, -1]

							assert image.shape == (1, 5_1_2, 5_1_2, 3)
							lowerCAmelCase		:					Dict  	=     np.array([0.4_8_3_4, 0.4_8_1_1, 0.4_8_7_4, 0.5_1_2_2, 0.5_0_8_1, 0.5_1_4_4, 0.5_2_9_1, 0.5_2_9_0, 0.5_3_7_4]				)

							assert np.abs(image_slice.flatten() - expected_slice				).max() < 1E-2
