#version 310 es
precision mediump float;

struct tint_padded_array_element {
  float el;
};
struct LeftOver {
  mat4 worldViewProjection;
  float time;
  mat4 test2[2];
  tint_padded_array_element test[4];
};

vec3 position = vec3(0.0f, 0.0f, 0.0f);
layout(binding = 2) uniform LeftOver_1 {
  mat4 worldViewProjection;
  float time;
  mat4 test2[2];
  tint_padded_array_element test[4];
} x_14;
vec2 vUV = vec2(0.0f, 0.0f);
vec2 uv = vec2(0.0f, 0.0f);
vec3 normal = vec3(0.0f, 0.0f, 0.0f);
vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);

void main_1() {
  vec4 q = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  vec3 p = vec3(0.0f, 0.0f, 0.0f);
  vec3 x_13 = position;
  q = vec4(x_13.x, x_13.y, x_13.z, 1.0f);
  vec4 x_21 = q;
  p = vec3(x_21.x, x_21.y, x_21.z);
  float x_27 = p.x;
  float x_41 = x_14.test[0].el;
  float x_45 = position.y;
  float x_49 = x_14.time;
  p.x = (x_27 + sin(((x_41 * x_45) + x_49)));
  float x_55 = p.y;
  float x_57 = x_14.time;
  p.y = (x_55 + sin((x_57 + 4.0f)));
  mat4 x_69 = x_14.worldViewProjection;
  vec3 x_70 = p;
  tint_symbol = (x_69 * vec4(x_70.x, x_70.y, x_70.z, 1.0f));
  vUV = uv;
  float x_87 = tint_symbol.y;
  tint_symbol.y = (x_87 * -1.0f);
  return;
}

struct main_out {
  vec4 tint_symbol;
  vec2 vUV_1;
};
struct tint_symbol_3 {
  vec3 position_param;
  vec3 normal_param;
  vec2 uv_param;
};
struct tint_symbol_4 {
  vec2 vUV_1;
  vec4 tint_symbol;
};

main_out tint_symbol_1_inner(vec3 position_param, vec2 uv_param, vec3 normal_param) {
  position = position_param;
  uv = uv_param;
  normal = normal_param;
  main_1();
  main_out tint_symbol_5 = main_out(tint_symbol, vUV);
  return tint_symbol_5;
}

tint_symbol_4 tint_symbol_1(tint_symbol_3 tint_symbol_2) {
  main_out inner_result = tint_symbol_1_inner(tint_symbol_2.position_param, tint_symbol_2.uv_param, tint_symbol_2.normal_param);
  tint_symbol_4 wrapper_result = tint_symbol_4(vec2(0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.tint_symbol = inner_result.tint_symbol;
  wrapper_result.vUV_1 = inner_result.vUV_1;
  return wrapper_result;
}
layout(location = 0) in vec3 position_param;
layout(location = 1) in vec3 normal_param;
layout(location = 2) in vec2 uv_param;
layout(location = 0) out vec2 vUV_1;
void main() {
  tint_symbol_3 inputs;
  inputs.position_param = position_param;
  inputs.normal_param = normal_param;
  inputs.uv_param = uv_param;
  tint_symbol_4 outputs;
  outputs = tint_symbol_1(inputs);
  vUV_1 = outputs.vUV_1;
  gl_Position = outputs.tint_symbol;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}


