← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func pad4(s string) string {
	if len(s) >= 4 {
		return s
	}
	return strings.Repeat("0", 4-len(s)) + s
}

func restore(addr string) string {
	if strings.Contains(addr, "::") {
		parts := strings.SplitN(addr, "::", 2)
		leftStr, rightStr := parts[0], parts[1]

		var left, right []string
		if leftStr != "" {
			left = strings.Split(leftStr, ":")
		}
		if rightStr != "" {
			right = strings.Split(rightStr, ":")
		}

		needZeros := 8 - (len(left) + len(right))
		full := make([]string, 0, 8)
		for _, x := range left {
			full = append(full, pad4(x))
		}
		for i := 0; i < needZeros; i++ {
			full = append(full, "0000")
		}
		for _, x := range right {
			full = append(full, pad4(x))
		}
		return strings.Join(full, ":")
	}

	blocks := strings.Split(addr, ":")
	for i := range blocks {
		blocks[i] = pad4(blocks[i])
	}
	return strings.Join(blocks, ":")
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n int
	fmt.Fscan(in, &n)
	for i := 0; i < n; i++ {
		var s string
		fmt.Fscan(in, &s)
		fmt.Fprintln(out, restore(s))
	}
}
```